コマンド バー コントロールを使用する

Microsoft Office 2000/Visual Basic プログラマーズ ガイド   

各 CommandBar オブジェクトには CommandBarControls コレクションがあり、コマンド バーのすべてのコントロールが含まれています。コマンド バーのコントロールを参照するには、CommandBar オブジェクトの Controls プロパティを使用します。コントロールが msoControlPopup 型である場合は、ポップアップ メニューの各コントロールを表す Control コレクションが含まれます。次の 2 番目の例のように、ポップアップ メニュー コントロールはメニューおよびサブメニューを表し、複数の層にネストすることができます。

この例のコードでは、[標準] ツール バーに含まれる [新規作成] ボタンへの参照を取得します。

  Dim ctlCBarControl As CommandBarControl

Set ctlCBarControl = Application.CommandBars("standard").Controls("新規作成(&N)")

次のコードでは、"メニュー バー" メイン メニュー バーの [ツール] メニューに含まれる [マクロ] ポップアップ メニューの [マクロ(&M)…] コントロールへの参照を取得します。

  Dim ctlCBarControl As CommandBarControl

Set ctlCBarControl = Application.CommandBars("Menu Bar").Controls("ツール(&T)") _
   .Controls("マクロ(&M)").Controls("マクロ(&M)...")

各ポップアップ メニュー コントロールは CommandBar オブジェクト自体であるため、コントロールを CommandBars コレクションのメンバとして直接参照することもできます。次のコードの行では、前の例と同じコントロールへの参照を取得します。

  Set ctlCBarControl = Application.CommandBars("Macro") _
   .Controls("マクロ(&M)...")

コマンド バーのコントロールへの参照を設定すると、そのコントロールで使用可能なすべてのプロパティおよびメソッドにアクセスできます。

メモ   コントロールの Caption プロパティを使用してコマンド バー コントロールを参照する場合、メニューに表示される正確なキャプションを指定する必要があります。前のコードの例では、キャプションがメニューの表示と一致するように、コントロールのキャプション "マクロ(&M)…" への参照に省略記号 (…) を付けます。

コントロールを追加する

コマンド バーにコントロールを追加するには、Controls コレクションの Add メソッドを使用し、作成するコントロールの種類を指定します。追加するコントロールの種類は、ボタン (msoControlButton)、テキスト ボックス (msoControlEdit)、ドロップダウン リスト ボックス (msoControlDropdown)、コンボ ボックス (msoControlComboBox)、またはポップアップ メニュー (msoControlPopup) です。

次の例では、メニュー バー コマンド バーに新しいメニューを追加し、そのメニューに 3 つのコントロールを追加します。

  Private Sub CBAddMenuDemo()
   ' 新しいメニューを追加してコントロールを加えます。また、
   ' メニュー バーからメニュー コントロールを削除します。
   '
   ' Microsoft Excel では、メイン メニュー バーの名前は "メニュー バー"
   ' ではなく "ワークシート メニュー バー" です。
   
   Dim strCBarName    As String
   Dim strMenuName    As String
   Dim cbrMenu        As CommandBarControl
   
   strCBarName = "メニュー バー"
   strMenuName = "カスタム メニューのデモ"
   
   Set cbrMenu = CBAddMenu(strCBarName, strMenuName)
   
   ' 注意 : OnAction プロパティの設定で MsgBox 関数を使用する
   ' 次の例は、Microsoft Access のコマンド バーでのみ機能します。
   ' そのほかの Office アプリケーションでは、OnAction プロパティの設定に
   ' 対して組み込み VBA 関数を呼び出します。ほかの Office アプリケーションの
   ' コマンド バー コントロールから組み込み VBA 関数を呼び出すには、
   ' VBA 関数を使用するカスタム プロシージャを作成して、
   ' OnAction プロパティの設定でそのカスタム プロシージャを
   ' 呼び出す必要があります。
   Call CBAddMenuControl(cbrMenu, "項目 1", _
      "=MsgBox('Menu1 コントロール 1 を選択しました。')")
   Call CBAddMenuControl(cbrMenu, "項目 2", _
      "=MsgBox('Menu1 コントロール 2 を選択しました。')")
   Call CBAddMenuControl(cbrMenu, "項目 3", _
      "=MsgBox('Menu1 コントロール 3 を選択しました。')")
   
   ' これで、メニュー バーに含まれる [ヘルプ] メニューの右側に
   ' 新しいメニューが表示されるようになりました。
   ' メニュー バーからメニューを削除するには、F8 キーを
   ' 押して残りのコードをステップ実行します。
   Stop
   Call CBDeleteCBControl(strCBarName, strMenuName)
End Sub

CBAddMenuDemo プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH06 サブフォルダに含まれる CommandBarSamples.mdb の modCommandBarCode モジュールにあります。

ここで、CBAddMenuDemo プロシージャは、ほかに CBAddMenu、CBAddMenuControl、および CBDeleteCBControl の 3 つのプロシージャを呼び出します。CBAddMenu プロシージャは新しいポップアップ メニューを CommandBarControl オブジェクトとして返します。また、strCBarName 引数によって指定されたコマンド バーが存在しない場合は、このプロシージャがコマンド バーを作成します。CBAddMenuControl プロシージャは、CBAddMenu プロシージャによって作成されたメニューにボタン コントロールを追加し、コントロールの OnAction プロパティをコードに設定してボタンがクリックされたときに実行します。CBDeleteCBControl プロシージャは、CBAddMenu プロシージャで作成されたメニューを削除します。次は CBAddMenu および CBAddMenuControl プロシージャです。

  Function CBAddMenu(strCBarName As String, _
                 strMenuName As String) As CommandBarControl
               
   ' strCBarName で名前を付けたコマンド バーに、
   ' strMenuName で名前を付けたメニューを追加します。
   
   Dim cbrBar              As CommandBar
   Dim ctlCBarControl      As CommandBarControl
   
   On Error Resume Next
   Set cbrBar = CommandBars(strCBarName)
   If Err <> 0 Then
      Set cbrBar = CommandBars.Add(strCBarName)
      Err = 0
   End If
   
   With cbrBar
      Set ctlCBarControl = .Controls.Add(msoControlPopup)
      ctlCBarControl.Caption = strMenuName
   End With
   Set CBAddMenu = ctlCBarControl
End Function

Function CBAddMenuControl(cbrMenu As CommandBarControl, _
                          strCaption As String, _
                          strOnAction As String) As Boolean
                        
   ' cbrMenu で指定されたメニューにボタン コントロールを追加し、
   ' Caption プロパティと OnAction プロパティを strCaption 引数と
   ' strOnAction 引数で指定された値に設定します。
   
   Dim ctlCBarControl As CommandBarControl
   
   With cbrMenu
      Set ctlCBarControl = .Controls.Add(msoControlButton)
      With ctlCBarControl
         .Caption = strCaption
         .OnAction = strOnAction
         .Tag = .Caption
      End With
   End With
End Function

CBAddMenu プロシージャおよび CBAddMenuControl プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH06 サブフォルダに含まれる CommandBarSamples.mdb の modCommandBarCode モジュールにあります。

通常、OnAction プロパティには、ボタンがクリックされたときに起動するプロシージャ名を設定します。ただし、前の例の OnAction プロパティは、組み込み VBA の MsgBox 関数とメッセージ ボックスに表示されるテキストを含む文字列を使用して設定されています。異なる種類の複数のコマンド バー コントロールが同じプロシージャを呼び出す例については、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH06 サブフォルダに含まれる CommandBarSamples.mdb サンプル ファイルの modEmployeesCmdBar モジュールで、CreateCustomCommandbar プロシージャと MoveRecord プロシージャを参照してください。複数のコマンド バー コントロールが同じ OnAction プロパティの設定を使用する場合、ActionControl プロパティと Parameter プロパティを使用して、プロシージャを呼び出すコマンド バー ボタンを指定することができます。また、CommandBar イベントおよび CommandBarControl イベントに応答して実行される VBA コードを使用することも可能です。これらのイベントの詳細については、この章の「コマンド バーのイベントを使用する」を参照してください。

OnAction、Parameter、および ActionControl プロパティで可能な操作の例を参照するには、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH06 サブフォルダに含まれる CommandBarSamples.mdb サンプル ファイルで Employees フォームを開き、2 つのカスタム ツール バー ボタンとコンボ ボックス コントロールで、使用可能なレコード間を移動してください。この例は、コマンド バーに CommandBarComboBox オブジェクトを追加し、データベースに保存された情報を入力して、コンボ ボックス コントロールでのユーザーによる選択に応答してコードを実行する方法を示します。

組み込みコマンド バー コントロールの Id プロパティを使用することにより、その組み込みコマンド バー コントロールをコマンド バーに簡単に追加することができます。次のプロシージャでは、組み込みコントロールをコマンド バーに追加する方法を示します。

  Function CBAddBuiltInControl(cbrDestBar As CommandBar, _
                             strCBarSource As String, _
                             strCtlCaption As String) As Boolean
                     
   ' このプロシージャは、strCtlCaption で指定されている組み込み
   ' コントロールを strCBarSource コマンド バーから、cbrDestBar
   ' で指定されているコマンド バーに追加します。
   
   On Error GoTo CBAddBuiltInControl_Err
   
   If CBDoesCBExist(strCBarSource) <> True Then
      CBAddBuiltInControl = False
      Exit Function
   End If
   
    cbrDestBar.Controls.Add ID:=CBGetControlID(strCBarSource, strCtlCaption)

   CBAddBuiltInControl = True
   
CBAddBuiltInControl_End:
   Exit Function
CBAddBuiltInControl_Err:
   CBAddBuiltInControl = False
   Resume CBAddBuiltInControl_End
End Function

CBAddBuiltInControl プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH06 サブフォルダに含まれる CommandBarSamples.mdb の modCommandBarCode モジュールにあります。

このプロシージャは CBGetControlID プロシージャを使用して、目的のコントロールの Id プロパティを検索します。CBGetControlID プロシージャは、この章の「コマンド バー ボタンのイメージを使用する」でも使用されています。組み込みコントロールを使用するコマンド バーの作成プロシージャを参照するには、F8 キーを押して CBAddBuiltInCtlDemo プロシージャのコードをステップ実行してください。CBAddBuiltInCtlDemo プロシージャは、Office 2000 Developer CD-ROMの ODETools\V9\Samples\OPG\Samples\CH06 サブフォルダに含まれる CommandBarSamples.mdb ファイルの modCommandBarCode モジュールにあります。

メモ   コントロールの Id プロパティを指定する際、このコントロールを選択すると実行される動作も指定します。場合によっては、コントロールに表示されるイメージを指定する場合もあります。組み込み動作を指定せずにコントロールのイメージを追加するには、FaceId プロパティのみを指定します。FaceId プロパティの詳細については、この章の「コマンド バー ボタンのイメージを使用する」を参照してください。

コントロールを表示および有効化する

Visuble プロパティを使用して、コマンド バーにコマンド バー コントロールを表示するかどうかを指定します。また、Enabled プロパティを使用して、表示されるコマンド バー コントロールを有効または無効 (無効の場合は淡色表示になります) に指定します。次の 2 行のコードは、名前を設定したコントロールの Visible プロパティと Enabled プロパティを切り替えます。

  Application.CommandBars("Menu Bar").Controls("編集(&E)").Enabled = _
   Not Application.CommandBars("Menu Bar").Controls("編集(&E)").Enabled

Application.CommandBars("Formatting").Controls("フォント(&F)").Visible = _
   Not Application.CommandBars("Formatting").Controls("フォント(&F)").Visible

コマンド バー コントロールの Enabled プロパティが False に設定されている場合、コントロールはコマンド バーに表示されますが、無効になっているため操作できません。

コマンド バーの Visible プロパティまたは Enabled プロパティを切り替えるサンプル プロシージャについては、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH06 サブフォルダに含まれる CommandBarSamples.mdb ファイルの modCommandBarCode モジュールで、CBCtlToggleVisible プロシージャおよび CBCtlToggleEnabled プロシージャを参照してください。

コマンド バー コントロールの状態を示す

多くのメニュー コマンドまたはツール バー ボタンは、アプリケーションの一部の状態を切り替える際に使用します。たとえば、Office アプリケーションでは、[太字] ボタンと [両端揃え] ボタンは、テキストにこれらの書式が適用されているかどうかにより、ボタンが押されている状態または押されていない状態で表示されます。カスタム コマンド バーのボタン コントロールでも、State プロパティを目的の msoButtonState 定数に設定することによって同様の効果が得られます。

メモ   組み込みコマンド バー コントロールの State プロパティは読み取り専用です。

次のプロシージャでは、カスタム コマンド バーのボタン コントロールに対する State プロパティの設定を切り替える方法を示します。

  Function CBCtlToggleState(strCBarName As String, _
                          strCtlCaption As String) As Boolean
                     
   ' strCBarName コマンド バーにある strCtlCaption コントロールの
   ' State プロパティの設定を切り替えます。組み込みコントロールの
   ' State プロパティは取得専用であるため、strCtlCaption が組み込み
   ' コントロールである場合は、False を返してプロシージャを終了します。
   
   Dim ctlCBarControl As CommandBarControl
   
   On Error Resume Next
   
   Set ctlCBarControl = Application.CommandBars(strCBarName).Controls(strCtlCaption)
   
   If ctlCBarControl.BuiltIn = True Then
      CBCtlToggleState = False
      Exit Function
   End If
   
   If ctlCBarControl.Type <> msoControlButton Then
      CBCtlToggleState = False
      Exit Function
   End If
   
   ctlCBarControl.State = Not ctlCBarControl.State
   
   If Err = 0 Then
      CBCtlToggleState = True
   Else
      CBCtlToggleState = False
   End If
End Function

CBCtlToggleState プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH06 サブフォルダに含まれる CommandBarSamples.mdb の modCommandBarCode モジュールにあります。