即効テクニック

メニューバー・ツールバー関連のテクニック

状況に応じて変化するメニュー

(Excel 97/2000/2002/2003)

Excel 2003までのメニューは、選択されているオブジェクトや状況によってメニューのコマンドが変化することがあります。 たとえば、空のセルを選択した状態で[挿入]メニューを開くと[コメント]というコマンドが表示されます。実行するとコメントが挿入されます。 しかし、すでにコメントが挿入されているセルを選択して[挿入]メニューを開くと、同じ位置のコマンドが[コメントの編集]に変化します。 これを実行すると、既存のコメントを編集できます。 このように、状況に応じてメニューのコマンドを自動的に変化させる方法をご紹介します。 まず、変化しない、固定されたメニューを追加してみましょう。 次のコードは、メニューバーに[新しいメニュー]を追加して、[1行目の処理]コマンドと[1列目の処理]コマンドを追加します。

Sub Sample1()
  Dim NewM As Object, NewC As Object
  Set NewM = CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup)
  With NewM
    .Caption = "新しいメニュー"
  End With
    
  Set NewC = NewM.Controls.Add
  With NewC
    .Caption = "1行目の処理"        ''1つ目コマンド名
    .OnAction = "Action_Row"        ''実行するマクロ
    .FaceId = 541
  End With
  Set NewC = NewM.Controls.Add
  With NewC
    .Caption = "1列目の処理"        ''2つ目コマンド名
    .OnAction = "Action_Column"     ''実行するマクロ
    .FaceId = 542
  End With
End Sub   
このコードで追加したメニューは、状況に応じて変化しません。 では次に、状況に応じて変化するメニューを追加してみます。 状況に応じてメニューのコマンドを変化させるには、メニュー自体のOnActionプロパティにプロシージャを登録します。
Sub Sample2()
  With CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup)
    .Caption = "新しいメニュー2"
    .OnAction = "ChangeMenu"  ''メニューがクリックされたとき実行するマクロ
    .Controls.Add             ''空のコマンド1
    .Controls.Add             ''空のコマンド2
  End With
End Sub   
メニュー[新しいメニュー2]をクリックすると、メニューの項目を展開する前にOnActionプロパティで指定した"ChangeMenu"が実行されます。 プロシージャ"ChangeMenu"は、次のように作成しておきましょう。
Sub ChangeMenu()
  With CommandBars("Worksheet Menu Bar").Controls("新しいメニュー2")
    If Selection.Rows.Count > 1 Then
      With .Controls(1)
        .Caption = ActiveCell.Row & "行目の処理"
        .Enabled = False
        .FaceId = 330
        .OnAction = "Action"
      End With
    Else
      With .Controls(1)
        .Caption = ActiveCell.Row & "行目の処理"
        .Enabled = True
        .FaceId = 541
        .OnAction = "Action"
      End With
    End If
    If Selection.Columns.Count > 1 Then
      With .Controls(2)
        .Caption = ActiveCell.Column & "列目の処理"
        .Enabled = False
        .FaceId = 330
        .OnAction = "Action"
      End With
    Else
      With .Controls(2)
        .Caption = ActiveCell.Column & "列目の処理"
        .Enabled = True
        .FaceId = 542
        .OnAction = "Action"
      End With
    End If
  End With
End Sub   
2つのコマンドは、クリックされるとアクティブセルの列幅や行の高さを表示するという簡単なプロシージャを実行することにします。 それぞれのコマンドで別々のプロシージャを実行してもいいのですが、ここではどのコマンドがクリックされたかを判定して処理を分岐するような共通プロシージャ"Action"を使います。
Sub Action()
  Select Case True
  Case InStr(CommandBars.ActionControl.Caption, "行") > 0
    With ActiveCell
      MsgBox .Row & "行目の高さは" & .RowHeight, 64
    End With
  Case InStr(CommandBars.ActionControl.Caption, "列") > 0
    With ActiveCell
      MsgBox .Column & "列目の幅は" & .ColumnWidth, 64
    End With
  Case Else
  End Select
End Sub   
任意のセルを選択した状態で、メニューを開いてみてください。