以前の記事「【コード】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オブジェクトを得ていたのです。
なので、処理中にカーソルが文書中を移動してしまうため、処理後に元の位置に戻すための以下のような処理を施していました。
- 処理実行前のカーソルの位置を取得→Rangeオブジェクトに保存(4行目)
- 処理を実行(5行目~12行目:カーソルが文書中を移動)
- 処理終了後に、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