1.

Excel でボタンにマクロを割り当てる完全手順(フォームコントロール / ActiveX)

編集
この記事の要点
  • 定番手順: 開発タブ → 挿入 → フォームコントロール → ボタン → 配置 → 「マクロの登録」ダイアログ表示
  • 後から紐づけ変更: ボタン右クリック → 「マクロの登録」で別マクロを選択
  • VBA で動的に: ActiveSheet.Buttons("Button 1").OnAction = "MyMacro"
  • ActiveX ボタンCommandButton1_Click イベントに直接書く(OnAction 不要)
  • シェイプにもマクロ割当可(図形右クリック → マクロの登録)

手順 1: 開発タブを表示

標準では「開発」タブは非表示なので、まず表示します:

  1. ファイル → オプション → リボンのユーザー設定
  2. 右側の「メイン タブ」リストで 「開発」 にチェック
  3. OK → リボンに「開発」タブが追加される

手順 2: ボタンを配置してマクロを紐づけ(フォームコントロール)

  1. 開発タブ → 挿入 → フォームコントロール の左上「ボタン」をクリック
  2. シート上でドラッグしてボタンを配置
  3. 離した瞬間「マクロの登録」ダイアログが表示される
  4. 登録済マクロから選択 or 「新規作成」で雛形生成
  5. OK でボタンとマクロが紐づく
  6. テキストを編集(右クリック → テキストの編集)

マクロ本体の例

' 標準モジュール (Module1) に書く
Sub ClearTable()
    Range("A2:E100").ClearContents
    MsgBox "クリアしました", vbInformation
End Sub

Sub SaveAndClose()
    ThisWorkbook.Save
    Application.Quit
End Sub

' 引数つきマクロを紐づけたい場合
Sub ShowMessage(msg As String)
    MsgBox msg
End Sub
' → ボタンの OnAction には `'ShowMessage "hello"'` のように指定

後から紐づけを変更する

  1. 配置済のボタンを右クリック(左クリックではマクロが走るので注意)
  2. 「マクロの登録」を選択
  3. 別のマクロ名を選んで OK

右クリックできない場合は Ctrl + 左クリック で選択モードに。

VBA からプログラム的に紐づける

Sub SetupButton()
    ' フォームコントロールのボタンを追加
    Dim btn As Button
    Set btn = ActiveSheet.Buttons.Add( _
        Left:=100, Top:=50, Width:=120, Height:=30)

    btn.Name = "ClearBtn"
    btn.Caption = "クリア実行"
    btn.OnAction = "ClearTable"   ' ← ここで紐づけ
End Sub

' 既存ボタンの紐づけを後から変更
Sub ChangeButtonAction()
    ActiveSheet.Buttons("ClearBtn").OnAction = "SaveAndClose"
End Sub

' 全ボタンの紐づけを一覧表示
Sub ListButtonActions()
    Dim btn As Button
    For Each btn In ActiveSheet.Buttons
        Debug.Print btn.Name, btn.Caption, btn.OnAction
    Next btn
End Sub

シェイプ(図形)にマクロを割り当てる

四角や矢印などの図形にもマクロを紐づけて「カラフルなボタン」を作れます:

  1. 挿入 → 図形 → 任意の図形を配置
  2. 図形を右クリック → 「マクロの登録」
  3. マクロを選択 → OK
' VBA で図形にマクロ割当
Sub SetupShapeButton()
    Dim s As Shape
    Set s = ActiveSheet.Shapes.AddShape( _
        Type:=msoShapeRoundedRectangle, _
        Left:=100, Top:=100, Width:=150, Height:=50)

    s.Name = "RunBtn"
    s.TextFrame.Characters.Text = "実行"
    s.Fill.ForeColor.RGB = RGB(0, 153, 76)
    s.TextFrame.Characters.Font.Color = RGB(255, 255, 255)
    s.OnAction = "ClearTable"   ' ← 紐づけ
End Sub

ActiveX ボタン(CommandButton)

ActiveX は OnAction ではなくClick イベントに直接コードを書きます:

  1. 開発タブ → 挿入 → ActiveX コントロール → コマンドボタン
  2. 配置後、デザインモードのままダブルクリックで VBE が開く
  3. CommandButton1_Click プロシージャに処理を書く
  4. デザインモードを OFF にすると動作する
' Sheet1 のコード(オブジェクトモジュール)
Private Sub CommandButton1_Click()
    Call ClearTable
End Sub

Private Sub CommandButton2_Click()
    If MsgBox("保存しますか?", vbYesNo + vbQuestion) = vbYes Then
        ThisWorkbook.Save
    End If
End Sub

フォームコントロール vs ActiveX

項目フォームコントロールActiveX
紐づけ方法OnAction で標準モジュールのマクロClick イベント(シートモジュール)
デザイン自由度低(ボタンらしい外観のみ)高(フォント・色・画像)
マクロ共有複数ボタンで同一マクロを使い回せる1 ボタンに 1 イベント
互換性Mac でも動くMac で動かない、64bit で不具合あり
推奨シンプル業務はこちら高度な UI が必要なときのみ

よくあるトラブル

症状原因対処
ボタンを押しても何も起きないマクロ未登録 / マクロセキュリティで無効右クリック → マクロの登録を確認 / マクロを有効化
ボタンの紐づけが消えるブックを別 PC で開いた / マクロ削除済OnAction を再設定
ActiveX ボタンが押せないデザインモードが ON開発タブ → デザインモード OFF
ボタンが選択できない普通のクリックではマクロが走るCtrl + 左クリック または右クリック

FAQ

Q: 同じマクロを複数ボタンで使い回したい
A: フォームコントロールが向いています。全ボタンの OnAction に同じマクロ名を指定。

Q: ボタンを押した時に「どのボタン?」を取得したい
A: Application.Caller で押されたボタン名が取得できます。If Application.Caller = "Button 1" Then ...

Q: ボタンだけ印刷したくない
A: ボタン右クリック → コントロールの書式設定 → プロパティタブ → 「オブジェクトを印刷する」のチェックを外す。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. マクロとボタンの紐づけ方法
  2. 開発タブの表示
  3. モジュールの名前変更方法
  4. エラー一覧
  5. シートのコピー
  6. デバッグで一行ずつ実行する方法
  7. 変数宣言時のSETありなしの違い
  8. if文で複数条件を指定する方法