ふたつのExcelファイルを制御するには?

解決


komin  2007-12-07 09:30:28  No: 28860  IP: 192.*.*.*

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);

  として二つめのワークブックをオープンしたいのです。
  ところが、この二つを一つのボタンのイベントとして連続実行すると、一つめがクローズする前に二つめが開いてしまい、「インデックスが無効です」というエラーになってしまいます。
  ところが、この二つをそれぞれ別のボタンのイベントとして定義してやるとそれぞれ正常に動きます。思うに、一つめの終了を監視したらうまくいくのでは、と考えています。何か適当な方法はありませんか?

編集 削除
KHE00221  2007-12-07 11:45:21  No: 28861  IP: 192.*.*.*

完全に勘ですが・・・

ボタンを分けると行くということは

Button1 の処理が終わりメッセージが処理されているのでButton2で処理できる

Button1終了後 Button2 を押す時間までの間に Excelapplication1.Quit が終わっている

と思うので

 Excelapplication1.Quit;
 Application.ProcessMessages;
 ExcelApplication2.Connect;

あるいは

 Excelapplication1.Quit;
 Sleep(1000)  //1秒待つ
 ExcelApplication2.Connect;

とかではいかないかな?

何か判定方法ありそうだけど・・・・

編集 削除
ofZ  2007-12-07 13:37:02  No: 28862  IP: 192.*.*.*

ExcelWorkSheet1.Disconnect;  //追加
  ExcelWorkBook1.Disconnect;  //追加
>  Excelapplication1.Quit;
   //↓↑順番入れ替え
>  Excelapplication1.Disconnect;

・・・関係ないかな・・・

編集 削除
Ru  2007-12-07 15:02:49  No: 28863  IP: 192.*.*.*

Excelのプロセスが残っていると無限ループ突入しちゃいますが・・・

  while FindWindow('XLMAIN', nil) > 0 do
  begin
    Sleep(10);
    Application.ProcessMessages;
  end;

編集 削除
komin  2007-12-07 15:08:58  No: 28864  IP: 192.*.*.*

Sleepを入れる方法はすでに試しましたがだめでした。
  Application.ProcessMessageでやってみます。

編集 削除
komin  2007-12-07 15:25:23  No: 28865  IP: 192.*.*.*

ExcelWorkSheet1.Disconnect;  //追加
  ExcelWorkBook1.Disconnect;  //追加
  Application.Processmessages

  これでうまくいきそうです。引き続きやってみてまた報告しますね。

編集 削除
ぴんぽ〜ん  2007-12-07 15:28:07  No: 28866  IP: 192.*.*.*

........
  ExcelWorkSheet1.Disconnect;
  ExcelWorkbook1.Close(False, EmptyParam, False, LOCALE_SYSTEM_DEFAULT);  // LOCALE_SYSTEM_DEFAULTは 0でも代用可能
  ExcelWorkbook1.Disconnect;
  Excelapplication1.Disconnect;
  Excelapplication1.Quit;

  ExcelApplication1.Connect;  // 再利用 (別のExcelApplication2を使わなくても...)
  ........

編集 削除
komin  2007-12-11 10:48:56  No: 28867  IP: 192.*.*.*

皆さんのおかげで思いどおりの動作を得ることができました。ありがとうございました。

編集 削除
こっちは?  2007-12-11 18:55:48  No: 28868  IP: 192.*.*.*

>を実行して一つめのワークブックをオープンしてデータを抽出する作業を行います。それが終わったら、
>  Excelapplication1.Disconnect;
>  Excelapplication1.Quit;
>  で、一つめを終了させます。さらに
>  ExcelApplication2.Connect;
>  ExcelApplication2.Visible[0] := true;

一つめを切断も終了もしないで、もう一つのワークブックをオープンする。(最初のコンポで)

  ExcelApplication1.Workbooks.Add(KouteiFileName, LOCALE_USER_DEFAULT);

編集 削除