喫茶XRAYトップページ

[スレッド全体
]

[8153] DelphiからExcelファイルを開いたときのダイアログについて返信 削除
2014/10/30 (木) 11:51:50 Naga
日ごろは齋藤さんのホームページ「Mr.XRAY」に助けられ非常に感謝しています。

当方 Delphi でプログラムを開発してきましたが、Delphi6 で作成したプログラムで問題を解決したく
助言をいただけ無いかと書き込みました。

バッチ処理のプログラム(delphi6)から Excelのフォームを開く時に、そのパソコンが Excel2003のため、
「.xlsx」のファイルを読み込もうとしたときに、「このファイルは新しいバージョンの Microsoft Excel で
作成されたものです。このファイルを作業可能にするために、互換パックをダウンロードしますか?」の
メッセージがで出て止まっていしまいます。
対象のファイルをスキップさせたいのですが、例外処理(try)を入れても判定できません。
ダイアログが出るということは何かしら不具合があるとの判断で、何らかのダイアログが出た時(出るとき?)の
イベントを検知し回避する方法をとりたいと考えています。対処方法を、ご存知でしたら教えていただけないでしょうか?

    //Excel 起動
    Excel    := CreateOleObject('Excel.Application');

    //Excel OPEN
    WorkBook := Excel.WorkBooks.Open(ReadFolder_Str + '\' + Rec.Name); ←ここ

以上、よろしくお願いします。


[8154] Re:DelphiからExcelファイルを開いたときのダイアログについて返信 削除
2014/10/30 (木) 13:40:41 Mr.XRAY
▼ Nagaさん

> 対象のファイルをスキップさせたいのですが、例外処理(try)を入れても判定

これは Delphi が出している,いわゆる「例外」と違いますね.
スキップさせるとしたら,拡張子名で判定するとか,ですか...
今思いつくのはそのぐらいです.
後で,またちょっと調べてみます.


[8157] Re2:DelphiからExcelファイルを開いたときのダイアログについて返信 削除
2014/10/31 (金) 09:06:48 Naga
▼ Mr.XRAYさん

確認ありがとうございます。

> これは Delphi が出している,いわゆる「例外」と違いますね.

Webでいろいろ調べたのですが「ウインドウのコンテキストが・・・」とか
あって関係あるかと思ったのですが、残念ながら当方はそこまでの知識が
無くて読み取れませんでした orz

> スキップさせるとしたら,拡張子名で判定するとか,ですか...

自分も拡張子で制御を提案したのですが却下されました...
(今度ファイル形式が変わったときの拡張子が何かわからないからとか・・・)

このプログラムで処理可能な拡張子をパラメータ化すれば問題ないと
思うのですが...(多勢に無勢で負けました・・・)

> 後で,またちょっと調べてみます.

よろしくお願いいたします。


[8158] Re3:DelphiからExcelファイルを開いたときのダイアログについて返信 削除
2014/10/31 (金) 17:57:14 Mr.XRAY
▼ Nagaさん

> 自分も拡張子で制御を提案したのですが却下されました...
> (今度ファイル形式が変わったときの拡張子が何かわからないからとか・・・)


というより,新しいバージョンを導入した時に,その新しいバージョンの
ファイルが扱えなる可能性の問題ではないかと.

完全な回避策はないと思います.
考えられる方法としては,次のようなものでしょうか.

(方法 1 )
将来のことを考慮して,ダイアログをスキップしないで導入する
http://support.microsoft.com/kb/919026/ja

(方法 2)
エクセルのバージョンと拡張子の条件によってダイアログを表示しないようにする
そうすれば,Excel 2007 以降のエクセルを導入してもアプリはそのまま使用可能となる
当然,判定には Excel 2007 以降の拡張子名を使用しないようにする
古いエクセルのブックの拡張子名は確実に既知なので,問題はない,と思う
  ExcelObj.DisplayAlerts := False;
にすれば,警告関係のダイアログは一切現れなくなる

  if (ExcelObj.Version <= 11.0) and (FileExt = '.xls') then begin
                                     ^^^^^^^^^^^^^^^^^
                                     この部分は必要に応じて変更
    //開いてもいいよん
  end else
  if (ExcelObj.Version > 11.0) then begin
    //開いてもいいよん
  end else begin
    //ダメ!! ダメよ! ダメ!
  end;
等...
もちろん,この方法でも,更に新しい拡張子を扱うバージョンが現れると
対応コードを追加する必要があります.

(方法 3)
ダイアログの表示をフックして,表示開始前に終了させてしまう.
そのダイアログは,エクセルが表示しています.
エクセルは別アプリです.
したがって,グロバールフックということになります.
Excel 2007 以上では,そのダイアログは現れないので,このあたりも工夫が必要です.
これらの警告ダイアログのクラス名は全て #32770 です.
ダイアログのタイトルには必ず Microsoft Excel があります.

もちろん,この方法でも,更に新しいバージョンが現れると,
どんなダイアログが使われるかは予想できません.

http://mrxray.on.coocan.jp/Delphi/plSamples/270_HookCBTCreate.htm
http://mrxray.on.coocan.jp/Delphi/plSamples/280_HookCBTActivate.htm
等...

-----------  方法の説明終り -------------------------------

結果:
未来は予測,予想できない.ということになります.



[8165] Re4:DelphiからExcelファイルを開いたときのダイアログについて返信 削除
2014/10/31 (金) 23:20:18 Mr.XRAY
「互換パックをダウンロード」のダイアログがエラーで表示されるのであれば,
対処方法もあるんですけどね.
残念ながらエラーでないですからね.


[8168] Re5:DelphiからExcelファイルを開いたときのダイアログについて返信 削除
2014/11/1 (土) 23:22:42 Mr.XRAY
作ってみました.
Excel 2007 以降の環境の方には関係ないテストプログラムです

http://mrxray.on.coocan.jp/Delphi/zip/Excel_DialogHook_Test.zip

[04_ExcelDialogHook_ShellExecute] 内の OtherAppHook_ShellExecute.exe
を実行してみてください.
これは,フォルダ内の Test.xlsx を読み込んで表示するものです.
結果によって,詳しい説明をしたいと思います.

当方のバーチャルマシンの Windows XP に Excel 2003 が入ってしました.
テスト結果の図です.


[8175] Re6:DelphiからExcelファイルを開いたときのダイアログについて返信 削除
2014/11/4 (火) 10:33:38 Naga
▼ Mr.XRAYさん

確認ありがとうございます。本当に感謝しています。

これから試させてもらいます。
方向が決まったらまた報告します。

よろしくお願いします。


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82