- ベストアンサー
VBからEXCELを起動する
VBよりExcelを起動するプログラムで困っています。 1.VBよりGetObject関数でTest.xlsを開く 2.Test.xls内のAuto_Openマクロでパラメータファイルをよみ、そこに指定されているエクセルファイルを新しいブックでを開く ということをしたいのですが(「マクロを有効にする」のダイアログは表示されてもかまわないです)、何故かTest.xlsが開いたと思ったらすぐ閉じてしまいます(Excel自体は終了してないですべてのワークシートが閉じた状態)。 Auto_Openマクロは走ってるようなのですが、ついでにCloseマクロも走ってしまいます。 ちなみにTest.xlsを単体で動かしたときは問題なく動くのです・・・。 以前はVB4+Excel95の環境でAPI(CreateProcess)を使用し同作業を行っていたのですが、そのAPIが長いファイル名のスペース(OFFICEがある「Program File」のスペース)を認識しないそうで、この方法が使えないということでGetObjectを使用してみたのですが・・・。 何か根本的な間違いをしているのか、それともコードにエラーがあるのかさっぱりわからずお手上げです。 うまく疑問点を説明できているか不安なんですが、わかる方、どうかご指導願います。 よろしくお願いします。 ---------------------------------------- OSは、Windows 2000 アプリケーションは、Excel 2000 です ----------------------------------------
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
VBAからのワークブックのOpenでは、Auto_Openマクロは、動作しませんよ。ThisWorkbookのWorkbook_Open()イベントは、起動しますから、処理をこちらに変えるか、Runメソッドでマクロを実行させましょう。 Runの例です。 Dim objExl As Excel.Application Dim objBook As Workbook Set objExl = CreateObject("Excel.Application") Set objBook = objExl.Workbooks.Open("開きたいブックのフルパス名") objExl.Run "Auto_Open" objBook.Close savechanges:=False set objBook = Nothing objExl.quit Set objExl = Nothing
その他の回答 (3)
- mnabe
- ベストアンサー率33% (427/1283)
補足から... それでは、そのサブルーチンが終了した時点で、objが破棄されるので、Excelが消えてなくなります。 消えるのが正しい動作ですが...これを繰返すと、メモリが残されるので、あまり良いとは思えません。 使ったオブジェクトは解放した方が良いでしょう。 それから...ね。 GetShortPathName APIを使用すれば、長いファイル名→短いファイル名 の変換が出来ます。
お礼
御礼が遅くなり申し訳ありません。 解決しました。 メモリを解放する・・・という点も留意してコーディングできました。ありがとうございました。
- LAVENDERNY
- ベストアンサー率0% (0/2)
いつも使っているのは次のような手順です。 1.メニューのプロジェクト→参照設定で Microsoft EXCEL Object Libraly を選択する。 これはチェックを入れて選択します。 2.General宣言のところで Public appEXCEL as Excel.Application Public wbTest as Excel.Workbook を宣言する。 3.ブックを読みたい所で Set appEXCEL = GetObject("Excel.Application") Set wbTest = appEXCEL.Workbooks.Open(App.path & "¥Test.xls") のようにしてできないでしょうか? 私だったら、ブックを開いてパラメータファイルを読む所は、Auto_Openマクロにやらせないで、VBの中で 自力で読むと思います。
お礼
今回は処理と仕様が煩雑な為VBからファイルを読む処理ができなかったので・・・。 アドバイスありがとうございました。おかげさまで解決しました。
- mnabe
- ベストアンサー率33% (427/1283)
その部分だけもいいので、ソースを補足して下さい。 ちなみに私は、ShellExecuteEx をつかって、拡張子に関連づけされているアプリケーションを起動する様にしています。 以下にVCでかいた時のソースを載せます。これをVBでやれば、xlsが開きます。 -----一部抜粋 lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); lpExecInfo.fMask = 0; lpExecInfo.hwnd = m_hWnd; // 自分のハンドル lpExecInfo.lpDirectory = NULL; lpExecInfo.lpFile = sFileName; // ファイル名 lpExecInfo.lpVerb = NULL; lpExecInfo.nShow = 1; lpExecInfo.lpParameters = NULL; lpExecInfo.hInstApp = 0; ShellExecuteEx(&lpExecInfo); -----ここまで
補足
早速のお答えありがとうございます。 VBのコードは以下のようになっています。 Sub Excel_Open dim obj as object set obj = GetObject(c:\Test.xls) obj.visible = True End Sub
お礼
御礼が遅くなり申し訳ありません。 解決しました。ありがとうございました。