Excelでマクロを使い始めると、「毎回 Alt + F8 から実行するのが面倒」「ボタンを押すだけで処理を動かしたい」と感じる場面が出てきます。
この記事では、VBAのマクロ実行ボタンをシート上に配置し、クリックで目的のマクロを動かす方法を解説します。フォームコントロールのボタン、図形ボタン、マクロ登録、動かない時の確認点まで一通り確認できます。
この記事で作るマクロ実行ボタン

Before(ボタンなし):
Alt + F8を押す- マクロ名を選ぶ
- 「実行」をクリックする
- 他の人に使ってもらうたびに手順説明が必要になる
After(ボタンあり):
- シート上の「実行」ボタンをクリックする
- 指定したマクロが動く
- 説明は「このボタンを押してください」で済む
マクロの実行方法をボタン化すると、自分以外の人にも使ってもらいやすいExcelになります。
どんな場面で使う?
- VBAに慣れていない同僚にもマクロを使ってもらいたい
- 色分けマクロや検索マクロをワンクリックで実行できるようにしたい
- 複数のマクロをボタンで切り替えて「実行」「リセット」「PDF出力」を分けたい
- 業務ツールとしてExcelを配布するとき、見た目が分かりやすい操作UIを作りたい
今回の検証条件とBefore/After
この記事では、空のExcelブックに標準モジュールを1つ追加し、シート上にボタンを置いて、クリックでテスト用マクロを実行する流れを確認しています。ボタンはフォームコントロール版と図形版の2パターンで見ています。
| 確認したこと | 結果 | 記事内での扱い |
|---|---|---|
| フォームコントロールのボタンにマクロを割り当てる | 右クリックから割り当てを変更しやすく、初心者向け | まず試す最小版として紹介 |
| 図形にマクロを割り当てる | 見た目を整えやすく、配布用のブックに向いている | 実務版として紹介 |
| ボタンを押しても動かないケース | マクロ名の変更、保存形式、セキュリティ設定で止まりやすい | 落とし穴で切り分ける |
Beforeは、Alt + F8から毎回マクロを選ぶ状態です。Afterは、シート上のボタンを押すだけで同じ処理を実行できる状態です。実務では、操作する人がVBEを開かなくてよくなることが一番大きいです。
実行前の準備
ボタン作成の前に、次の3点だけ確認します。特に .xlsx のままだとVBAコードが保存されないため、最初に確認しておくと失敗を避けられます。
- 開発タブが表示されている
- ファイル形式が
.xlsmになっている - コードを貼り付ける標準モジュールを作れる状態になっている
この準備がまだの場合は、画像付きでまとめた VBA初心者向けの初期設定手順 を確認してください。
バックアップを取る
マクロ実行前に、Excelファイルのコピーを別フォルダに保存しておく。ボタン設置自体はデータを壊す操作ではないが、習慣として推奨する。
ボタンを作る前に決めること
先に決めるのは、ボタンの作り方そのものではなく「誰が押すボタンなのか」です。自分だけが使うのか、他の人にも配るのかで、フォームコントロールと図形ボタンの向き不向きが変わります。
| 決めること | おすすめ | 理由 |
|---|---|---|
| 自分だけが使う | フォームコントロール | 作成と割り当てが簡単で、右クリックから修正しやすい |
| 他の人へ配る | 図形ボタン | 文字・色・サイズを整えやすく、操作ボタンとして見つけやすい |
| 押す前に確認したい | マクロ内でMsgBoxを出す | 削除や送信など、戻せない処理の誤操作を防げる |
| ボタンを複数置く | ボタン名とマクロ名をそろえる | 後から見たときに、どのボタンが何を動かすか迷いにくい |
準備ができたら、標準モジュールにボタンから呼び出すマクロを先に作ります。ボタンは「先に置く」のではなく、「動かすマクロを作ってから割り当てる」と失敗が減ります。
フォームコントロールのボタンを作るコード(最小版)
'============================================================
' ■ フォームコントロールのボタンを設置(最小版)
' → シート上にボタンを作り、指定マクロを割り当てる
'============================================================
Sub AddButtonMinimal()
'--- ★書き換えポイント ---
Dim macroName As String
macroName = "SampleMacro" '← 割り当てたいマクロ名
Dim buttonText As String
buttonText = "実行" '← ボタンに表示する文字
'--- ★ここまで ---
'--- ボタンを追加(左位置, 上位置, 幅, 高さ)
' ※ 単位はポイント。100, 10 はセルA1付近の位置。シートに合わせて調整する
Dim btn As Object
Set btn = ActiveSheet.Buttons.Add(100, 10, 120, 40)
'--- マクロを割り当て
btn.OnAction = macroName
'--- ボタンの文字を設定
btn.Characters.Text = buttonText
MsgBox "ボタンを設置しました。", vbInformation
End Sub
'============================================================
' ■ テスト用マクロ(ボタンの動作確認用)
'============================================================
Sub SampleMacro()
MsgBox "ボタンがクリックされました!", vbInformation
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
macroName |
ボタンに割り当てるマクロの名前 | "SampleMacro" |
buttonText |
ボタンに表示する文字 | "実行" |
※ 選択肢が多いマクロを使う場合や、より複雑な処理が必要なら、実務版(図形ボタン方式)の利用を推奨する。
コードの流れ
Buttons.Addでフォームコントロールのボタンをシート上に追加OnActionで、クリック時に実行するマクロ名を指定Characters.Textでボタンに表示する文字を設定
テスト用に SampleMacro を用意している。 まずはこのまま動かし、ボタンクリックでメッセージが出ることを確認する。確認後、macroName を自分のマクロ名に書き換える。
図形ボタンを自動作成するコード(実務版)
実務では「見た目が分かりやすいボタン」が求められる。フォームコントロールのボタンは色の変更ができないため、図形(オートシェイプ)を使う。
以前この方法を覚えてからは、色分けマクロ(セルの値で行を自動色分けするVBA)や検索ハイライトマクロ(特定文字を検索してハイライトするVBA)にもボタンを付けて渡すようにしている。同僚から「これ便利」と言われるようになった。ボタンを付けるだけで「マクロが怖い」が「便利ツール」に変わる。この実務版を入れてからは、自分以外の人でも安心してマクロを使える環境が整った。
'============================================================
' ■ 図形ボタンをVBAで自動作成(実務版)
' → 角丸四角形のボタンを作成し、色・文字・サイズを設定
' → 既存の同名ボタンがあれば削除してから再作成(冪等性)
'============================================================
Sub AddButtonAdvanced()
'--- ★書き換えポイント ---
Dim macroName As String
macroName = "SampleMacro" '← 割り当てたいマクロ名
Dim buttonText As String
buttonText = "実行" '← ボタンに表示する文字
Dim buttonName As String
buttonName = "btnExecute" '← ボタンの識別名(重複防止用)
Dim btnLeft As Double: btnLeft = 100 '← 左からの位置(ポイント)
Dim btnTop As Double: btnTop = 10 '← 上からの位置(ポイント)
Dim btnWidth As Double: btnWidth = 140 '← 幅
Dim btnHeight As Double: btnHeight = 40 '← 高さ
Dim btnColor As Long
btnColor = RGB(0, 112, 192) '← ボタンの背景色(青)
Dim btnFontColor As Long
btnFontColor = RGB(255, 255, 255) '← ボタンの文字色(白)
Dim btnFontSize As Single
btnFontSize = 12 '← 文字サイズ
'--- ★ここまで ---
Dim ws As Worksheet
Set ws = ActiveSheet
'--- 既存の同名ボタンを削除(再実行時に重複しない)
Dim shp As Shape
For Each shp In ws.Shapes
If shp.Name = buttonName Then
shp.Delete
End If
Next shp
'--- 図形を追加(msoShapeRoundedRectangle = 角丸四角形の定数)
Dim btn As Shape
Set btn = ws.Shapes.AddShape( _
msoShapeRoundedRectangle, _
btnLeft, btnTop, btnWidth, btnHeight)
'--- 識別名を設定
btn.Name = buttonName
'--- マクロを割り当て
btn.OnAction = macroName
'--- 見た目を設定
btn.Fill.ForeColor.RGB = btnColor
btn.Line.Visible = msoFalse
'--- テキストを設定
With btn.TextFrame2.TextRange
.Text = buttonText
.Font.Fill.ForeColor.RGB = btnFontColor
.Font.Size = btnFontSize
.Font.Bold = msoTrue
.ParagraphFormat.Alignment = msoAlignCenter
End With
'--- テキストの上下中央揃え
btn.TextFrame2.VerticalAnchor = msoAnchorMiddle
'--- ボタンの位置固定(行列の挿入・削除で動かない)
btn.Placement = xlFreeFloating
MsgBox "ボタンを設置しました。", vbInformation
End Sub
'============================================================
' ■ テスト用マクロ(ボタンの動作確認用)
'============================================================
Sub SampleMacro()
MsgBox "ボタンがクリックされました!", vbInformation
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
macroName |
割り当てるマクロ名 | "SampleMacro" |
buttonText |
ボタンの表示文字 | "実行" |
buttonName |
ボタンの識別名(再実行時の重複防止) | "btnExecute" |
btnLeft / btnTop |
ボタンの左上位置(ポイント) | 100 / 10 |
btnWidth / btnHeight |
ボタンのサイズ | 140 / 40 |
btnColor |
背景色(RGB) | RGB(0, 112, 192)(青) |
btnFontColor |
文字色(RGB) | RGB(255, 255, 255)(白) |
btnFontSize |
文字サイズ | 12 |
コードの流れ
- 既存ボタンの削除: 同じ識別名(
buttonName)のボタンがあれば削除。再実行してもボタンが増えない - 図形の追加:
Shapes.AddShapeで角丸四角形を作成 - マクロの割り当て:
OnActionでクリック時のマクロを指定 - 見た目の設定: 背景色、枠線非表示、文字色・サイズ・太字・中央揃え
- 位置固定:
Placement = xlFreeFloatingで行/列の挿入・削除で動かないように設定
ボタンに割り当てるマクロは、セルの色分け(セルの値で行を自動色分けするVBA)でも検索ハイライト(特定文字を検索してハイライトするVBA)でも何でもOK。ドロップダウンリストの設定(ドロップダウンリストを作るVBA)と組み合わせて「入力フォーム+実行ボタン」にすると、業務ツールとしての完成度が上がる。
フォームボタンと図形ボタンの判断基準
どちらを使ってもマクロは実行できます。ただ、業務ファイルとして配るなら、見た目と保守性まで含めて選ぶ方が安全です。
| 判断ポイント | フォームコントロール | 図形ボタン |
|---|---|---|
| 作りやすさ | 簡単 | 少し手間がある |
| 見た目の調整 | 最低限 | 文字・色・サイズを整えやすい |
| 初心者への説明 | 右クリックで割り当て確認がしやすい | 操作ボタンとして分かりやすい |
| 配布用ブック | 検証用・社内用なら十分 | 配布先が多いならこちらが無難 |
自分なら、まずフォームコントロールで動作確認をしてから、配布用には図形ボタンに置き換えます。最初から見た目を作り込むより、マクロが正しく動くことを先に確認した方が手戻りが少ないからです。
よくある落とし穴5選
1. ボタンをクリックしても何も起きない
原因: OnAction に指定したマクロ名が間違っている or マクロが存在しない。
対策: マクロ名はVBEで確認する。Sub の後ろに書いてある名前がマクロ名。大文字・小文字は区別されないが、スペルミスはエラーになる。
2. 「マクロが見つかりません」エラーが出る
原因: 標準モジュールが複数あるとき、マクロ名だけではExcelが特定できないことがある。
自分もこれで20分ハマった。図形にマクロを割り当てたのにクリックしても反応しない。原因はモジュールが2つあって、マクロ名だけでは一意に決まらなかったこと。Module1.SampleMacro のようにモジュール名を付ければ解決する。
対策: 標準モジュールが1つだけなら macroName だけで動く。2つ以上あるなら "Module1.SampleMacro" のようにモジュール名を含める。
3. ボタンを編集したいのに、クリックするとマクロが走る
原因: 図形ボタンは左クリックでマクロが実行される。
対策: 図形を右クリックすると、マクロが走らずに選択できる。テキスト編集やサイズ変更は右クリックから行う。
4. 行/列を挿入したらボタンの位置がずれた
原因: デフォルトではボタン(図形)はセルに連動して移動する。
対策: 実務版コードでは btn.Placement = xlFreeFloating を設定済み。手動で作った図形の場合は、図形を右クリック →「サイズとプロパティ」→「セルに合わせて移動やサイズ変更をしない」を選ぶ。
5. .xlsx で保存したらボタンもマクロも消えた
原因: .xlsx(マクロ無効ブック)で保存するとVBAコードが破棄される。ボタンの図形は残るがマクロが消えるため、クリックしてもエラーになる。
自分も最初、同僚にExcelファイルを渡すときに「名前を付けて保存」で .xlsx にしてしまった。ボタンは見た目上残っていたので気づかず、同僚が「ボタン押してもエラーになる」と連絡してきて発覚した。それ以来、渡す前に必ず拡張子を確認するようにしている。
対策: 必ず .xlsm(マクロ有効ブック)で保存する。これはボタンに限らず、VBAを使うすべての場面で共通。
VBAで作ったボタンをクリックしても何も起きないときの対処法
「ボタンを押しても反応がない」という場合、原因は OnAction に指定したマクロ名のスペルが間違っているか、マクロが存在しないことだ。VBEを開いて Sub の後に書いてある正確なマクロ名を確認し、macroName の値を修正すれば解決する。標準モジュールが複数ある場合は "Module1.SampleMacro" のようにモジュール名を含めること。
VBAのボタン付きExcelを渡したらエラーになるときの対処法
「同僚にファイルを渡したらボタンを押してもエラーになる」という場合、原因はファイルを .xlsx 形式で保存してしまったためVBAコードが破棄されたことだ。必ず .xlsm(マクロ有効ブック)で保存してから渡せば解決する。
実務でボタン付きブックを配布するときの注意点
マクロ実行ボタンは、使う人がVBEを開かなくても処理を実行できるため、部署内に配布するブックと相性が良いです。ただし、ボタンは見た目だけでなく、どのマクロに割り当てられているか、保護されたシートで押せるか、行や列を挿入したときに位置がずれないかまで確認しておく必要があります。以前、部署内でマクロを配布したときも、PCの言語設定やパスの見え方が少し違うだけで説明が増えました。ボタン付きブックでは、利用者が迷わない配置とエラー時のメッセージが特に大切です。
フォームコントロールのボタンは扱いやすい一方で、コピーしたブックで別ブックのマクロを参照してしまうことがあります。配布用に作る場合は、OnAction にブック名付きでマクロを割り当てる、ボタン名を固定する、既存ボタンを作り直してから配置する、といったルールにしておくと安全です。
- ボタンの表示名は、処理内容が一目でわかる短い名前にする
- クリック後に何が完了したか、メッセージで知らせる
- シート保護を使う場合は、ボタンを押せる状態で保護をかける
- 行や列の挿入が多いシートでは、ボタン位置の固定方法を確認する
- 配布前に別名保存したファイルでボタンが動くか確認する
配布用にブック名付きでマクロを割り当てる例
Dim btn As Button
Set btn = ActiveSheet.Buttons.Add(Left:=20, Top:=20, Width:=120, Height:=30)
btn.Caption = "集計を実行"
btn.OnAction = "'" & ThisWorkbook.Name & "'!RunSummary"
btn.Placement = xlMoveAndSize
ブック名を含めて割り当てると、コピー後に意図しない別ブックのマクロを呼ぶリスクを下げられます。ボタンは初心者向けの入口として便利ですが、実務では「押した後に何が起きるか」が見えないと不安になります。完了メッセージや処理対象件数を表示して、利用者が結果を確認できる形にしておくのがおすすめです。
実務で試して分かった失敗例
失敗例1: マクロ名を変えたあと、ボタンだけ古い名前を見ている
ボタンは、割り当てた時点のマクロ名を覚えています。あとからプロシージャ名を変えると、ボタン側の割り当てが古いままになり「マクロが見つかりません」と出ます。マクロ名を変えたら、ボタンを右クリックして割り当ても確認します。
失敗例2: xlsx形式で保存して、次に開いたらマクロが消えている
ボタンの見た目が残っていても、xlsx形式ではVBAコードを保存できません。配布前に一度閉じて開き直し、ボタンを押して動くか確認するのが安全です。
失敗例3: ボタンがセルの挿入や列幅変更でずれる
行や列を追加する表では、ボタンの配置がずれることがあります。入力欄の中ではなく、表の外側や固定エリアにボタンを置くと、後から崩れにくくなります。
FAQ
Q1: フォームコントロールのボタンと図形ボタン、どちらを使うべき?
見た目にこだわらない+簡単に済ませたいならフォームコントロール。色やデザインを変えたい、または複数ボタンを統一感のあるデザインで配置したいなら図形ボタン。
迷ったら、配布用の業務ファイルでは図形ボタンを使うと見た目を整えやすいです。
Q2: ボタンを削除したらマクロも消える?
消えない。マクロはVBE内の標準モジュールに残る。ボタンはあくまで「マクロを呼び出すスイッチ」。スイッチを外しても、中身はそのまま。
Q3: 1つのシートに複数のボタンを置ける?
置ける。実務版コードの buttonName を変えれば、何個でも配置可能。例:
| ボタン | macroName | buttonName | btnColor |
|---|---|---|---|
| 実行 | "RunMain" |
"btnRun" |
RGB(0,112,192) 青 |
| リセット | "ResetData" |
"btnReset" |
RGB(192,0,0) 赤 |
| PDF出力 | "ExportPDF" |
"btnPDF" |
RGB(0,128,0) 緑 |
ボタンからPDF出力するなら、PDF一括変換(ExcelファイルをPDFに一括変換するVBA)のコードをそのまま割り当てられる。
Q4: ボタンを押したときに確認メッセージを出したい
マクロの先頭に確認処理を入れる:
Sub SampleMacro()
Dim ans As VbMsgBoxResult
ans = MsgBox("実行してよいですか?", vbYesNo + vbQuestion)
If ans = vbNo Then Exit Sub
'--- ここに本来の処理 ---
MsgBox "処理が完了しました。", vbInformation
End Sub
Q5: ボタンに割り当てるマクロを後から変更したい
図形ボタンの場合: 図形を右クリック →「マクロの登録」→ 別のマクロを選択。
VBAで変更する場合:
ActiveSheet.Shapes("btnExecute").OnAction = "NewMacroName"
ボタンクリックをきっかけに別の処理を自動で走らせたいなら、Worksheet_Changeイベント(Worksheet_Changeで自動実行するVBA)も検討してみてほしい。セル値の変更をトリガーにする方法で、ボタンなしでも自動実行できる。
まとめ
Buttons.Addでフォームコントロールのボタンを設置できる(最小版)Shapes.AddShapeで図形ボタンを作れば、色・文字・サイズが自由(実務版)OnActionでクリック時に実行するマクロを指定する- 再実行時にボタンが増えないよう、既存ボタンの削除処理を入れる(冪等性)
- ボタンは「マクロを呼び出すスイッチ」。同僚に渡すなら、ボタン付きが安心
関連記事
- VBAを動かす初期設定 — 開発タブの表示、
.xlsm保存、標準モジュール作成までを画像付きで確認 - セルの値で行を自動色分けするVBA — 作ったマクロをボタンに割り当てる定番例
- 特定文字を検索してハイライトするVBA — 検索処理をボタン化したい場合に便利
- ExcelファイルをPDFに一括変換するVBA — 「PDF出力」ボタンとして使いやすい処理
- 入力フォームで手入力ミスを防ぐVBA — ボタンと入力フォームを組み合わせた業務ツール向け
次にやると効果が出やすい改善
- よく使うマクロを「実行」「リセット」「PDF出力」のようにボタンで分ける
- 同僚に渡すExcelでは、ボタン名を短く具体的にする
- 処理前に確認メッセージを出し、誤クリックを防ぐ
- ボタン付きファイルは必ず
.xlsmで保存してから共有する


コメント