top of page

​タグ一覧

配列処理(73)

階層化フォーム(33)

ファイル操作(27)

開発事例(20)

シート・セル操作(18)

コード自動生成(10)

ユーザーフォーム(9)

文字列操作(8)

図形操作(7)

設計思想(7)

開発効率化(6)

GAS(5)

アニメーション(5)

技術解説(4)

講座実施報告(5)

イミディエイトウィンドウ(4)

Googleスプレッドシート(4)

副業(4)

クリップボード(4)

条件付き書式(4)

その他(4)

ココナラ(3)

小説(3)

HTML(3)

JavaScript(3)

イベントプロシージャ(2)

Enum(2)

PDF(2)

フリーランス(2)

リスキリング(2)

数学(2)

Outlook(2)

介護(2)

Discord(2)

シフト表(2)

LookerStudio(2)

日報(2)

カレンダー(2)

罫線(2)

パズル(2)

小ネタ(2)

コード解説(2)

ステータスバー(1)

コード解析(1)

OneDrive(1)

バックアップ(1)

可変長引数配列(1)

ブック処理(1)

スクレイピング(1)

スプレッドシート(1)

coconala(1)

リボン登録マクロ(1)

QRコード(1)

実行予約(1)

給与計算(1)

VBA不使用(1)

リボン(1)

超勉強会(1)

スピログラフ(1)

図名描写(1)

連想配列(1)

溶接ロボット(1)

保育士(1)

楽天市場(1)

経理(1)

医療(1)

文書作成(1)

発注書(1)

ショートカット(1)

WebAPI(1)

色操作(1)

スーパー開発ショートカット(1)

ライブラリ処理(1)

放課後等デイサービス(1)

児童福祉支援(1)

学校(1)

UI(1)

CAD(1)

【設計思想】Excel VBAにおける「マクロ実行手段」一覧とその使い分け

【設計思想】Excel VBAにおける「マクロ実行手段」一覧とその使い分け
Excek VBA マクロ実行12パターンの使い分けマップ

Excel VBAの話をすると、「マクロって、ボタンを押したら実行されるものですよね」というイメージを持たれている方は多いと思います。


実際、シェイプやボタンにマクロを登録して実行する方法は、分かりやすく、実務でもよく使われる代表的なやり方です。


ただ、VBAでマクロを実行する方法はそれだけではありません。実は、

  • セルの操作をきっかけに自動で実行されたり

  • 時間をおいて定期的に実行されたり

  • ワークシート関数として計算の一部になっていたり

  • 右クリックやショートカット、リボン操作から実行されたり


といったように、マクロの実行手段には多くのパターンがあります。


本記事では、Excel VBAにおける マクロの実行手段(トリガー) を整理し、

  • どんな実行方法があるのか

  • それぞれは、どんな用途・場面に向いているのか

  • どのように使い分けると、マクロが「使いやすく」なるのか


といった点を、できるだけ分かりやすくまとめていきます。


これからExcel VBAでツールや業務マクロを作っていく方にとって、「どう書くか」だけでなく、「どう実行させるか」も含めてマクロを設計するその考え方を整理するきっかけになれば幸いです。


マクロ実行手段の全体像(設計マップ)


VBAの実行方法は、大きく次の観点で分類できます。

  • 誰が起動するか(ユーザー/Excel/外部/開発者)

  • いつ起動するか(手動/自動/時刻指定)

  • 何を目的にするか(処理実行/計算結果)


以下、代表的な実行手段を順に見ていきます。


① UI操作で実行する(ボタン・シェイプ)


ボタンからマクロ実行の例
ボタンからマクロ実行の例

代表例

  • シェイプに「マクロの登録」

  • フォームコントロール/ActiveXのボタン


向いている場面

  • ユーザーが「今、実行したい」と明確に意思を持つ処理

  • 集計、登録、出力、変換などの業務処理


設計思想

  • 誤作動を防ぎやすい

  • 実行前チェックを噛ませやすい

  • 「入口(Main)」を作って集約すると保守性が高い


ワークシート上で「このシートで、この処理を実行する」という使い方をする場合、最もよく使われるのが ボタン(シェイプ)からの実行 です。

たとえば、


  • 入力が終わったら集計したい

  • この表を元に登録処理を走らせたい

  • 作業が一区切りついたタイミングで出力したい


といったように、ユーザーの中で「今、実行する」というタイミングがはっきりしている処理では、ワークシート上にボタンを配置する形が非常に分かりやすくなります。


実務では、「このシートは入力用」「このボタンを押したら処理が走る」という役割分担をそのまま画面に表現できるため、説明がなくても直感的に使ってもらえるケースが多い印象です。


② リボンから実行する(カスタムUI)


リボン登録マクロの例
リボン登録マクロの例

実装方法

  • ブック内に Ribbon XML を持たせる

  • アドイン(.xlam)側でリボンを定義する※実装ルートは2通りあるが、思想は同じ


向いている場面

  • ツール化・配布・共通操作

  • 複数ブックで同じ操作体系を使いたい場合(どんなブックを開いていても実行できる!)


設計思想

  • 「プロ向けツール感」を出せる

  • コールバック設計を雑にすると後で詰む

  • 初期設計が超重要


リボンから実行するマクロは、

「どのブックを開いていても、いつでも実行したい処理」

に向いている実行手段です。

たとえば、社内向けにアドインを配布した場合、そのアドインにリボン登録されたマクロは、

  • マクロの有無に関係なく

  • 通常の .xlsx ブックを開いていても

  • 別の業務ブックを操作している最中でも


常に同じリボンタブから実行できる ようになります。

この感覚は、「特定のシートに付属したマクロ」というよりも、Excelそのものの機能を少し拡張するようなイメージに近いかもしれません。


よくあるリボン登録マクロの実行例

リボン登録マクロとしてよく使われる処理の例には、次のようなものがあります。

  • 選択中の範囲や表全体を、自動で見やすい表示(列幅・行高・表示倍率など)に整える処理

  • 現在アクティブなワークシートだけを、別ブックとして単体で保存する処理

  • 作業中のブックやシートの状態を判定し、共通のユーザーフォームや補助画面を起動する処理


参考

・リボンにマクロ登録をより効率的に行えるツール「リボンXMLエディター」を下記リンクで公開しています。


・すでにリボンにマクロが登録されたアドインツール「IkiKaiso2.xlam」は下記リンクで公開しています。


③ ショートカットキーで実行する


代表例

  • Application.OnKey による割り当て


向いている場面

  • 頻繁に使う軽量処理

  • 入力補助・整形・貼り付け支援など

  • 「ボタンを探すより一瞬で実行したい」処理


注意点

  • 既存ショートカットとの競合

  • ブック終了時に解除処理を忘れない


上記の2点は、ショートカットキー実行を扱ううえで特に注意しておきたいポイントです。


まず、既存ショートカットとの競合についてですが、Excelにはもともと多くのショートカットキーが割り当てられています。そこに Application.OnKey で独自の処理を割り当てると、本来のExcel標準ショートカットが使えなくなる ことがあります。


特に、他の人がそのブックやツールを使う場合、「いつもの操作が効かない」「意図せずマクロが実行された」といった混乱やストレスにつながる可能性があります。

そのため、割り当てるキーは普段使われにくい組み合わせ(Ctrl + Shift + 英字など) を選ぶのが無難です。


次に、解除処理の忘れについてです。Application.OnKey によるショートカット登録は、ブックを閉じただけでは自動的に解除されません


解除処理を行わないままブックを閉じてしまうと、

  • 別のブックを開いている状態で

  • 同じショートカットキーを押したときに

  • 閉じたはずのツール側マクロが実行されようとする


といった状況が発生します。


この場合、「マクロが見つかりません」といったエラーが出たり、意図しない処理が走ったりする原因になります。


そのため、ショートカットキーを使う場合は、登録処理と解除処理を必ずセットで設計する ことが重要です。具体的には、Workbook_Open で登録し、Workbook_BeforeClose で解除する、といった形にしておくと安全です。


この実行手段の位置づけとして

ショートカットキー実行は、「便利だからとりあえず登録する」ものではなく、

頻繁に使う処理だけを、限定的に割り当てる

という使い方をしたときに、最も効果を発揮する実行手段です。

便利さと同時に注意点も多いため、仕組みを理解したうえで慎重に使うという前提で設計するのがおすすめです。


④ 右クリック(コンテキストメニュー)から実行する


代表例

  • CommandBars にメニューを追加

コンテキストメニューにマクロ登録例
コンテキストメニューにマクロ登録例

向いている場面

  • 「今このセル・範囲でやりたい」処理

  • 入力補助、整形、変換など、軽量で頻繁な処理

  • 作業の流れを止めたくないUI(ボタンを探す手間を消す)


設計思想

  • 便利だが管理が甘いと ゴミメニュー地獄 になる

  • 追加・削除は必ずセットで考える


右クリック(コンテキストメニュー)へのマクロ追加は、UIとしては非常に強力 ですが、同時に 最も荒れやすい実行手段 でもあります。


理由は単純で、「追加するのが簡単なわりに、削除を忘れやすい」という性質を持っているからです。


削除処理を考えずに実装してしまうと、

  • 同じメニュー項目が何度も追加される

  • 使わなくなった項目が残り続ける

  • どのブックが追加したメニューなのか分からなくなる


といった状態になり、気づいたときには 右クリックメニューが実用に耐えない状態 になります。これが、いわゆる「ゴミメニュー地獄」です。


そのため、コンテキストメニューを扱う場合は、「追加処理を書く=削除処理を書く」という意識を、設計段階から持っておく必要があります。


実務では、

  • ブックを開いたときに追加

  • ブックを閉じるときに必ず削除


といった形で、ライフサイクルとセットで管理する設計 が最も安全です。


また、コンテキストメニューは「どこでも同じように使える汎用UI」ではありません。


セルを選択しているとき、シェイプを選択しているとき、テーブル内を選択しているときなど、状況ごとに別のメニューが表示される ため、

  • 想定した場面では使える

  • それ以外の場面では出ない、または意味を持たない


というケースも多くなります。


そのため設計思想としては、

「ここでしか使わない処理を、ここに置く」

という割り切りが重要です。

万能な実行手段として使おうとせず、対象・場面・寿命が明確な処理だけに限定して使うこれが、コンテキストメニューを安全に活かすための考え方になります。


⑤ 開発タブ → マクロ一覧から実行


開発タブ → マクロ一覧から実行
開発タブからマクロ一覧

位置づけ

  • 運用では基本使わない

  • 臨時実行・確認用


設計思想

  • 一般ユーザー向けの導線には不向き

  • 「存在は知っておく」レベル


「開発タブ → マクロ一覧から実行」は、Excel VBA において 最も基本的で原始的な実行方法 ではありますが、実運用でユーザーに使わせる前提の実行手段ではありません。


この方法は、

  • 開発者が動作確認をしたい

  • 一時的にマクロを手動実行したい

  • 処理のテストや検証を行いたい


といった 開発・確認フェーズ で使うためのものです。


一方で、これをユーザー向けの操作手順として案内してしまうと、

  • 開発タブを表示する必要がある

  • マクロ一覧から対象を探して選択する必要がある

  • 似た名前のマクロを誤って実行する可能性がある


など、操作の手間もミスのリスクも大きくなります。

そのため実務では、

「このツールは、開発タブのマクロ一覧から実行してください」

という設計を あえて採用しない のが基本的な考え方になります。

運用を前提としたツールであれば、必ず

  • ボタン

  • リボン

  • ショートカット

  • 右クリック


といった、意図した操作導線にマクロを集約する ことで、ユーザーが迷わず、安全に使える設計にします。


この実行方法については、「こういう仕組みがある」ということを 知識として把握しておく 程度に留め、実際のツール設計では使わない、という位置づけで捉えるのが現実的です。


⑥ ユーザー定義関数(UDF)として実行する


代表例

ユーザー定義関数の例
ユーザー定義関数の例

向いている場面

  • 計算結果をセルに返したい処理

  • 再計算(再評価)と連動させたいロジック

  • セル参照を引数として扱いたい処理


重要な注意

  • 副作用NG(書き込み・保存・UI操作など)

  • 重い処理は不向き


ユーザー定義関数(UDF)を設計するうえで、この2点は 必ず意識しておくべき前提条件 です。


まず、副作用がある処理はNG という点についてです。UDFは、Excelの再計算タイミングに応じて自動的かつ頻繁に実行される 仕組みになっています。


そのため、UDFの中で

  • セルへの書き込み

  • ファイルの保存・読み込み

  • シートの切り替え

  • メッセージボックスなどのUI操作


といった処理を行うと、再計算のたびにそれらが実行されてしまい、意図しない挙動や不安定な動作の原因 になります。

UDFはあくまで、

「引数を受け取り、計算して、値を返すだけ」

という 純粋な関数 として設計することが重要です。


次に、重い処理は不向き という点です。UDFは、セルの変更や再計算が発生するたびに呼び出されるため、

  • ループ回数が多い

  • 複雑な文字列処理を行う

  • 大量の配列計算を含む


といった処理を組み込むと、シート全体の再計算が極端に遅くなります。


特に、UDFを複数セルにコピーして使用した場合、その処理がセル数分だけ実行される ことになるため、想像以上にパフォーマンスへ影響します。


そのため設計思想としては、

「軽い・限定的・計算特化」な処理だけをUDFにする

という割り切りが重要になります。


複雑な業務処理や、一度だけ実行すればよい処理については、ボタン実行やリボン実行など、別の実行手段に切り分ける 方が安全で保守性も高くなります。


参考

ユーザー定義関数の実際の案件での実装例としてスプライン補間関数の実装というものもあります。


イベントで自動実行する


代表例

  • Worksheet_Change(セルの値が変更されたとき)

  • Worksheet_BeforeDoubleClick(セルをダブルクリックしたとき)

  • Worksheet_SelectionChange(選択セルが変わったとき)

  • Workbook_Open(ブックを開いたとき)

  • Workbook_BeforeClose(ブックを閉じる直前)

  • Workbook_SheetChange(どこかのシートが変更されたとき)


向いている場面

  • 入力補助

  • 自動整形

  • 変更監視・ログ


特に、

「ユーザーが意識せずに処理が走る方が自然な操作」

という場面で真価を発揮します。


設計思想(超重要)

  • イベントは 入口だけ

  • 実処理は通常プロシージャへ分離

  • EnableEvents 制御を徹底しないと事故る


具体的な活用イメージ(分かりやすい例)

イベント処理は、入力補助を目的とした使い方 が最も多く、効果も分かりやすいです。


例1:セルをダブルクリックしたら値を切り替える

たとえば、

  • ダブルクリックするたびに

    • 「○ → △ → ×」

    • 「未対応 → 対応中 → 完了」


といった値を 順番に自動切り替え するような処理です。


これにより、

  • 手入力やプルダウン操作が不要

  • マウス操作だけで完結


といった、現場での入力スピード向上 に直結します。



例2:入力内容に応じて自動で整形・補助する

Worksheet_Change を使えば、

  • 数値が入力されたら自動で書式を整える

  • 特定の値が入ったら色を変える

  • 入力ミスっぽい値を検知して警告する


といった、「入力した瞬間に補助がかかるUI」 を実現できます。


ユーザーは「マクロを使っている」意識すら持たずに操作できます。



例3:ブックを開いたときに自動処理を行う

Workbook_Open を使うことで、

  • 起動時に初期設定を行う

  • 必要な情報を読み込む

  • 注意事項やお知らせメッセージを表示する


といった処理を、ブックを開くだけで自動実行 できます。

逆に、Workbook_BeforeClose では、

  • ログの保存

  • 一時データの削除

  • 設定の後片付け

などを行うことで、ツールの終了処理を安全にまとめる ことができます。


⑧ 即時実行①:Call(固定呼び出し)


こちらは VBA のコード内から、別のプロシージャを Call で呼び出して実行する方法です。


単に処理を呼び出しているだけなので、マクロの「実行手段」として分類するのは少し分かりづらいかもしれませんが、実務上は、すべての実行経路の最終的な呼び出し先になります。


そのため、本記事では実行手段の一つとして位置づけていますが、詳しい構文や使い方の説明については、ここでは割愛しています。

⑨ 即時実行②:Application.Run(文字列指定)



特徴

  • 実行プロシージャ名を文字列で指定

  • 動的に呼び先を切り替え可能


向いている場面

  • アドイン・別ブック呼び出し

  • 実行対象を動的に切り替えたい特殊ケース

  • OnTime と組み合わせる設計


注意

  • IntelliSenseが効かない

  • 保守性は Call より落ちる


Application.Run は、⑧の Call(固定呼び出し) と同じく、VBA のコードから別のプロシージャを即時実行する方法です。


違いは、実行したいプロシージャ名を 文字列として指定する点 にあります。この文字列を変数などで動的に切り替えることで、状況に応じて実行するマクロを柔軟に変更できるのが最大の特徴です。


そのため、「どのマクロを実行するかを実行時に決めたい」「アドインや別ブック内の処理を切り替えたい」といったケースでは有効な選択肢になります。


一方で、文字列指定のため IntelliSense が効かず、名前変更や構成変更に弱い点には注意が必要です。通常の業務ロジックでは Call を基本とし、動的切り替えが必要な場面に限定して使うのが設計上のポイントです。


実装例:スーパー開発ショートカット

Application.Run を用いた実装例として、当方が公開している「スーパー開発ショートカット」というツールがあります。

このツールは、あらかじめ設定したマクロ名をテキスト情報として管理し、キー操作一つで対応するマクロを実行できる仕組みになっています。内部的には、実行対象となるプロシージャ名を文字列として読み込み、その文字列を Application.Run に渡すことで、動的に実行マクロを切り替えています。


このように、実行する処理をコード側で固定せず、外部設定や状況に応じて柔軟に変更したい場合、Application.Run は非常に有効です。一方で、通常の業務ロジックでは Call による固定呼び出しを基本とし、このような動的実行が必要な場面に限定して使うことが、保守性を保つ上で重要な設計ポイントになります。



⑩ 予約実行(時間をおいて実行する)


代表例

  • Application.OnTime


本質

「今ではなく、少し後で指定したプロシージャを実行する」

よくある用途

  • 定期バックアップ

  • 定期監視(疑似ポーリング)

  • 処理完了待ち(1秒後実行など)


設計上の注意

  • キャンセル設計必須

  • 多重予約防止

  • Excel起動中が前提


サンプルコード

  • ○秒後で実行

  • 指定日時で実行


  • 引数を渡す場合


 引数付きで Application.OnTime を使う場合、 実行するプロシージャ名だけでなく 引数まで含めた文字列 を Procedure に渡す必要があります。


 その際、ブック名! を付けたうえで、「プロシージャ名+引数」をシングルクォーテーションで囲む という指定が必須になります。 この指定を誤ると、正しく実行・キャンセルできないため注意が必要です。


 ただ記述方法はあまりにもめんどくさいので、それを簡単にするための汎用プロシージャもおいておきます。「実行時刻」「実行するプロシージャ名」「実行元のワークブックオブジェクト」「引数(複数指定可能)」を引数として与えるだけで特定のプロシージャを予約実行が出来る仕組みです。


Application.OnTime は、「今すぐではなく、指定した時刻にプロシージャを実行する」ための仕組みです。即時実行(Call や Application.Run)が“その場で処理を流す”のに対し、OnTime は“時間をまたいで処理を動かす”点が大きな違いになります。


実務でよく使われる用途としては、定期バックアップ、定期監視(疑似ポーリング)、処理完了待ちなどが代表的です。特に私自身がよく使っているのが、アドインや業務ブックの定期自動保存・バックアップです。

Excel は予期せずクラッシュすることもあり、もし1時間保存していなければ、その1時間分の作業がすべて失われることもあります。

それを防ぐために、数分おきに OnTime で保存処理を予約し、「保険」として常にバックアップを取る設計を行うことがあります。


また、定期的にデータを取得・更新する処理にも OnTime は有効です。過去には楽天RSSを利用した投資系ツールで、1分おきに価格データを取得し、一定時間ごとに売買判定を行う仕組みを構築しました。このように、Excel単体ではタイマー処理を持たないため、OnTime を使うことで「一定間隔で処理を回す」ことが可能になります。


一方で、設計上の注意点も重要です。OnTime は予約が積み重なると多重実行の原因になるため、キャンセル設計は必須です。また、Excelが起動していることが前提となるため、常駐処理やサーバー用途には向きません。あくまで「Excelが開いている間に、軽めの定期処理を安全に回す」ための仕組みとして位置づけるのが、実務的には最も安定します。


⑪ 外部から実行する(OSトリガー)


代表例

  • タスクスケジューラ → PowerShell → Excel


向いている場面

  • 夜間バッチ

  • 無人運用

  • OnTimeでは不安定な定時処理


設計思想

  • Excelを「ツール」として使う発想

  • 再起動・失敗時の復帰設計まで含める


実行イメージ(よくある実例)

たとえば、毎朝 6:00 に PC が起動している状態で、売上集計マクロを自動実行するといったケースです。

  1. Windowsの タスク スケジューラ に実行時刻(毎日6:00)を設定

  2. タスクから PowerShell スクリプト を起動

  3. PowerShell が Excel を起動し、指定ブックを開く

  4. Application.Run で特定のマクロを実行

  5. 処理完了後、保存して Excel を終了

この仕組みを使えば、「誰も触らなくても、決まった時刻にExcel処理が完了している」という運用が可能になります。


⑫ 開発者専用の実行方法


代表例

  • VBEで F5

  • イミディエイトウィンドウから Call


位置づけ

  • 開発・テスト専用

  • 運用導線に混ぜない


活用例

活用例①

デバッグ中にイミディエイトウィンドウで実行して配列の中身をきれいに表示する関数https://www.softex-celware.com/post/__dpa


配列処理のデバッグでは、ウォッチや Debug.Print だけでは全体像が把握しづらい場面が多くあります。本記事で紹介している関数は、イミディエイトウィンドウから実行するだけで、一次元・二次元配列の中身を整形して一覧表示できるため、ロジック確認や不具合特定を高速化できます。開発者専用の強力なデバッグ補助ツールです。


活用例②

イミディエイトウィンドウで実行してコードを半自動生成し、クリップボードに格納する仕組み


この活用例では、イミディエイトウィンドウから特定のプロシージャを実行することで、定型コードやテンプレートコードを自動生成し、そのままクリップボードへ格納します。手入力やコピペの手間を減らし、思考を止めずにコーディングを進められる点が大きなメリットです。開発効率を重視する人向けの実践例です。


まとめ:実行手段は「設計判断」


最後に、超要約するとこうなります。

  • ユーザーに押させる → ボタン/リボン/右クリック

  • 計算として使う → UDF

  • 勝手に動かす → イベント

  • 時間で回す → OnTime/外部スケジューラ

  • 内部設計 → Call/Run


本記事では、Excel VBA におけるマクロの実行手段を、全部で 12パターン 整理してきました。普段は無意識に使っている実行方法も、「選択肢として整理して把握する」ことで、開発時の判断精度は大きく変わります。


たとえば、・開発中は イミディエイトウィンドウ を使えば高速に検証できる・業務ツールとしては ボタン・リボン・右クリック が適している・自動化したい処理は イベントや OnTime、外部トリガー を選ぶといったように、「処理内容」ではなく「起動のさせ方」から設計を考えられるようになります。


これらの実行パターンを頭の引き出しとして持っておくことで、「なぜこの実行方法なのか」を説明できるツール設計が可能になり、結果として 使いやすく、壊れにくく、引き継げる VBA を作れるようになります。


Excel VBAによる業務自動化・ツール開発をご検討の方へ

​"脱Excel"の前に、現状のExcelの潜在能力を120%発揮してみませんか?

Softex-Celware

​インボイス登録番号:T5810983887134

  • Facebook
  • Twitter
  • YouTube

©2023 softex-celware。Wix.com で作成されました。

bottom of page