表にデータを入れていくとき、例えば型番や機種など5~10位の中から右クリックで選択入力したいと思う事は無いでしょうか。今回は特定の列で右クリックメニューを個別に表示するサンプルを説明します。
やりたいこと
A列に連番、B列に型番、LookupでC列以降は品名、単価、数量、合計(単価×数量)という表があったとします。B列で右クリックすると右クリックメニューで入力内容を選べるととても便利ですよね。
今回はサンプルとしてB列で右クリックすると、リンゴ、ミカン、バナナ、ブドウ、パイナップルの中から選ぶようにVBAを記述します。
ポイント
- Worksheet_BeforeRightClick イベントでコントロールします。具体的には実行するシートでWorksheetオブジェクトのBeforeRightClickで記述する事になります。
- Not Application.Intersect(Target, Range(“b:b”)) Is Nothing でB列かどうかを判定します。実際はIf文とセットで使います
- 処理が終わったら右クリックメニューを Application.CommandBars(“Cell”).Reset でリセットします。過去におかしくなったことがあるので私は、Application.CommandBars(“Column”).Reset と Application.CommandBars(“Row”).Reset も並記するようにしています。
具体例
まずはあまり何も考えずに test.xlsm 的なファイルを作成し、以下のVBAをそのままコピペし、B列で右クリックしてみて下さい。B列であればドラッグした範囲に同じ文字列が入ります。実際に文字列を入力するVBAは標準モジュールで記述しないと正常動作しませんので注意して下さい。
Worksheetオブジェクト
OnActionで指定したサブルーチンが実行されます。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Dim CMD_BARS As CommandBarControl ' 右クリックのコントロール範囲をB列に設定 If Not Application.Intersect(Target, Range("b:b")) Is Nothing Then '全てのメニューを一旦削除 For Each CMD_BARS In Application.CommandBars("Cell").Controls CMD_BARS.Visible = False Next '以下で、新規のメニューを追加 Set CMD_BARS = Application.CommandBars("Cell").Controls.Add() With CMD_BARS .Caption = "リンゴ" .FaceId = 2 .OnAction = "INPUT_リンゴ" End With Set CMD_BARS = Application.CommandBars("Cell").Controls.Add() With CMD_BARS .Caption = "ミカン" .FaceId = 2 .OnAction = "INPUT_ミカン" End With Set CMD_BARS = Application.CommandBars("Cell").Controls.Add() With CMD_BARS .Caption = "バナナ" .FaceId = 2 .OnAction = "INPUT_バナナ" End With Set CMD_BARS = Application.CommandBars("Cell").Controls.Add() With CMD_BARS .Caption = "ブドウ" .FaceId = 2 .OnAction = "INPUT_ブドウ" End With Set CMD_BARS = Application.CommandBars("Cell").Controls.Add() With CMD_BARS .Caption = "パイナップル" .FaceId = 2 .OnAction = "INPUT_パイナップル" End With Set CMD_BARS = Application.CommandBars("Cell").Controls.Add() With CMD_BARS .Caption = "選択範囲クリア" .FaceId = 21 .OnAction = "INPUT_クリア" End With Application.CommandBars("Cell").ShowPopup Cancel = True End If Application.CommandBars("Cell").Reset Application.CommandBars("Column").Reset Application.CommandBars("Row").Reset End Sub
標準モジュール
今回はテキストを入力するサンプルですが、内容をきちんと記述すれば普通にサブルーチンが走ります。
Sub INPUT_リンゴ() Selection.Value = "リンゴ" End Sub Sub INPUT_ミカン() Selection.Value = "ミカン" End Sub Sub INPUT_バナナ() Selection.Value = "バナナ" End Sub Sub INPUT_ブドウ() Selection.Value = "ブドウ" End Sub Sub INPUT_パイナップル() Selection.Value = "パイナップル" End Sub Sub INPUT_クリア() Selection.Value = "" End Sub
FaceId
上記例では2と21しか使っていませんがたくさんあります。例としてFaceTd=1~200を表示します。
この記事へのコメントはありません。