- ベストアンサー
VBAでExcelの保存終了を取得する方法
- Excelの保存終了を取得する方法をご教示ください。
- AccessからExcelへデータを渡し、保存をして終了するプログラムを作成していますが、保存が完了する前に終了メッセージが出てしまいます。
- Excelで保存が完了したという状態を取得する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 >>で、保存して終了で、解放されます。解放されれば、完了したことが確認できます。 >ここでいう解放とは、プログラム上で、どう取得するのでしょうか? 実際にやってみると分かるのですが、 Book.Save '保存している最中は、ここの部分はそのまま Book.Close 'ブックを閉じる '* というように、時系列(上から順に)でマクロが動いているわけです。 つまり、私は、それをまとめて、 Book.Close True 'と保存と、終了を同時にしてしまうのです。 '* つまり、だいたいのマクロの命令というのは、時系列でひとつずつ行われていくわけで、 例えば、* の部分に、 MsgBox "終了", vbInformation などすれば、その終了と、ブックが解放されたことが分かるわけです。 >保存が完了する前に、完了メッセージが出てしまいます。 たぶん、これは、保存は、[メモリ]-> [物理的な媒体]に、別に動いているようですね。 メモリが残っていて、それが働いているので、マクロは素通り出来るのだと思います。 それで、元の質問文のマクロに戻ってみてみると、 book.Save 'メモリ -> 物理的媒体 'この間がない Excel.Quit 'ここで、ロジック自体をみると、Book のオブジェクトは解放されていないのです。 'もちろん、実体はもうありません。 これでも、間違いはないのですが、一旦、ブックをClose してあげるというのが一般的のようです。本当かどうか、ちょっと試してみてください。私は、今回、慣例的なプロシージャの書き方を説明していますので、逆にイレギュラーな方法を試していません。 それと、最後ですが、 多くのVBA教科書をみると、 最初に、オブジェクトを設定したら、 >Set Excel = New Excel.Application >Set book = Excel.Workbooks.Open("c:\Sample.xls") '一時的にデータをためるExcelファイル >Set Sheet = book.Worksheets(1) としたものは、全てが終わった後に、 Set Sheet = Nothing Set book = Nothing Set Excel = Nothing とオブジェクトをナシ(Nothing)にしています。これは、決まった方法ではないのですが、通例のような気がします。この種のマクロを作ったときには、必ず、Windows タスクマネージャー(Ctrl + Alt + Del) でプロセスが残っているかどうか確認してみてください。残っている場合は、本当の解放はされていないことになっています。
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >どういう方法を使えば、Excelの保存完了状態を取得できますでしょうか? Book.Save Book.Close Excel.Quit で、保存して終了で、解放されます。解放されれば、完了したことが確認できます。 (※ Set Excel = New Excel.Application :;;;本来は、変数名はExApp とかしたほうがよいです。) しかし、以下の場合は、 >Access側でExcelファイルのマクロを操作し、Excelのファイルは、Aドライブ(フロッピー)へ保存することとなります。 >保存の際に、非常に時間がかかり、完了時にメッセージを出したいのですが、 >Excel.Run book.Name & "!Macro_Go" 'Sample.xlsからAドライブのExcelファイルへシートコピー ここの中身がどうなっているかは分かりませんが、HDDの中で処理をしておいて、それを、 Set objFso = CreateObject("Scripting.FilesystemObject") objFso.Copyfile コピー元, "A:\" &Book.Name Set objFso = Nothing としたほうが速いです。または、Shell で、コマンドプロンプトのCopyで、A:\にファイルを送ってしまうほうがよいです。ExcelのApplicationで、コピーしたり保存したりすると、FDDですと、かなり遅くなります。
お礼
Wendy02さん、ご回答ありがとうございます。 >で、保存して終了で、解放されます。解放されれば、完了したことが確認できます。 ここでいう解放とは、プログラム上で、どう取得するのでしょうか? >(※ Set Excel = New Excel.Application :;;;本来は、変数名はExApp とかしたほうがよいです。) 命名ルールは、全く考えていませんでした。 この辺りも、意識するようにしてみます。 ソースもありがとうございます。試してみます。 HDDで処理したほうが早いですよね。気付けませんでした。
お礼
お礼が遅くなり申し訳ありません。 結局、結果として、処理のフロー自体を変えて対応しました。 Wendy02さんに教えていただいたので、 >つまり、だいたいのマクロの命令というのは、時系列でひとつずつ行われていくわけで、 >例えば、* の部分に、 >MsgBox "終了", vbInformation > >などすれば、その終了と、ブックが解放されたことが分かるわけです。 という処理も記述してみましたが、処理が終了する前にMsgBoxが出てしまうという結果でした。 今後は、個人的なタスクとして追っかけて行きたいと考えています。 ありがとうございました。