【Word VBA】URLやメールアドレスにリンクを追加させないWordマクロ(その2)

2016年9月4日

以前の記事「【コード】URLやメールアドレスにリンクを追加させないWordマクロ 」で紹介したコードが冗長だったので、修正してみました。

このマクロでできること

(マクロ実行前)

ハイパーリンクが張られています。[Ctrl]キーを押しながらクリックすると、メーラーが立ち上がってしまいます。

オートフォーマット

(マクロ実行後)

通常の文字列になります。

オートフォーマット

修正対象のコード

上記記事の最後に紹介されている以下のコードをご覧ください。

フィールドのタイプを判定して、ハイパーリンクの場合にリンクを解除するコードです。


Sub リンクを削除 ()
  Dim myLink As Field
  Dim myRange As Range
  Set myRange = Selection.Range
  For Each myLink In ActiveDocument.Fields
    If myLink.Type = wdFieldHyperlink Then
      myLink.Select
      Selection.Range.Underline = wdUnderlineNone
      Selection.Font.ColorIndex = wdAuto
      myLink.Unlink
    End If
  Next myLink
  myRange.Select
  Set myRange = Nothing
End Sub

問題点

一目見ただけで冗長な気がします。

以下の点が気になりました。

  • [疑問1]なぜ、myRangeというRangeオブジェクト変数を設定したのか?
  • [疑問2]なぜ、わざわざ下線を解除して文字色を自動に設定しているのか?

疑問1の回答

これは、Selectionオブジェクトを用いた後にカーソル位置をマクロ実行前の位置に戻すための処理でした。

実は、フィールドの文字書式を解除するときに文字書式プロパティを得るためにフィールドを一度選択してSelectionオブジェクトを得ていたのです。

なので、処理中にカーソルが文書中を移動してしまうため、処理後に元の位置に戻すための以下のような処理を施していました。

  1. 処理実行前のカーソルの位置を取得→Rangeオブジェクトに保存(4行目)
  2. 処理を実行(5行目~12行目:カーソルが文書中を移動)
  3. 処理終了後に、Rangeオブジェクトを選択する→カーソルが元の位置に戻る(13行目)

私がかつて、Selectionオブジェクトを中心にマクロを書いていたときに実行していた苦肉の策の残骸です(笑)。

もし仮に、文字書式設定用にオブジェクトが欲しいのであれば、今の私ならResultプロパティを用いてRangeオブジェクトを取得します。(7行目)

このようにすれば、Selectionオブジェクトを用いずに文字書式の設定ができます。

以下のようになります。


Sub リンクを削除2()

 Dim myLink As Field

 For Each myLink In ActiveDocument.Fields
  If myLink.Type = wdFieldHyperlink Then
   With myLink.Result 'Rangeオブジェクトを返す
    .Underline = wdUnderlineNone
    .Font.ColorIndex = wdAuto
   End With
   myLink.Unlink
  End If
 Next myLink

End Sub


疑問点2への回答

そして、そもそもなぜ文字書式を解除しているのか?ということなのですが、これは当時の私の理解不足が原因でした。

ハイパーリンクを解除すれば、ハイパーリンク用の文字書式である文字色や下線が自動的に解除されます。よって、文字書式を解除する処理を書く必要がないのです。

というわけで、このマクロは以下のように簡潔に書き直せるのです。


Sub リンクを削除3()

 Dim myLink As Field
 
 For Each myLink In ActiveDocument.Fields
  If myLink.Type = wdFieldHyperlink Then
   myLink.Unlink
  End If
 Next myLink

End Sub

-コード
-, , ,