ワードのマクロ起動は文字列のダブルクリックで行う

スタイル

VBAアセットでは、Word文書内の特定の文字列をダブルクリックすることで、あらかじめ設定したマクロを起動させる手法を用いています。

1. この手法が必要となる理由

Excel VBAには、セルをダブルクリックしたときにマクロを実行する便利なイベント(Worksheet_BeforeDoubleClick)が標準で用意されています。しかし、Word VBAには、これに相当する「特定の場所をダブルクリックしたとき」に発生するイベントが存在しません。

文書内の特定の文字や表のセルをボタンのように扱い、直感的にマクロを実行したい場合、Wordの標準イベントであるWindowSelectionChange(選択範囲が変更されたときに発生)を利用することも考えられます。ただし、この方法はカーソルが移動するたびに不要な処理が走るため、動作が重くなるほか、予期せぬ不具合を引き起こす原因となります。

そのため、文書の体裁を崩すことなく、特定箇所の操作のみを安全に検知する代替手段が必要となります。

2. この手法の概要

Wordに標準で備わっているフィールド機能の一つである「MACROBUTTON(マクロボタン)」を活用します。

文書内の任意の文字列をMACROBUTTONフィールドとして定義し、そこに実行したいVBAのマクロを紐づけます。これにより、ユーザーがその文字列をダブルクリック(設定によってはシングルクリック)したタイミングで、指定されたマクロが起動するようになります。

3. この手法のメリット・デメリット

この手法には、以下のような特徴があります。

メリット

  • 直感的な操作性: Excelのセルをダブルクリックする感覚で、ユーザーにとって分かりやすく手軽にマクロを実行できます。
  • レイアウトへの適応性: ActiveXコントロールのコマンドボタンなどとは異なり、通常のテキストと同じように扱えるため、行間やフォント設定など、文書の体裁を一切崩しません。
  • 安定性: 指定した文字列を操作したときのみマクロが実行されるため、無駄な処理が発生せず、意図しない誤作動を防止できます。

デメリット

  • 視認性の問題: 初期状態では通常の文字列と見分けがつかないため、ユーザーが「そこをダブルクリックできること」に気づきにくい場合があります。必要に応じて、文字色を青くする、下線を引くなどの視覚的な工夫が有効です。
  • 多重起動のリスク: ユーザーが連続してダブルクリック(連打)を行うと、マクロの処理が終わる前に同じマクロが重複して起動し、エラーや意図しない動作を引き起こすおそれがあります(この問題は、後述するVBAのコードによって解決できます)。

4. この手法の具体的内容

この手法を実現するための、Word上での設定方法およびVBAでのコードの書き方を解説します。

Wordでの設定の仕方(MACROBUTTONの挿入)

Wordの文書上でMACROBUTTONフィールドを挿入するには、ショートカットキーを使う方法と、リボンのメニューから操作する方法の2通りがあります。

方法1:ショートカットキーを使う方法(手入力)

  1. マクロを割り当てたい場所にカーソルを合わせ、Ctrlキーを押しながらF9キーを押します。グレーの網掛けがかかったフィールドコードの枠 { } が挿入されます。
  2. 枠の中に MACROBUTTON、実行したいマクロ名、表示させたい文字列を半角スペースで区切って入力します。
    • (入力例) { MACROBUTTON TogglePartyCircle 原告・被告 }
  3. Altキーを押しながらF9キーを押して、フィールドコードを非表示(実行結果の表示)に切り替えます。
  4. 画面上は「原告・被告」という文字列のみが表示され、これをダブルクリックすると TogglePartyCircle マクロが実行されるようになります。

方法2:リボンのメニューから挿入する方法(マウス操作)

キーボードによる直接入力に慣れていない場合は、以下の手順でダイアログボックスから設定できます。

  1. マクロを割り当てたい場所にカーソルを合わせます。
  2. リボンの「挿入」タブを開き、「テキスト」グループにある「クイックパーツ」をクリックし、さらに「フィールド」を選択します。
  3. 「フィールド」ダイアログボックスが開きます。左側の「フィールドの名前」リストから MacroButton を選択します。
  4. 中央の「マクロ名」リストから、割り当てたいマクロを選択します。
  5. 「表示テキスト」の欄に、画面に表示させたい文字列(例:原告・被告)を入力し、「OK」をクリックします。

登録したマクロや表示文字列を変更する方法

設定後に、実行するマクロや画面に表示される文字列を変更したい場合は、以下のいずれかの方法で修正できます。

方法1:ダイアログボックスから変更する(フィールドの編集)

  1. 対象の文字列(上記の手順で作成したMACROBUTTON)の上で右クリックし、表示されたメニューから「フィールドの編集」を選択します。
  2. 「フィールド」ダイアログボックスが開きます。
  3. 左側の「フィールドの名前」リストで MacroButton が選択されていることを確認します。
  4. 中央の「マクロ名」リストから、新しく割り当てたいマクロを選択します。
  5. 「表示テキスト」の欄に、画面に表示させたい新しい文字列を入力し、「OK」をクリックします。

方法2:直接書き換える(フィールドコードの表示)

ショートカットキーまたは右クリックメニューからフィールドコードを表示させ、直接文字を書き換えることも可能です。

  1. 対象の文字列の上で右クリックし、表示されたメニューから「フィールドコードの表示/非表示」を選択します。(または Altキーを押しながらF9キーを押します。)
  2. 画面の表示が切り替わり、フィールドコード { MACROBUTTON マクロ名 表示テキスト } が表示されるので、マクロ名や表示テキストの部分を直接書き換えます。
  3. 修正が終わったら、再度右クリックして「フィールドコードの表示/非表示」を選択する(または Altキー + F9キーを押す)と、元の表示に戻ります。

VBAでのコードの書き方(重複起動を防止する要領)

デメリットとして挙げた「マクロの多重起動(連打)」を防ぐため、VBAのコード側で対策を行う必要があります。

具体的には、モジュールレベルの変数を用いて「現在処理中であるか」を判定するフラグ(目印)を設けます。また、途中でエラーが発生した場合でも、確実にフラグを元に戻す(解除する)ためのエラーハンドリングを記述します。

以下のコードは、本手法を取り入れた安全なマクロの基本構造です。

Option Explicit

' 処理中かどうかを判定するためのモジュールレベル変数(多重実行防止用)
Private isProcessing As Boolean

Sub SampleMacro()
    ' 1. 既に別の処理が実行中の場合は、何もせずに終了する(連打対策)
    If isProcessing Then Exit Sub
    
    ' 2. 処理中フラグを立てる
    isProcessing = True
    
    ' (オプション)処理中であることをユーザーに示すため、カーソルを待機状態に変更する
    System.Cursor = wdCursorWait
    
    ' 3. エラーが発生した場合は、必ずエラーハンドラー(ErrorHandler)へ飛ぶように設定する
    On Error GoTo ErrorHandler

    ' ---------------------------------------------------------
    ' ここにメインの処理を記述します。
    ' (例:図形の移動、表の結合・分割、日付書式の変更など)
    ' ---------------------------------------------------------

' === 正常終了時および中断時の共通出口 ===
ExitHandler:
    ' カーソルを通常の状態に戻す
    System.Cursor = wdCursorNormal
    ' 処理中フラグを解除し、次回の実行を可能にする
    isProcessing = False
    Exit Sub

' === エラー発生時の処理 ===
ErrorHandler:
    ' エラー内容をユーザーに通知する
    MsgBox "処理中にエラーが発生しました。" & vbCrLf & "エラー内容: " & Err.Description, vbCritical
    ' 共通出口(ExitHandler)に戻り、フラグ解除等の事後処理を確実に行う
    Resume ExitHandler
End Sub

コードのポイント

  • isProcessing 変数: プロシージャの外(モジュールレベル)で宣言し、処理が開始された直後に True にします。処理が終わるまでは再度の実行要求を弾き(Exit Sub)、多重起動を防止します。
  • ExitHandlerErrorHandler: 処理が正常に終わった場合も、エラーが発生した場合も、必ず ExitHandler を通るように設計しています。これにより、エラー発生時のみフラグが True のまま取り残されてしまい、以降マクロが一切動かなくなるという事態を防ぎます。

コメント

タイトルとURLをコピーしました