Microsoft 365(Office 365)環境で ActiveX が無効化されると、これまで Word の .docm で「画像(アイコン)をクリックして VBA マクロを起動する」仕組みが突然使えなくなることがあります。本記事では ActiveX を使わずに同等の導線を作る方法を、手順・コード・運用の注意点までまとめて解説します。
ActiveX が無効になると何が起きるのか
Word で「画像をクリックしてマクロを実行する」を実現していた方の多くは、過去に ActiveX の画像コントロール(Image Control)を使っていたはずです。これは Word の「開発」タブにある レガシツール(Legacy Tools)配下の ActiveX コントロールで、クリックイベントを持ち、VBA と組み合わせやすい反面、セキュリティ上の理由から組織ポリシーや更新により 無効化されやすいのが弱点です。
ActiveX が無効化された環境では、次のような症状になりがちです。
- ActiveX コントロールが表示されない/静止画像のようになって反応しない
- 開いた瞬間に警告が出る、またはコントロール部分がエラー表示になる
- 「昨日は動いたのに今日は動かない」「今日は逆に動いた」など、更新やポリシー適用タイミングで挙動が変わる
重要なのは、ActiveX が無効になっても .docm の VBA マクロ自体が必ずしも全滅するわけではないという点です。つまり「ActiveX に依存していたクリック導線」を、非 ActiveX の仕組みへ置き換えれば、引き続きマクロ起動の体験を維持できます。
ActiveX を使わずに「画像クリック→マクロ」を実現する全体像
現実的な置き換え先は大きく分けて次の系統です。
| 方式 | 見た目 | 起動のきっかけ | メリット | 注意点 |
|---|---|---|---|---|
| 画像コンテンツコントロール+イベント | 画像を置ける(アイコン可) | クリックを含む「カーソルが入る」動作 | ActiveX 不要/画像のまま置き換えできる | 純粋なクリックイベントではない(誤爆対策が必要) |
| MacroButton フィールド | 基本は文字(疑似アイコン可) | 文字をクリック | 構造がシンプル/壊れにくい | 画像表示は前提ではない |
| 画像+ハイパーリンク+Application イベント(上級) | 画像をクリックできる | 画像クリック(リンク) | 「クリック感」を最も再現しやすい | 実装が少し難しい/イベント配線が必要 |
この中で、「画像のまま置き換えたい」なら画像コンテンツコントロールが第一候補です。とにかく手軽に安定させたいなら MacroButton、クリック挙動を限りなく再現したいなら上級者向けのリンク+イベントが刺さります。
画像コンテンツコントロールで擬似クリックを作る
仕組み:クリックではなく「カーソルが入った瞬間」を拾う
画像コンテンツコントロール(Picture Content Control)は ActiveX ではありません。一方でこのコントロール自体に「クリックイベント」は用意されていません。そこで Word のドキュメントイベントである Document_ContentControlOnEnter を使い、カーソルがそのコントロール内に入ったタイミングでマクロを呼ぶ、という設計にします。
結果として、次の操作で発火します。
- 画像(コントロール)をクリックしてカーソルが入った
- Tab 移動などでコントロールにフォーカスが移った
- 矢印キー移動などで結果的にコントロール範囲へ入った
「クリックだけで動いてほしい」要求には完全一致しませんが、実務的にはほぼ同等の導線として成立しやすいのがこの方法です。
挿入手順(Developer タブから)
まず、ActiveX と混同しないように「どのボタンを押すか」を丁寧に確認します。
| 場所 | 名前 | ActiveX | ポイント |
|---|---|---|---|
| 開発タブ → コントロール(上段) | 画像コンテンツコントロール | いいえ | 今回使う。通常は ActiveX 無効でも利用可能 |
| 開発タブ → レガシツール → ActiveX コントロール | Image(画像)など | はい | 今回避ける。無効化の対象になりやすい |
具体的な手順は次の通りです。
- 「開発」タブを表示する(未表示なら)
ファイル → オプション → リボンのユーザー設定 →「開発」にチェック - 開発 →(上段の)コントロール → 画像コンテンツコントロールを挿入する
- 挿入された枠の中に、アイコン画像を入れる(画像を貼り付け/挿入)
- そのコンテンツコントロールを選択し、プロパティを開く
- タイトル(Title)を一意に設定する(例:RunMySub)
運用で増える想定なら、命名ルールを決めておくのがコツ(例:btn_Print、btn_ExportPDF)
この「Title が一意」という条件が、後でイベント側の分岐を明快にしてくれます。
VBA コード(ThisDocument に書く)
VBA エディター(Alt + F11)を開き、対象ドキュメントの ThisDocument に次のように記述します。
Option Explicit
Private Sub Document_ContentControlOnEnter(ByVal ContentControl As ContentControl)
If ContentControl.Title = "RunMySub" Then
Call YourSubroutineName
End If
End Sub
呼び出される側(例:標準モジュール Module1 など)には、実行したいサブルーチンを用意します。
Option Explicit
Public Sub YourSubroutineName()
MsgBox "アイコンからマクロを起動しました。"
End Sub
これで、画像コンテンツコントロールへカーソルが入ったタイミングでマクロが走ります。保存形式は .docm が必須です。
複数アイコンを置くときの分岐テンプレ
実務では「印刷」「PDF化」「データ取り込み」など複数のアイコンが並びがちです。Title 別に分岐するテンプレを最初から用意しておくと、後が楽になります。
Option Explicit
Private Sub Document_ContentControlOnEnter(ByVal cc As ContentControl)
On Error GoTo EH
Select Case cc.Title
Case "btn_Print"
Call Macro_Print
Case "btn_ExportPDF"
Call Macro_ExportPDF
Case "btn_OpenFolder"
Call Macro_OpenFolder
Case Else
' 何もしない
End Select
Exit Sub
EH:
MsgBox "処理中にエラーが発生しました: " & Err.Number & vbCrLf & Err.Description, vbExclamation
End Sub
呼び出し先のマクロは標準モジュールにまとめると管理しやすいです。
Option Explicit
Public Sub Macro_Print()
' 例:印刷ダイアログ
Application.Dialogs(wdDialogFilePrint).Show
End Sub
Public Sub Macro_ExportPDF()
' 例:PDF 出力(パスは必要に応じて変更)
Dim outPath As String
outPath = ThisDocument.Path & "\export.pdf"
ThisDocument.ExportAsFixedFormat OutputFileName:=outPath, ExportFormat:=wdExportFormatPDF
MsgBox "PDF を出力しました: " & outPath
End Sub
Public Sub Macro_OpenFolder()
' 例:ドキュメントのフォルダを開く
If ThisDocument.Path <> "" Then
Shell "explorer.exe """ & ThisDocument.Path & """", vbNormalFocus
Else
MsgBox "まだ保存されていないため、フォルダを開けません。"
End If
End Sub
誤爆を減らす工夫
OnEnter は「クリック」以外でも発火するため、使い方によっては誤爆と感じることがあります。現場で効きやすい対策をまとめます。
- アイコンを押したら実行という UX に寄せたいなら、アイコンの周りに余白を取り、カーソル移動で入り込みにくい配置にする
- 連続発火を避けたいなら、直前に実行した Titleを保持し、同一 Title で短時間に繰り返し起動しないガードを入れる
- マクロ側で「実行しますか?」確認を出す(重要な処理だけ)
例えば、同じアイコンが連続して選択されたときに二重起動しない簡易ガードは次のように書けます。
Option Explicit
Private mLastTitle As String
Private mLastTime As Single
Private Sub Document_ContentControlOnEnter(ByVal cc As ContentControl)
' 0.8 秒以内に同じ Title が続いたら無視(誤爆/二重起動対策)
If cc.Title = mLastTitle Then
If Timer - mLastTime < 0.8 Then Exit Sub
End If
mLastTitle = cc.Title
mLastTime = Timer
Select Case cc.Title
Case "btn_ExportPDF"
Call Macro_ExportPDF
Case "btn_Print"
Call Macro_Print
End Select
End Sub
このあたりは「実行対象のマクロが重いか」「誤爆すると困るか」で閾値を調整してください。
レイアウト崩れを防ぐ配置のコツ
アイコンを「ボタンのように」並べるときは、Word のレイアウトが崩れやすいのが悩みどころです。コンテンツコントロールを使う場合、次の配置が安定します。
- 1行テーブル(セル)にアイコンを入れる:配置がずれにくく、クリックも狙いやすい
- 表の罫線を非表示にして「ボタン列」のように見せる
- アイコンのサイズを統一し、段落の前後間隔を 0 に寄せる
表の中に置く構成は地味ですが、配布する .docm を長期運用する場合に効きます。
MacroButton フィールドで簡単にマクロを呼ぶ
「画像じゃなくてもいい」「とにかく壊れない導線にしたい」という場合、MacroButton フィールドは強力です。クリックできるテキスト(または記号)を置き、そのクリックでマクロを呼びます。Word のバージョンによっては 画像表示を前提にできないため、ここは割り切りが必要です。
挿入手順(Ctrl + F9 でフィールド作成)
- マクロを呼びたい場所にカーソルを置く
- Ctrl + F9 でフィールドの波括弧を挿入(キーボード操作推奨)
- 次のように入力する(表示文字は任意)
{ MACROBUTTON YourSubroutineName クリックして実行 }
入力後、フィールドを選択して F9 で更新すると、表示文字がクリック可能になります。マクロ名(YourSubroutineName)は、VBA で定義されている Public Sub の名前に合わせてください。
アイコン風に見せるテクニック
MacroButton は基本的にテキストなので、ボタンっぽさを出すには工夫します。使いやすいのは次のパターンです。
- 記号フォント(Wingdings / Webdings)で疑似アイコンにする
- 絵文字(🔍📄🖨️など)を表示文字にしてクリック領域にする
- フォントサイズを大きくし、背景の網掛け(段落の網掛け)でボタン感を出す
- 表セルに入れて枠線・余白を調整し、クリックしやすい領域にする
例えば「🖨️ 印刷」のように、絵文字+短いラベルを使うと、画像を使わずともユーザーは直感的に操作できます。社内配布でフォント環境が揃わない可能性がある場合は、Wingdings の多用より 短い日本語+シンプルな記号の方が事故が少ないです。
上級者向け:画像にハイパーリンクを付けて「本当のクリック」で動かす
画像コンテンツコントロール方式は「OnEnter」なので、どうしてもクリック以外でも起動し得ます。もし “画像をクリックしたときだけ”の感覚を強く再現したいなら、画像にハイパーリンクを付け、クリック時に発生するイベントを拾ってマクロへつなぐ方法が候補になります。
どんな場面で有効か
- Tab 移動やカーソル移動での誤起動を極力避けたい
- 「このアイコンを押したときだけ実行」という UI を強く守りたい
- アイコン数が多く、OnEnter 方式だと誤爆が増える
仕組みとしては、画像クリック=リンククリックをトリガーにして、VBA でリンク移動をキャンセルしつつマクロだけ実行します。ActiveX は使いません。
設定手順(ブックマーク+リンク)
- ドキュメント内に「リンク先の目印」を作るため、どこかにブックマークを作成(例:bm_RunPrint)
例:文末に「(空行)」を置き、その範囲を選択して 挿入 → ブックマーク で作成 - アイコン画像を挿入し、画像にハイパーリンクを設定
挿入 → リンク(または右クリック → リンク)で「このドキュメント内」を選び、先ほどのブックマークへリンク - VBA で「ハイパーリンクがクリックされる直前」を捕まえ、対象ならキャンセルしてマクロを実行
VBA コード(Application イベントで捕まえる)
この方式は Word の Application イベントを使うため、VBA 側の構成が少し増えます。手順は次の通りです。
- VBA エディターで クラスモジュールを追加し、名前を AppEvents にする
- AppEvents にイベントハンドラを書く
- ThisDocument で AppEvents を生成してイベントを有効化する
AppEvents(クラスモジュール)
Option Explicit
Public WithEvents App As Word.Application
Private Sub App_DocumentBeforeFollowHyperlink(ByVal Doc As Document, ByVal Target As Hyperlink, Cancel As Boolean)
' 画像に付けた「このドキュメント内リンク(ブックマーク)」を判定
' Target.SubAddress にブックマーク名が入ることが多い
If Doc Is Nothing Then Exit Sub
Select Case Target.SubAddress
Case "bm_RunPrint"
Cancel = True
Call Macro_Print
Case "bm_ExportPDF"
Cancel = True
Call Macro_ExportPDF
Case Else
' 通常のリンクはそのまま
End Select
End Sub
ThisDocument(ドキュメントモジュール)
Option Explicit
Private gAppEvents As AppEvents
Private Sub Document_Open()
Set gAppEvents = New AppEvents
Set gAppEvents.App = Word.Application
End Sub
Private Sub Document_Close()
Set gAppEvents = Nothing
End Sub
この構成にすると、画像クリックでリンクが走る前にイベントで捕捉できるため、「クリックしたときだけ起動する」感覚に寄せやすくなります。リンクの SubAddress(ブックマーク名)を分岐キーにできるので、アイコンが増えても管理しやすいのも利点です。
ただし、Application イベントの配線は慣れていないとミスしやすいので、初めて試す場合は「まず 1 個のアイコンだけ」で動作確認してから拡張するのが安全です。
ActiveX からの置き換えチェックリスト
「以前は ActiveX の Image Control で作っていた」場合、移行時に抜け漏れが起きやすいポイントをチェックリスト化します。
| チェック項目 | 確認ポイント | 対処 |
|---|---|---|
| ActiveX を使っていないか | 開発 → レガシツール → ActiveX コントロール配下の部品が残っていない | 削除し、画像コンテンツコントロール/リンク方式へ置換 |
| 保存形式 | .docm になっている | docx で保存し直すとイベントが消えるので注意 |
| イベントコードの場所 | ThisDocument に書いている | 標準モジュールではなく ThisDocument(イベント)へ |
| Title / ブックマーク名の一意性 | アイコンごとに識別子が重複していない | btn_ などの命名ルールで統一 |
| 配置の安定性 | ユーザーが編集してもアイコンがずれない | テーブル配置、余白統一、段落間隔調整 |
動かないときに見るポイント
「コードを書いたのに何も起きない」場合、原因はほぼ次のどれかです。
| 症状 | よくある原因 | 確認・対処 |
|---|---|---|
| まったく発火しない | マクロが無効、保護ビュー、信頼されていない | ファイルのプロパティ(ブロック解除)/信頼済み場所/保護ビュー解除を確認 |
| コンパイルエラーになる | イベント名・引数が誤り、記述場所が違う | ThisDocument に正しいイベントプロシージャ名で記述する |
| 違うマクロが動く | Title やブックマーク名が重複・コピペで混線 | 識別子を一覧化し、重複を潰す |
| 勝手に連続起動する | OnEnter の特性、クリック後もフォーカス移動で再入 | 二重起動ガード(タイマー/直前 Title)を入れる |
| 配布先でだけ動かない | 社内ポリシーでマクロ自体がブロック | 運用ルール(信頼済み場所、署名、許可ポリシー)を整備 |
運用面の注意:マクロの許可、信頼済み場所、社内ポリシー
ActiveX を捨てても、マクロ実行そのものが制限されている環境では動きません。特に配布前提なら、次の方針を最初に決めておくとトラブルが激減します。
- 信頼済み場所(Trusted Locations)に置く運用にする(社内共有フォルダなど)
- 可能なら デジタル署名されたマクロにして、許可ルールを作る
- 「誰が配布し、誰が更新し、どこに置くか」を決め、勝手なコピー運用を避ける
- 変更が多い場合は .docm ではなく .dotm(テンプレート)運用に寄せる(更新配布が楽になる)
また、ActiveX 無効化とマクロ無効化は別物ですが、現場では同時に強化されることがあります。「ActiveX をやめたのにまだ動かない」場合は、マクロの許可状態(保護ビュー、ファイルブロック、ポリシー)を切り分けてください。
まとめ
Microsoft 365 で ActiveX が無効化されても、Word の .docm で「アイコンを押して処理を走らせる」導線は作れます。現実解としては、画像コンテンツコントロール+ドキュメントイベントで置換するのが最も移行しやすく、次点で MacroButtonが堅牢です。クリック挙動に強くこだわるなら、画像リンク+ Application イベントという上級手段もあります。
大事なのは「ActiveX を捨てる」だけでなく、識別子の設計(Title/ブックマーク名)と、マクロ運用(信頼済み場所・配布方法)までセットで整えることです。ここまで整えば、環境変化に強い “押せるアイコン” を長期的に維持できます。

コメント