即効テクニック |
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 Sub2つのコマンドは、クリックされるとアクティブセルの列幅や行の高さを表示するという簡単なプロシージャを実行することにします。 それぞれのコマンドで別々のプロシージャを実行してもいいのですが、ここではどのコマンドがクリックされたかを判定して処理を分岐するような共通プロシージャ"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任意のセルを選択した状態で、メニューを開いてみてください。