• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBからExcelクローズ検知)

VBでExcelファイルのクローズ検知方法について

このQ&Aのポイント
  • VBで作成したaaa.exeの中で、エクセルファイルbbb.xls、ccc.xlsを呼び出しています。しかし、ccc.xlsをbbb.xlsの処理完了後に起動したいという問題があります。良い解決方法はありますか?
  • VBで作成したaaa.exeの中で、エクセルファイルbbb.xls、ccc.xlsを呼び出しています。しかし、連続的に起動してしまうため、ccc.xlsはbbb.xlsの処理完了後に起動したいという問題が発生しています。良い解決方法があれば教えてください。
  • VBで作成したaaa.exeの中で、エクセルファイルbbb.xls、ccc.xlsを呼び出していますが、ccc.xlsの起動タイミングをbbb.xlsの処理完了後にする方法をご教示いただけませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。 #1 のご指摘は私もその通りだと思いますが、ご質問にあるとおりやって みました。ただ、Shell の方法は、Excel.exe のパスが Office のバージョン で異なりますので、CreateObject の方が良いと思います。 いろんな方法があると思いますが。。VB6 とかですよね? WaitForSingleObject API で待機させてます。ただし、第1引数で渡すのは ウインドウハンドルです。タスク ID から ウインドウハンドルを得るのは 結構面倒なので、実行開始時に既に起動済み Excel があるか調べ、簡単に FindWindow API でハンドルを取得してます。(手抜き)  # Excel は非表示にしたいようなので、Label に進捗を表示させました Option Explicit Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _     ByVal lpClassName As String, _     ByVal lpWindowName As String) As Long Private Declare Function WaitForSingleObject Lib "kernel32.dll" ( _     ByVal hHandle As Long, _     ByVal dwMilliseconds As Long) As Long Private Const INFINITE As Long = &HFFFF Private Sub Command1_Click()      Dim xlApp As Object ' Excel.Application   Dim xlWbk As Object ' Excel.Workbook   Dim hWnd As Long   Dim lRet As Long      hWnd = FindWindow("XLMAIN", vbNullString)   If hWnd > 0 Then     MsgBox "Excel を終了してから実行して下さい", vbCritical     Exit Sub   End If        Command1.Enabled = False      Label1.Caption = "Create Excel Object"   Set xlApp = CreateObject("Excel.Application")   'xlApp.Visible = True   hWnd = FindWindow("XLMAIN", vbNullString)      Label1.Caption = "Open bbb.xls..."   Set xlWbk = xlApp.Workbooks.Open("C:\bbb.xls")   Call WaitForSingleObject(hWnd, INFINITE)      Label1.Caption = "Open ccc.xls..."   Set xlWbk = xlApp.Workbooks.Open("C:\ccc.xls")   Call WaitForSingleObject(hWnd, INFINITE)   Label1.Caption = "End."   Set xlWbk = Nothing   xlApp.Quit   Set xlApp = Nothing      Command1.Enabled = True End Sub

chiune
質問者

お礼

ご回答ありがとうございます。 うまくできました。 WaitForSingleObjectの使い方だけではなく、書かれたコード全般にわたり大変勉強になりました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

ブックbbbのマクロでClose前に、ブックCCCを開くというマクロは入れられないという前提か。 ーー 自分で作り利用するシステムなら ブックbbbが単目的のものなら入れても良いと思うが。 ーー 何でShellで使って起動するのかな CreateObjectでExcel.Applicationの世界に入ったら、XlApp.などつけて,エクセルVBAで bbbをOpen 処理 Close CCCをOpen 処理 ・・ をする様に、エクセルVBA的世界からとほぼ同じコードがかけるのではないですか。

chiune
質問者

お礼

参考になりました。ありがとうございました。

関連するQ&A