• ベストアンサー
  • 困ってます

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を使用しています。 よろしくお願いいたします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数628
  • ありがとう数3

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

  • ベストアンサー
  • 回答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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • VBからExcelが起動しません

    Excelファイルを開くプログラムをVBで作成したのですが 1つのパソコンだけ実行時エラー5が発生してExcelを起動できません どなたかお助けください プログラムはこんなかんじです WKPATH = "D:\Program Files\Microsoft Office\Office\EXCEL.EXE " & " c:\a.xls" exl = Shell(WKPATH, 1) ちなみにエラーが発生するパソコンはNT4.0sp6です

  • EXCELをもう一つ立ち上げたい

    マクロを使用して sub 関数1 shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE", 1 end sub と記述すれば EXCELがもう一つたちあがります。 また、 sub 関数2 Workbooks.Open FileName:="C:\MyDocuments\aa.xls" end sub と記述すればMyDocments配下のaa.xls というファイルがたちあがります。 そこで、ここから本題なのですが、 aa.xlsというEXCELファイルをもう一つのEXCELに立ちげる方法を教えて頂けませんでしょうか? よろしくお願いします。

  • EXCEL2000と2003の共存について

    特定のファイルだけEXCEL2000で起動し、その他のEXCELのファイルはEXCEL2003で起動したいと思います。 EXCEL2000とEXCEL2003はそれぞれC:\Program Files\Microsoft Office 2000\OfficeとC:\Program Files\Microsoft Office 2003\Officeにインストールされています。 ショートカットをダブルクリックするとEXCEL2003で起動できるのですが、特定のファイルはEXCEL2003で起動されると困るので、バッチファイルを作りました。 cd C:\Program Files\Microsoft Office 2000\Office EXCEL.EXE C:\EXCEL\AAA.XLS これだとEXCEL2000で起動されるのですが、DOSの窓が終了しないので困っています。 何か対処方法はないでしょうか? よろしくお願いします。

その他の回答 (1)

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • Access2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。

    Access2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。 以下のように、shell関数で、既存のExcelファイルを起動させました。 どうすれば、Excelファイルを終了できますか? 宜しくお願いします。 Dim fl_name As String fl_name = "C:\XE2.xls" Shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE " & fl_name, vbNormalFocus

  • ACCESSからEXCEL起動時、パス名は短い名前でないといけないの?

    ACCESS2003からEXCEL2003をVBAで起動するコードを書いてます。 SetApplName = "c:\Program Files\Microsoft Office\office11\excel.exe /r c:\docume~1\alluse~1\docume~1\毎日の数字.xls" Call Shell(SetApplName, 1) のように指定していますが、いちいち短い名前を指定しないと いけないようで、面倒で困っています。 長いパス名を短いパス名に変換するような関数等はありませんか? 他にもっと簡便な方法があればあわせてご教示ください。

  • コマンドプロンプトで一度に複数のプログラムを立ち上げたいのですが、

    コマンドプロンプトで一度に複数のプログラムを立ち上げたいのですが、 "C:\Program Files\Microsoft Office\Office\EXCEL.EXE" "C:\Program Files\Microsoft Office\Office\WINWORD.EXE" のように書いて.batに変更して起動させても、エクセルだけが立ち上がりワードは立ち上がりません。 エクセルを終了させた後にワードが立ち上がります。 全てが同時に立ち上がるようにしたいのですが、良い方法はないでしょうか。 OSはウィンドウズ XPです。 よろしくお願いします。

  • AppActivateの使い方

    現在開いているエクセルファイルをアクティブにしたいです。 バージョンは2003です。 アクセスVBAから Sub test() Dim rc As Long rc = Shell("C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE", 1) AppActivate "aaa.xls" End Sub を実行すると、 新規にアプリケーションが開いて、空のBOOK1が表示されます。 本当は、aaa.xlsをアクティブにしたいのですがうまく出来ません。 aaa.xlsは既に開いている状態です。 aaa.xlsはデスクトップにあります。 http://officetanaka.net/excel/vba/statement/AppActivate.htm を見ながらやってみたのですがうまく出来ません。 新たなアプリケーションは立ち上げたくないけど aaa.xlsはアクティブにしたいです。

  • Accessのマクロについて教えてください。

    WinXP Access2002です。 現在Accessのあるフォームにコマンドボタンを貼り付けこのボタンをクリック時にマクロでアプリケーションの実行を指定しExcelのファイルを開いています。具体的には c:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE10\EXCEL.EXE D:\EXCEL\AAAY\BBB.XLS です。D:\以下はExcelで作ったファイルの格納場所です。現在これでうまくいっています。 この場合BBB.xlsしか立ちあがりません。これはこれでBBB.xlsだけで用が足りているので何ら問題ないのですがやろうとしていることは¥AAAのホルダーに入っている複数のCCC.xls、DDD.xls・・・・・・等をマクロの途中ダイアログボックス等で仮に今ほしいファイルがXXX.XLSだったとしたら目的のXXX.xlsを指定し開く方法がありますでしょうか。 又これが駄目ならマクロで¥AAAのホルダーまで開く方法はあるのでしょうか。何せAccessのマクロでExcelは立ちあがりますが沢山のホルダーがあるので一歩でも自動で近づきたいのです。方法がありましたらよろしく教えてください。

  • コマンドプロンプトについて

    バッチファイルで自動でエクセル起動して何秒後に終了、次のファイル起動・・・・ としたいのですがわかりません。 宜しくお願い致します。 @echo off "C:\Program Files (x86)\Microsoft Office\OFFICE11\excel.exe" "d:\2.xls" timer 10 SET PID= for /F "usebackqtokens=2" %%i in (`tasklist /nh /fi "Imagename eq excel.exe"`) do SET PID=%%i IF defined PID ( taskkill /PID %PID% ) "C:\Program Files (x86)\Microsoft Office\OFFICE11\excel.exe" "d:\3.xls" これをXPとWIN7で動かしたい。

  • Dosのバッチをマクロにしたい

     以下の内容のDosバッチファイルがあるのですが、これをマクロ化してどのPCでも使えるようにしたいと思います。どのように書けば良いのかご指導ください。  DOS.batの内容は、概ね以下の通りです。 del I:\AAA\BBB\*.xls 'ワークブックの削除 D: cd D:\Program Files\Microsoft Office\Office\ MSACCESS.EXE    'ACCESSの立ち上げ I:\CCC\DDD\EEE.mdb 'EEE.mdbを開く(データベースの修正作業)  'これが終了したら(右上の×をクリックすると)次へ EXCEL.EXE      'Excelの立ち上げ I:\FFF\GGG\HHH.xls 'HHH.xlsを開く 'auto_openマクロが走る(終了すると) EXCEL.EXE       'Excelの立ち上げ(これは無駄?) I:\JJJ\KKK\LLL.xls 'HHH.xlsを開く 'auto_openマクロが走る '以下excelのマクロをいくつか走らせます。  よろしくお願いします。

  • Microsoft Officeについて

    今日、友人とMicrosoft Officeについて話していて疑問に 思ったことがあったので、自分でネットで調べてみたんですが、 よくわからなかったので、ここに質問を挙げさせていただきます。 どなたか知ってる方がいましたら、ご教示願います。 その内容とはC:\Program FilesにあるMicrosoft Officeのフォルダを USBやDVD-Rなどの媒体にコピー出来るのかという話です。 具体的に例を示しますと、 例えば、Excel2003を使ってaaa.xlsファイルを作成します。 (マクロなどを使ったりせず、ただの表が書いてあるだけの  ファイルです。保存場所は仮にデスクトップとします。) その後、C:\Program Files\にあるMicrosoft Officeのフォルダを 削除し、再びaaa.xlsファイルを開こうと思っても Excelのexeファイル等が無いため、「このファイルを開けません」という ポップアップが出ると思います。 この時、OSもMicrosoft Officeもバージョンが同一なPCから Microsoft Officeをコピーして、削除したPCのC:\Program Files\に コピーしたMicrosoft Officeを再び入れれば aaa.xlsは見ることができるのか?という疑問です。 大変わかりにくい質問で申し訳ありませんが、要は Microsoft Officeフォルダを削除した場合、 他のPCからMicrosoft Officeフォルダを 移植することは可能なのかが知りたいのです。 (ダウンロードやPC付属のCD-Rは使用せず、仮にコピーが出来る 前提であれば、媒体のサイズはMicrosoft Officeフォルダのサイズ 以上のものとします。) 長文、駄文で申し訳ありませんが、 どなたか知っている方がいましたら教えていただけると嬉しいです。 最後に長い文章を読んでいただき、ありがとうございました。

  • エクセルのフルパスをvbaで取得

    当方エクセル2003で、 エクセルのフルパスは C:\Program Files\Microsoft Office\OFFICE11\ EXCEL.EXE です。 それをVBAで取得するにはどうすればいいですか? Sub サンプル() Debug.Print 'オフィスがインストールされているフォルダのパスの取得 End Sub のようにして、 C:\Program Files\Microsoft Office\OFFICE11\ EXCEL.EXE を返したいです。 VBAコードをご教示ください。

  • バッチファイル エクセル起動

    いつも大変御世話になっております。 WindowsVISTA環境で以下バッチ【ABC.bat】が稼動します。 "ABC.bat"------------------------------------------------- "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" "F:\EXCEL_OPEN\ABC.xls" echo %ERRORLEVEL% pause "ABC.bat"------------------------------------------------- 上記バッチの構文について3点質問があります。 (1)OS等が変わった場合、EXCEL.EXEの格納パスも変更するので   当然変更しなければいけないのでしょうか? (2)上記バッチを起動する前に他のエクセルを開いていた場合(例えばDEF.xls)、  ABC.xlsとDEF.xlsを両方閉じなければバッチの後続処理が動きません。  ABC.xlsだけ閉じてバッチの後続処理を動かす事は可能なのでしょうか? (3)上記構文でエクセル(マクロ)からエラーレベルを取得できるのでしょうか?  ※上記バッチで開くエクセルは開いたら自動でマクロが動きます。 もしご存知の方がいらっしゃるようでしたら、ご教授願いますでしょうか? 以上、何卒宜しくお願い致します。