カスタム検索
Office関連

CommandBarsオブジェクトのTemporaryが効かない?(Word VBA)

コマンドバーやコマンドバー上にコントロールを追加する場合(コンテキストメニューの変更含む)、通常は下記コードのようにCommandBarsオブジェクトやCommandBarControlsオブジェクトのAddメソッドを使います。

 

Public Sub Sample()
  With Application.CommandBars("Standard").Controls.Add(Type:=msoControlButton, Temporary:=True)
    .Caption = "My Button"
    .FaceId = 59
    .Visible = True
  End With
End Sub

 

例えばExcelで上記コードを実行すると標準ツールバーにコントロールが追加されますが、Addメソッドの引数Temporaryを「True」にしているので、アプリケーション終了時には追加したコントロールは削除されます。

ところがWordで上記コードを実行すると、アプリケーションを終了しても追加したコントロールは標準ツールバーに残ったままです。
これはMicrosoft Word のコマンド バーにあるように、Wordでは既定で全文書対象のテンプレートファイル(Normal.dot、Normal.dotm)にコマンドバーのカスタマイズ情報が保存されるようになっているためで、全文書対象のテンプレートにカスタムコマンドバーの情報が残らないようにするには、CustomizationContextプロパティを使用してカスタマイズ情報の保存先を指定する必要があります。

 

Public Sub Sample2()
  Application.CustomizationContext = ThisDocument '保存先をThisDocumentに指定
  'コントロール追加
  With Application.CommandBars("Standard").Controls.Add(Type:=msoControlButton)
    .Caption = "My Button"
    .FaceId = 59
    .Visible = True
  End With
  ThisDocument.Save 'ドキュメントの変更を保存
End Sub

 

上記コード実行後文書ファイルを閉じると、追加したコントロールが表示されなくなるのが確認できます(再度ファイルを開くとコントロールが表示されます)。


上記のようにCustomizationContextプロパティを使うと、全文書対象のテンプレートを汚すことなくカスタムコマンドバーを追加することができます。