goo blog サービス終了のお知らせ 

半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■Application.DisplayAlerts?

2009-05-22 21:00:00 | 気をつけたほうがいいこと
例えばマクロでシートを削除する時など、Excel既定の警告メッセージを出さないようにする為に Application.DisplayAlertsプロパティを制御する事はよくあります。
通常は
Application.DisplayAlerts = False
Sheets("sheet1").Delete
Application.DisplayAlerts = True
...こんな感じで.DisplayAlerts = False にして、用がなくなったら既定の True に戻したほうが良いです。

最近
Sub auto_open()
  Application.DisplayAlerts = False
End Sub
Sub auto_close()
  Application.DisplayAlerts = True
End Sub
こんなコードを見ましたが、意図としてはBookを開いて閉じるまで.DisplayAlerts = Falseを保持したいという事なのでしょう。
確かに2000のヘルプには
『このプロパティは、False に設定してマクロの実行を終了しても、自動的に True には戻りません。マクロの実行が終了したときは、常にプロパティを True に設定するようにします』
とありますからね。
でも実際にはマクロ終了後、True に戻ります。意図した結果にはなりません。
現在のヘルプはどうでしょう。『DisplayAlerts プロパティ
変更されているようです。

ただし、ちょっとヘンな例外があって、CommandBarControlから呼び出すと、マクロ終了後も True に戻りません。
実験コード。
'標準Module
Option Explicit
'---------------------------------------------------------------------
Sub prep()
  With Sheets.Add
    With .Buttons.Add(10, 10, 100, 30)
      .Caption = "CommandBar作成と実行"
      .OnAction = "barConTest"
    End With
    With .Buttons.Add(10, 50, 100, 30)
      .Caption = "DisplayAlertsの切替"
      .OnAction = "dspAlertTest"
    End With
    With .Buttons.Add(10, 90, 100, 30)
      .Caption = "DisplayAlerts = True"
      .OnAction = "TestReset"
    End With
    With .Buttons.Add(10, 130, 100, 30)
      .Caption = "Msg DisplayAlerts"
      .OnAction = "AlertChk"
    End With
    With .Buttons.Add(150, 10, 100, 30)
      .Caption = "CommandBar撤去"
      .OnAction = "Auto_Close"
    End With
  End With
End Sub
'---------------------------------------------------------------------
Sub barConTest() 'CommandBar作成と実行
  With Application
    On Error Resume Next
    .CommandBars("temporary").Delete
    On Error GoTo 0
    With .CommandBars.Add(Name:="temporary", temporary:=True)
      With .Controls.Add(Type:=msoControlButton)
        .OnAction = "dspAlertTest"
        .Caption = "DisplayAlertsの切替"
        .Style = msoButtonCaption
        .accDoDefaultAction
      End With
      .Visible = True
    End With
  End With
End Sub
'---------------------------------------------------------------------
Sub dspAlertTest() 'DisplayAlertsの切替
  With Application
    .DisplayAlerts = Not .DisplayAlerts
    .OnTime Now, "AlertChk"
  End With
End Sub
'---------------------------------------------------------------------
Sub TestReset() 'DisplayAlerts = True
  With Application
    .DisplayAlerts = True
    AlertChk
    .OnTime Now, "AlertChk"
  End With
End Sub
'---------------------------------------------------------------------
Sub AlertChk() 'Msg DisplayAlerts
  Dim flg As Boolean

  flg = Application.DisplayAlerts
  MsgBox CStr(flg), , "DisplayAlerts"
  'Debug.Print "DisplayAlerts = " & CStr(flg)
End Sub
'---------------------------------------------------------------------
Sub Auto_Close() 'CommandBar撤去
  On Error Resume Next
  Application.CommandBars("temporary").Delete
  On Error GoTo 0
End Sub

Sub prep()を実行すると、Sheetを追加してButtonを5個配置します。いろいろと試してみるのもよいかも。



[CommandBar作成と実行]ボタンを実行した後、[Msg DisplayAlerts]ボタンでDisplayAlertsプロパティの状態を確認できます。
CommandBars("temporary")の[DisplayAlertsの切替]で設定すると、False状態を保持します。
[DisplayAlerts = True]ボタンなどの通常のマクロでは変更できません。
[DisplayAlertsの切替]CommandBarControlはTrue/Falseを可逆的に切り替えるようになっているので、これで解除できます。

その他、解除要件としては
・VBEウィンドウで直接マクロを実行する。
 (どんな内容でもOK。MsgBoxを表示させるだけの簡単なものでも)
・他BookのWindowに切り替える。
など。...簡単に解除されちゃいます。

いずれにしても冒頭に書いたように、必要な箇所だけ制御して、用が済んだら元に戻すようにしたほうが良いという事のようです。

#確認はExcel2000以降のバージョンのみ。

Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■ChartObjects.ChartのTextBo... | TOP | ■Application.InputBoxで他Bo... »
最新の画像もっと見る

Recent Entries | 気をつけたほうがいいこと