小さい会社の1人SEの開発記というか奮戦記

  1. Excel
  2. 2484 view

右クリックメニューで選択したテキストを入力する【Excel VBA】

表にデータを入れていくとき、例えば型番や機種など5~10位の中から右クリックで選択入力したいと思う事は無いでしょうか。今回は特定の列で右クリックメニューを個別に表示するサンプルを説明します。

やりたいこと

A列に連番、B列に型番、LookupでC列以降は品名、単価、数量、合計(単価×数量)という表があったとします。B列で右クリックすると右クリックメニューで入力内容を選べるととても便利ですよね。

今回はサンプルとしてB列で右クリックすると、リンゴ、ミカン、バナナ、ブドウ、パイナップルの中から選ぶようにVBAを記述します。

ポイント

  1. Worksheet_BeforeRightClick イベントでコントロールします。具体的には実行するシートでWorksheetオブジェクトのBeforeRightClickで記述する事になります。
  2. Not Application.Intersect(Target, Range(“b:b”)) Is Nothing でB列かどうかを判定します。実際はIf文とセットで使います
  3. 処理が終わったら右クリックメニューを 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を表示します。

Excelの最近記事

  1. 日本語をエンコードする【Excel VBA】

  2. 商品コードなど長い数値だけの文字列を指数表示させない【Excel VBA】

  3. VBAで改行を指定する【Excel】

  4. 入力規則のプルダウン連携【Excel】

  5. 最短手順で計算式を保護する【Excel】

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


お薦め書籍

最近の記事

  1. Access

    Accessの数値型ではまる・・・。
  2. Excel

    日本語をエンコードする【Excel VBA】
  3. Access

    クエリで日付から曜日を算出する。【Access】
  4. PCパーツ

    ASUS AMD Ryzen 4000 シリーズ搭載小型ベア…
  5. Microsoft365

    コンデジをTeamsのWebカメラに使う
  6. SQL Server

    SQL文で今日から7日前までを指定する