Serverコンポーネンツを利用して、二つのExcelファイルを比較しようとしています。まず、
ExcelApplication1.Connect;
ExcelApplication1.Visible[0] := true;
ExcelApplication1.Workbooks.Open(TankaFileName,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
0);
ExcelWorkBook1.ConnectTo(ExcelApplication1.Workbooks.Item[1]);
ExcelWorkSheet1.ConnectTo(
ExcelWorkBook1.Worksheets['発注単価'] as _Worksheet);
を実行して一つめのワークブックをオープンしてデータを抽出する作業を行います。それが終わったら、
Excelapplication1.Disconnect;
Excelapplication1.Quit;
で、一つめを終了させます。さらに
ExcelApplication2.Connect;
ExcelApplication2.Visible[0] := true;
ExcelApplication2.Workbooks.Open(KouteiFileName,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
EmptyParam,
0);
ExcelWorkBook2.ConnectTo(ExcelApplication2.Workbooks.Item[1]);
ExcelWorkSheet2.ConnectTo(
ExcelWorkBook2.Worksheets['未出荷'] as _Worksheet);
として二つめのワークブックをオープンしたいのです。
ところが、この二つを一つのボタンのイベントとして連続実行すると、一つめがクローズする前に二つめが開いてしまい、「インデックスが無効です」というエラーになってしまいます。
ところが、この二つをそれぞれ別のボタンのイベントとして定義してやるとそれぞれ正常に動きます。思うに、一つめの終了を監視したらうまくいくのでは、と考えています。何か適当な方法はありませんか?
完全に勘ですが・・・
ボタンを分けると行くということは
Button1 の処理が終わりメッセージが処理されているのでButton2で処理できる
Button1終了後 Button2 を押す時間までの間に Excelapplication1.Quit が終わっている
と思うので
Excelapplication1.Quit;
Application.ProcessMessages;
ExcelApplication2.Connect;
あるいは
Excelapplication1.Quit;
Sleep(1000) //1秒待つ
ExcelApplication2.Connect;
とかではいかないかな?
何か判定方法ありそうだけど・・・・
ExcelWorkSheet1.Disconnect; //追加
ExcelWorkBook1.Disconnect; //追加
> Excelapplication1.Quit;
//↓↑順番入れ替え
> Excelapplication1.Disconnect;
・・・関係ないかな・・・
Excelのプロセスが残っていると無限ループ突入しちゃいますが・・・
while FindWindow('XLMAIN', nil) > 0 do
begin
Sleep(10);
Application.ProcessMessages;
end;
Sleepを入れる方法はすでに試しましたがだめでした。
Application.ProcessMessageでやってみます。
ExcelWorkSheet1.Disconnect; //追加
ExcelWorkBook1.Disconnect; //追加
Application.Processmessages
これでうまくいきそうです。引き続きやってみてまた報告しますね。
........
ExcelWorkSheet1.Disconnect;
ExcelWorkbook1.Close(False, EmptyParam, False, LOCALE_SYSTEM_DEFAULT); // LOCALE_SYSTEM_DEFAULTは 0でも代用可能
ExcelWorkbook1.Disconnect;
Excelapplication1.Disconnect;
Excelapplication1.Quit;
ExcelApplication1.Connect; // 再利用 (別のExcelApplication2を使わなくても...)
........
皆さんのおかげで思いどおりの動作を得ることができました。ありがとうございました。
>を実行して一つめのワークブックをオープンしてデータを抽出する作業を行います。それが終わったら、
> Excelapplication1.Disconnect;
> Excelapplication1.Quit;
> で、一つめを終了させます。さらに
> ExcelApplication2.Connect;
> ExcelApplication2.Visible[0] := true;
一つめを切断も終了もしないで、もう一つのワークブックをオープンする。(最初のコンポで)
ExcelApplication1.Workbooks.Add(KouteiFileName, LOCALE_USER_DEFAULT);
ツイート | ![]() |