完成イメージ(Before / After)
Before(ボタンなし):
- Alt + F8 を押す
- マクロ名を選ぶ
- 「実行」をクリック
- 同僚に頼むたびに「Alt+F8を押して、このマクロを選んで…」と説明
After(ボタンあり):
- シート上の「実行」ボタンをクリック
- マクロが走る
- 同僚には「このボタン押すだけ」で済む
—
マクロを作ったのにAlt+F8で毎回実行するのが面倒だった。同僚に「このマクロ使って」と渡したらVBEの画面を見て「なんか怖い画面出た…」とフリーズされた。ボタン1つで済む仕組みを最初から作っておけばよかったと思った。この記事で、同じ悩みを持つ人がサクッとボタン設置できるようになればうれしい。
マクロの実行方法を Alt+F8 からボタンクリックに変えるだけで、自分以外の人にも使ってもらえるExcelになる。
—
どんな場面で使う?
- VBAに慣れていない同僚にもマクロを使ってもらいたい
- 色分けマクロや検索マクロをワンクリックで実行できるようにしたい
- 複数のマクロをボタンで切り替えて「実行」「リセット」「PDF出力」を分けたい
- 業務ツールとしてExcelを配布するとき、見た目が分かりやすい操作UIを作りたい
—
実行前の準備
バックアップを取る
マクロ実行前に、Excelファイルのコピーを別フォルダに保存しておく。ボタン設置自体はデータを壊す操作ではないが、習慣として推奨する。
Excelをマクロ有効ブック(.xlsm)で保存する
拡張子が .xlsx のままだとマクロもボタンも保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す - VBE(Visual Basic Editor)が開く
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
- 白い画面(コードウィンドウ)が表示される
コードを貼り付けて実行する
- コードウィンドウに、下のコードをそのままコピペする
Alt + F8→ マクロ名を選んで「実行」(このマクロでボタンが作られる。次回からはボタンクリックでOK)
—
コード(最小版)– フォームコントロールのボタンを設置してマクロを割り当て
'============================================================
' ■ フォームコントロールのボタンを設置(最小版)
' → シート上にボタンを作り、指定マクロを割り当てる
'============================================================
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で自動作成+見た目カスタマイズ
実務では「見た目が分かりやすいボタン」が求められる。フォームコントロールのボタンは色の変更ができないため、図形(オートシェイプ)を使う。
以前この方法を覚えてからは、色分けマクロ(/006)や検索ハイライトマクロ(/010)にもボタンを付けて渡すようにしている。同僚から「これ便利」と言われるようになった。ボタンを付けるだけで「マクロが怖い」が「便利ツール」に変わる。この実務版を入れてからは、自分以外の人でも安心してマクロを使える環境が整った。
'============================================================
' ■ 図形ボタンを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で行/列の挿入・削除で動かないように設定
ボタンに割り当てるマクロは、セルの色分け(/006)でも検索ハイライト(/010)でも何でもOK。ドロップダウンリストの設定(/012)と組み合わせて「入力フォーム+実行ボタン」にすると、業務ツールとしての完成度が上がる。
—
よくある落とし穴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(マクロ有効ブック)で保存してから渡せば解決する。
—
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一括変換(/009)のコードをそのまま割り当てられる。
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イベント(/008)も検討してみてほしい。セル値の変更をトリガーにする方法で、ボタンなしでも自動実行できる。
—
まとめ
Buttons.Addでフォームコントロールのボタンを設置できる(最小版)Shapes.AddShapeで図形ボタンを作れば、色・文字・サイズが自由(実務版)OnActionでクリック時に実行するマクロを指定する- 再実行時にボタンが増えないよう、既存ボタンの削除処理を入れる(冪等性)
- ボタンは「マクロを呼び出すスイッチ」。同僚に渡すなら、ボタン付きが安心
関連記事
- /006 — セルの値に応じて行を自動色分けする方法。ボタンに割り当てるマクロの定番
- /010 — 特定の文字を含むセルを検索してハイライトする方法。ボタンで検索実行する使い方
- /008 — セルの値が変わったら自動実行する方法。ボタンを使わず自動で走らせる方法
- /081 — マクロにショートカットキーを割り当てる方法。ボタンと併用でさらに素早く実行
- /104 — 右クリックメニューに独自のマクロを追加する方法。ボタン以外のマクロ実行手段
—
次にやりたくなること
- /081 — ショートカットキー割り当て。ボタンだけでなく、キーボードからも素早くマクロを実行したい場合に。ボタンとショートカットの両方を用意しておけば、自分はショートカット・同僚はボタンと使い分けられる
- /104 — 右クリックメニューにマクロ追加。シート上を右クリックしたときのメニューに自分のマクロを追加できる。ボタンを配置するスペースがないときや、より自然な操作感が欲しい場合に
- /006 — セルの値に応じて行を自動色分け。ボタンに割り当てるマクロの定番。色分け+ボタンで実用的な業務ツールが作れる
- /009 — ExcelファイルをPDFに一括変換。「PDF出力」ボタンを設置すれば、ワンクリックでレポートのPDF化が完了する
- /020 — 入力フォームで手入力ミスを防ぐ方法。ボタン+入力フォームを組み合わせて、本格的な業務ツールに仕上げたい場合に
—


コメント