Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4748 / 13646 ツリー ←次へ | 前へ→

【54713】BeforeSaveイベントの挙動について ハチ 08/3/27(木) 13:16 発言[未読]
【54715】Re:BeforeSaveイベントの挙動について VBWASURETA 08/3/27(木) 15:41 発言[未読]
【54731】Re:BeforeSaveイベントの挙動について n 08/3/27(木) 21:46 発言[未読]
【54739】Re:BeforeSaveイベントの挙動について VBWASURETA 08/3/28(金) 9:17 発言[未読]
【54740】Re:BeforeSaveイベントの挙動について VBWASURETA 08/3/28(金) 9:24 発言[未読]

【54713】BeforeSaveイベントの挙動について
発言  ハチ  - 08/3/27(木) 13:16 -

引用なし
パスワード
   >VBWASURETAさん

【54702】のレスの中で.Saveについてのコメントを頂きましたので、
ひさしぶりに思いだしてみました。
あちらにつなげると混乱しそうでしたので、別トピックで書きました。

元トピック
www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=41354;id=excel

Workbook_BeforeSaveイベントは、
手動で保存した場合と、マクロから.Saveした場合では、
挙動が違いそうという話です。

そのときにレスを頂いていた方々とは、
「動かないものは、仕方ない」で納得しました。
今でもそんなもんだろう と思ってます。

簡単なサンプルとしては、以下の通りです。
手動で保存 Testを実行しての保存で挙動の違いを確認してみてください。
環境:Win2k,Excel2k

'標準モジュール
Sub Test()
'何らかの処理
'・・・・
ThisWorkbook.Save
End Sub

'ThisWorkbookモジュール
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Dim bk_Name As String
  With Worksheets(1)
    .Range("A1").Value = .Range("A1").Value + 1
    bk_Name = "bak_" & .Range("A1").Value
    Debug.Print bk_Name '確認用
    
    .Copy After:=Worksheets(Worksheets.Count)
    Worksheets(Worksheets.Count).Name = bk_Name
    .Activate
  End With
End Sub

【54715】Re:BeforeSaveイベントの挙動について
発言  VBWASURETA  - 08/3/27(木) 15:41 -

引用なし
パスワード
   こんにちは。

なるほど。確かに保存イベントとしてはマクロ、手動共に発生はしていますが
シート処理で時間が掛かる?Excelが管理に不具合が起き得る?
処理に対して動作しない違いがあるわけですね。


マクロと手動の違いで内部的に動作しないものがあるようなイメージでしょうか。
手動だと変更箇所がわかり元に戻せますよね?
ただマクロだと変更箇所がわかりませんし元に戻せない動きの違いがありますから
そこを追いかければもしかすると解決なのでしょうかね?^^;

【54731】Re:BeforeSaveイベントの挙動について
発言  n  - 08/3/27(木) 21:46 -

引用なし
パスワード
   こんにちは。
検索してたら
『Excel でプログラムでブックを保存すると、メニュー コマンドが BeforeSave イベントで実行されません。』
://support.microsoft.com/kb/898511/ja
が出てました。
ハチさんの元スレッドの後(?)みたいですけど。

>コードでメニュー コマンドを入れ子とすることができない
とありますね。
CommandBars.FindControl(ID:=3).Execute
...はOK。これは手動操作のエミュレートみたいなもんだからですかね。

【54739】Re:BeforeSaveイベントの挙動について
発言  VBWASURETA  - 08/3/28(金) 9:17 -

引用なし
パスワード
   ▼n さん:
おはようございます。


>『Excel でプログラムでブックを保存すると、メニュー コマンドが BeforeSave イベントで実行されません。』
あれ?
ブレークを貼って試してみたのですけど、
発生してましたが・・・


>>コードでメニュー コマンドを入れ子とすることができない
>とありますね。
>CommandBars.FindControl(ID:=3).Execute
>...はOK。これは手動操作のエミュレートみたいなもんだからですかね。
なるほど。
ということはSaveではなく、そちらから保存を呼び出せば手動での
保存イベントが発行されて正しい動作がなされるわけですよね?

【54740】Re:BeforeSaveイベントの挙動について
発言  VBWASURETA  - 08/3/28(金) 9:24 -

引用なし
パスワード
   ちょっとnさんの回答とハチさんのソースを組み合わせてやってみました。
動作としてはOKでした。


サンプルソース例:

'ThisWorkbookモジュール
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Dim bk_Name As String
  With Worksheets(1)
    .Range("A1").Value = .Range("A1").Value + 1
    bk_Name = "bak_" & .Range("A1").Value
    Debug.Print bk_Name '確認用
  
    .Copy After:=Worksheets(Worksheets.Count)
    Worksheets(Worksheets.Count).Name = bk_Name
    .Activate
  End With
End Sub


'標準モジュール
Sub SaveEvents()
  '保存時はこの関数を呼ぶ
  CommandBars.FindControl(ID:=3).Execute
End Sub

4748 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free