こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBからExcelクローズ検知

VBで作成したaaa.exeの中でエクセルファイルbbb.xls、ccc.xlsを呼び出しています。

taskIdB = Shell("C:\Program Files\Microsoft Office\Office10\excel.exe C:\bbb.xls", vbHide)
taskIdC = Shell("C:\Program Files\Microsoft Office\Office10\excel.exe C:\ccc.xls", vbHide)

bbb.xls、ccc.xlsともにWorkbook_Openイベントで自動的にVBAが起動し、処理が終了すると自分自身を
クローズするようになっています。

ここで問題になるのが、ccc.xls は bbb.xlsの処理完了を待ってから起動したいのですが、連続的に起動してしまう点です。
aaa.exeのなかで、bbb.xlsの終了を検知するなど、良い解決方法があればお教え下さい。

WindowsはXp pro.、VBは6.0、Excelは2002を使用しています。

よろしくお願いいたします。

投稿日時 - 2008-03-29 08:54:48

QNo.3904061

困ってます

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

こんにちは。

#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

投稿日時 - 2008-03-30 10:28:53

お礼

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

投稿日時 - 2008-04-01 08:43:39

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2008-03-29 09:44:26

お礼

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

投稿日時 - 2008-04-01 08:40:46

あなたにオススメの質問