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

解決


komin  2007-12-07 18:30:28  No: 28860

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 20:45:21  No: 28861

完全に勘ですが・・・

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

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

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

と思うので

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

あるいは

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

とかではいかないかな?

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


ofZ  2007-12-07 22:37:02  No: 28862

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

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


Ru  2007-12-08 00:02:49  No: 28863

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

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


komin  2007-12-08 00:08:58  No: 28864

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


komin  2007-12-08 00:25:23  No: 28865

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

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


ぴんぽ〜ん  2007-12-08 00:28:07  No: 28866

........
  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 19:48:56  No: 28867

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


こっちは?  2007-12-12 03:55:48  No: 28868

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

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

  ExcelApplication1.Workbooks.Add(KouteiFileName, LOCALE_USER_DEFAULT);


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加