半角チルダ

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のTextBoxes.Formulaと名前定義

2009-05-09 22:30:00 | 気をつけたほうがいいこと
ちょっと前のQ&Aです。

テキストボックスのセル参照について - 教えて!goo

テキストボックスとは、オートシェイプのテキストボックスの事です。
シート上の配置ではなく、チャートエリア内に作成するテキストボックスのケースで、
Formulaプロパティにセルへのリンクを設定する時に[名前定義]を使ってリンクする場合は、ちょっと気をつけたほうが良いかもしれないというお話。

定義した名前が "test" という名前の時、数式を単純に "=test" としただけではBook保存時にリンクが保持されないようです。
Book名から指定する必要があります。

簡単な検証コード。
Option Explicit

Sub try()
  'ThisWorkbookにSheetを追加し、TextBoxやChartObjectを配置。
  Dim s As String

  With Sheets.Add
    s = .Name
    With .Range("A1")
      .Name = "test"
      .Value = 1
    End With

    With .TextBoxes.Add(100, 50, 20, 20)
      .Border.ColorIndex = 0
      .Formula = "=" & s & "!A1"
    End With
    With .TextBoxes.Add(130, 50, 20, 20)
      .Border.ColorIndex = 0
      .Formula = "=test"
    End With
    With .TextBoxes.Add(160, 50, 20, 20)
      .Border.ColorIndex = 0
      .Formula = "=" & ThisWorkbook.Name & "!test"
    End With

    With .ChartObjects.Add(100, 100, 100, 50).Chart
      With .TextBoxes.Add(0, 0, 20, 20)
        .Border.ColorIndex = 0
        .Formula = "=" & s & "!A1"
      End With
      With .TextBoxes.Add(30, 0, 20, 20)
        .Border.ColorIndex = 0
        .Formula = "=test"
      End With
      With .TextBoxes.Add(60, 0, 20, 20)
        .Border.ColorIndex = 0
        .Formula = "=" & ThisWorkbook.Name & "!test"
      End With
    End With
  End With
End Sub

実行後Bookを保存して開き直すと確認できます。



チャートエリア内のテキストボックスのリンクについては他にも注意点あり。
■ChartObjects.Chart内のTextBoxes.Formula
Comment
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする