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_BlinkTrueにしてあると、(*)からの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のように使えば、はかどるのではないでしょうか。