アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんは。

Accessから、Excelへデータを渡し、保存をして終了というものを作っています。
*************Access側
Set Excel = New Excel.Application
Set book = Excel.Workbooks.Open("c:\Sample.xls") '一時的にデータをためるExcelファイル
Set Sheet = book.Worksheets(1)
・・・・・データを吐き出し、書式を変更する処理・・・・・
Excel.Run book.Name & "!Macro_Go" 'Sample.xlsからAドライブのExcelファイルへシートコピー
book.Save
Excel.Quit
*************************

Access側でExcelファイルのマクロを操作し、Excelのファイルは、Aドライブ(フロッピー)へ保存することとなります。
保存の際に、非常に時間がかかり、完了時にメッセージを出したいのですが、
保存が完了する前に、完了メッセージが出てしまいます。

そこで、Excelで保存が完了したという状態を取得できないかと考えています。
どういう方法を使えば、Excelの保存完了状態を取得できますでしょうか?

A 回答 (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) でプロセスが残っているかどうか確認してみてください。残っている場合は、本当の解放はされていないことになっています。
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ありません。
結局、結果として、処理のフロー自体を変えて対応しました。

Wendy02さんに教えていただいたので、
>つまり、だいたいのマクロの命令というのは、時系列でひとつずつ行われていくわけで、
>例えば、* の部分に、
>MsgBox "終了", vbInformation

>などすれば、その終了と、ブックが解放されたことが分かるわけです。
という処理も記述してみましたが、処理が終了する前にMsgBoxが出てしまうという結果でした。

今後は、個人的なタスクとして追っかけて行きたいと考えています。
ありがとうございました。

お礼日時:2007/09/23 11:18

こんばんは。



>どういう方法を使えば、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ですと、かなり遅くなります。
    • good
    • 0
この回答へのお礼

Wendy02さん、ご回答ありがとうございます。

>で、保存して終了で、解放されます。解放されれば、完了したことが確認できます。
ここでいう解放とは、プログラム上で、どう取得するのでしょうか?

>(※ Set Excel = New Excel.Application :;;;本来は、変数名はExApp とかしたほうがよいです。)
命名ルールは、全く考えていませんでした。
この辺りも、意識するようにしてみます。

ソースもありがとうございます。試してみます。
HDDで処理したほうが早いですよね。気付けませんでした。

お礼日時:2007/08/01 18:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A