Rangeオブジェクトの場所を目立たせるマクロ(Word)
Rangeオブジェクトの場所を目立たせるマクロ(Word)
WordのRangeオブジェクトの場所はわかりにくい
WordのVBAでマクロを作っているとき、地味に困るのが、
Range
オブジェクトがどこを指し示しているのかわからん問題
である!
Steven Romanさん、ありがとう!
『Writing Word Macros』(Steven Roman・1999年・O'REILLY)という書籍がある。
その中で、実に面白いマクロが紹介されていたので、お目にかけよう!
Rangeオブジェクトの箇所を目立たせるマクロ
上掲書に載っていたコードを、一部改変。
リスト1
Public Sub BlinkRange(ByVal a_Range As Range, _ ByVal a_Time As Single, _ ByVal a_Blink As Boolean) Dim startTime As Variant Dim tickTime As Variant 'Safety net' If a_Range Is Nothing Then Exit Sub If a_Time < 0.1 Or a_Time > 60 Then a_Time = 2 End If 'Emboss range' a_Range.Font.Emboss = True 'Wait a_Time seconds, blinking ' 'every 0.25 seconds if requested' startTime = Timer() tickTime = startTime Do DoEvents If a_Blink Then If Timer() - tickTime > 0.25 Then '……(*)' With a_Range.Font .Emboss = Not .Emboss tickTime = Timer() End With End If End If Loop Until Timer() - startTime >= a_Time 'Kill emboss' a_Range.Font.Emboss = False End Sub
見ての通り、Range
オブジェクトのFont
プロパティから当該箇所のFont
オブジェクトを取得し、そのEmboss
プロパティをTrue
にすることによって、第2引数a_Time
で指定した時間、当該箇所を目立たせる、というもの。
ちなみに、第3引数のa_Blink
をTrue
にしてあると、(*)
からの6行、
If Timer() - tickTime > 0.25 Then '……(*)' With a_Range.Font .Emboss = Not .Emboss tickTime = Timer() End With End If
が発動することにより、あたかも当該箇所が点滅しているかのごとく、派手な演出となる。
動かしてみる
このような文書を用意する。カーソルは、「開催・運営」という段落の先頭にある。
この状態で、次のリスト2を実行する。
リスト2
Private Sub test02() Dim tgtRng As Range Set tgtRng = Selection.Range.Next(wdParagraph, 1) Call BlinkRange(tgtRng, 3, True) End Sub
(プロシージャ名「test02
」の「02
」に深い意味はありません。)
[Range].Next
メソッドで、カーソル位置のある場所(Selection.Range
)の次の段落の部分をRange
オブジェクトとして取得し、そのRange
オブジェクトをBlinkRange
メソッドに渡す。
第2引数が「3
」なので3秒間、第3引数が「True
」なので当該箇所を点滅させることになる。
すると、
こうなる。
Select
メソッドを使ったわけではないので、カーソル位置は当然
元のまま。
おわりに
マクロ作成中の動作確認時とか、デバッグ時に、Debug.Print
のように使えば、はかどるのではないでしょうか。