日程Fit|「いつ空いてますか?」の往復はもう不要。候補日を選んでURLを送るだけ|登録不要|今すぐ無料で使う →

Word(docm)で画像クリックからVBAマクロを起動する方法|ActiveX無効(Microsoft 365/Office 365)対策

Microsoft 365(Office 365)環境で ActiveX が無効化されると、これまで Word の .docm で「画像(アイコン)をクリックして VBA マクロを起動する」仕組みが突然使えなくなることがあります。本記事では ActiveX を使わずに同等の導線を作る方法を、手順・コード・運用の注意点までまとめて解説します。

日程Fit。無料・登録不要。「いつ空いてる?」を、ひとつのリンクで。リンクを送って、○△×でかんたん日程調整。無料で日程を作る。
目次

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_Printbtn_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/ブックマーク名)と、マクロ運用(信頼済み場所・配布方法)までセットで整えることです。ここまで整えば、環境変化に強い “押せるアイコン” を長期的に維持できます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次