【WordVBA】相互参照に着色

Wordで就業規則を作成しているときに、相互参照の設定をしたかどうかを確認するために、蛍光ペンで着色しています。これを自動化するマクロを作りましたので公開します。

相互参照とは

第○条という条文を参照する個所にはWordの相互参照の機能を使っています。

相互参照を使うためには、アウトラインレベルを全段落に設定しないといけないので、手間ではあるのですが、一度設定してしまえば後が楽になるので、私は重宝に使っています。

相互参照は、挿入→リンクのところにあります。

相互参照

相互参照の何がよいかというと、次のようなケース。

この文書の中では、第3条の「第2条の正社員は」の第2条のところに参照設定が使われている

この状態で第1条と第2条の間に条文が追加になったとします。

1条と2条との間に条文が追加になった

この場合、第4条(もとの第3条)にある「第2条の正社員は」の部分を手動で直さないといけないのかというと、その必要はありません。

いったん印刷画面にして戻すと、参照設定の値が更新されます。

いったん印刷プレビュー画面にすると参照設定の参照先が更新される
第3条に修正されている

就業規則のチェックをしていると、参照先の設定ミスは、よく見つかるミスです。おそらく改正のときの修正もれです。

これをシステマチックに防ぐために、相互参照はお勧めです。

相互参照の欠点

相互参照は見た目がただの文章なので、相互参照を設定してあるかどうか分かりづらいという欠点があります。

そこで、私は検索と置換で黄色いマーカーをしておくことが多いです。

検索と置換で一気に蛍光ペンを引く方法は、Webの海とかChatGPTとかで調べてください。ここでは紹介しません(ありふれたテクニックだと思うので)。

置換で一気に蛍光ペンを引く(あらかじめフィールドコードを表示しておく必要がある)
相互参照の個所が蛍光ペンで着色された

これを何度も何度も就業規則の修正作業の中でやっていると、めんどうになってくるので、私はマクロ化しています。

コード

コードを提示しておきます。

Option Explicit

Private myRibbon As Office.IRibbonUI
Private flg As Boolean
 
Public Sub myRbn_onLoad(ribbon As IRibbonUI)
  Set myRibbon = ribbon
  flg = True
  myRibbon.Invalidate ' リボンの表示を更新する
End Sub
 
Public Sub myTgl_onAction(control As IRibbonControl, pressed As Boolean)
    flg = pressed
    SetHighlight
End Sub
 
Public Sub myTgl_getPressed(control As IRibbonControl, ByRef returnedVal)
    returnedVal = flg
End Sub
'
'検索して置換で蛍光ペンを引く
'
Private Sub SetHighlight()
    
    '画面制御
    Application.ScreenUpdating = False
    
    'フィールドコードを表示
    ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes
    
    '蛍光ペンの色を選択しておく
    If flg Then
        Options.DefaultHighlightColorIndex = wdYellow       '黄色
    Else
        Options.DefaultHighlightColorIndex = wdNoHighlight  '無色
    End If
    
    Dim Rng As Range
    
    '変換範囲
    If Selection.Start = Selection.End Then
        Set Rng = ActiveDocument.Range   '範囲選択しなければ文書全体
    Else
        Set Rng = Selection.Range    '選択された範囲内のみ
    End If
    
    '検索して置換(置換後の文字列は蛍光ペンが引かれる)
    Rng.Find.ClearFormatting
    Rng.Find.Replacement.ClearFormatting
    Rng.Find.Replacement.Highlight = True
    With Rng.Find
        .Text = "^d Ref"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = False
    End With
    Rng.Find.Execute Replace:=wdReplaceAll
    
    '後始末
    Set Rng = Nothing
    
    'フィールドコードを非表示
    ActiveWindow.View.ShowFieldCodes = Not ActiveWindow.View.ShowFieldCodes
    
    '画面制御復帰
    Application.ScreenUpdating = True
End Sub

カスタムリボンを作ってボタンを設けてあるので、上記のコードにはリボン制御のコードも含まれます。

ボタンはトグルボタンを使っていて、トグルのオンオフは内部変数flgに転記されます。flgの値を見て、黄色い蛍光ペンを引くか、それとも無色にするか(蛍光ペンの色をとるか)判断して制御しています。

作ったもの

今回つくったものを置いておきます。アドインとして使えるテンプレートとして作りましたので、使うときは開発タブ→文書テンプレートで読み込んでください。

アドインとして使用できるテンプレートとして読み込む

うまく読むこむことができれば次のようにリボンにボタンができますので、

右側にToolsタブができ、その中に参照設定着色ボタンがある

このボタンを押してマクロを起動してください。

作ったものは、こちら↓。ZIPになっていますので、解凍してから使ってください。

https://kn-sharoushi.com/wp-content/uploads/2023/08/Highlight.zip

お使いになるのは自由ですが、著作権は放棄していません。

ニーズがあればリボンのXMLも提示しようかなと思いますが、はたしてニーズがあるのでしょうか・・・・?