【Word VBA】相互参照先の文字列の有無を確認するWordマクロ

2016年11月4日

文字列にブックマークを追加できます。文字列を選択した状態でブックマークを追加すれば、ブックマークに文字列が含まれるため、この文字列を相互参照できます。

文字列を選択せずにブックマークを設定した場合には、ブックマークには文字列が含まれません。この場合には、文字列を相互参照した場合に、空欄になります。

以下の例では、BM1という名前で追加したブックマークは文字列を含んでいません。ブックマークの記号がキャレットになっています。(ブックマークを表示する方法は、こちらの記事「Word 2013・2010・2007のブックマーク関連機能(インストラクターのネタ帳)」をご覧ください)

相互参照

フィールドを非表示するとどうなるか。。。

以下のように空欄になってしまいます。

相互参照

この場合、フィールドを更新したときに参照先の文字列が空ではありますが、参照先自体は存在しているので、エラーメッセージ「エラー! 参照元が見つかりません。」が表示されません。

そのため、参照先が表示されていないことに気がつかないまま書類を納品してしまうことがありうるので困ります。

手動でブックマークを追加している場合には起きない事例かも知れませんが、マクロで自動的にブックマークを追加するときにはこのようなことが起こりえます。注意が必要です。

このマクロでできること

相互参照のフィールドの参照先の文字が空の場合に、コメントを挿入します。

(実行前)

相互参照

(実行後)

相互参照

マクロの解説

フィールドオブジェクトのRangeオブジェクトを取得する場合には、Resultプロパティを使います。(11行目)

Rangeオブジェクトを取得してしまえば、Rangeオブジェクト内の文字列を確認したりRangeオブジェクトの位置にコメントを挿入したりできますね。

マクロ


Sub 相互参照先の文字列の有無を確認する()

 Dim myField As Field
 Dim myRange As Range
 
 ActiveDocument.Fields.Update
 DoEvents
 
 For Each myField In ActiveDocument.Fields
  If myField.Type = wdFieldRef Then
   Set myRange = myField.Result
   If myRange.Text = "" Then
    myRange.Comments.Add Range:=myRange, _
               Text:="参照先確認要"
   End If
  End If
 Next
 
 Set myRange = Nothing
 
End Sub

-コード
-, ,