- ベストアンサー
VBでExcelファイルのクローズ検知方法について
- 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の処理完了後にする方法をご教示いただけませんか?
- みんなの回答 (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
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
ブックbbbのマクロでClose前に、ブックCCCを開くというマクロは入れられないという前提か。 ーー 自分で作り利用するシステムなら ブックbbbが単目的のものなら入れても良いと思うが。 ーー 何でShellで使って起動するのかな CreateObjectでExcel.Applicationの世界に入ったら、XlApp.などつけて,エクセルVBAで bbbをOpen 処理 Close CCCをOpen 処理 ・・ をする様に、エクセルVBA的世界からとほぼ同じコードがかけるのではないですか。
お礼
参考になりました。ありがとうございました。
お礼
ご回答ありがとうございます。 うまくできました。 WaitForSingleObjectの使い方だけではなく、書かれたコード全般にわたり大変勉強になりました。