記号は黒字、文字は白字にするマクロ

記号を黒字、文字を白字にする

前回

akashi-keirin.hatenablog.com

を用いて、記号は黒字に、文字は白字にするメソッドを作った。

コード

コードは次の通り。

リスト1 標準モジュール
Private Sub changeFontColor(ByVal targetFont As Font)    '……(1)'
  If isSign(targetFont.Parent.Text) Then _
    targetFont.ColorIndex = wdBlack: Exit Sub    '……(2)'
  targetFont.ColorIndex = wdWhite    '……(3)'
End Sub

(1)の

Private Sub changeFontColor(ByVal targetFont As Font)

で、引数としてFontオブジェクトを受け取るように設定。

(2)の

If isSign(targetFont.Parent.Text) Then _
  targetFont.ColorIndex = wdBlack: Exit Sub

下のリスト2に示すisSignメソッドには、String型の引数を渡さないといけないので、

targetFont.Parent.Text

と、一旦引数のFontオブジェクトのParentプロパティを参照してRangeオブジェクトを取得し、そのRangeオブジェクトのTextプロパティを参照することによってString型の値(つまり、文字列)を得ている。

isSignメソッドがTrueを返してきたときには、その文字列は記号だということなので、

targetFont.ColorIndex = wdBlack: Exit Sub

でフォントの色を黒にして、処理を抜ける。

isSignメソッドがFalseを返していたら、その文字列は記号でなく文字だということなので、(3)の

targetFont.ColorIndex = wdWhite

でフォントの色を白にして処理を抜けることになる。

【参考】リスト2 標準モジュール
Private Function isSign(ByVal targetCharacter As String) As Boolean
  isSign = False
  Dim str As String
  str = "、 。 , . ・ : ; ? ! "
  str = str & "゛ ゜ ´ ` ¨ ^  ̄ _ 〇 "
  str = str & "― ‐ / \ ~ ∥ | … ‥ "
  str = str & "‘ ’ ( ) 〔 〕 [ "
  str = str & "] { } 〈 〉 《 》 「 」 "
  str = str & "『 』 【 】  ° ′ ″ "
  str = str & "! "" ' ( ) , - . / : ; ?"
  str = str & " " & Chr(&H8167) & " " & Chr(&H8168)
  Dim ar As Variant
  ar = Split(str)
  Dim i As Long
  For i = LBound(ar) To UBound(ar)
    If targetCharacter = ar(i) Then isSign = True: Exit Function
  Next
End Function

実験

f:id:akashi_keirin:20181019214714j:plain

こんな文章を用意し、次のコードを実行する。

リスト3 標準モジュール
Public Sub test()
  Dim i As Long
  With ThisDocument.Paragraphs(4).Range
    For i = 2 To .Characters.Count
      Call changeFontColor(.Characters(i).Font)
    Next
  End With
End Sub

Paragraphsコレクションの4番目、上の画像で言うと、

孔明はうなずいた。その通りであると肯定しているものの如くである。そして彼は彼の考えどおり軍を進ませた。隴右の大路へ出でて正攻法を取ったものである。

の段落について、2文字目から最後まで、文字だったら白字、記号だったら黒字にするというコード。

これを実行すると、

f:id:akashi_keirin:20181019214722j:plain

こうなった。

おわりに

これで、また一歩、目的に近づいた。