WordVBAで処理に使うデータを外部化する

指定した文字列のフォントを狙い撃ちで変えるマクロの改良

データを外部ファイル化する

たとえば、明朝体で書かれた文書のうち、特定の語句だけを狙い撃ちでゴシック体にしたい、というときには、

ゴシック体に変えたい語句(X)

と、

Xを含んでいるけれどゴシック体に変えては困る語句

というのがあると、非常にメンドクサイことになる。

Excelの場合だと、データ保持用のシートを隠し持っておいて、上記の2種類のデータを持たせておけば、VBAからそのデータを参照して処理に使うことができるが、Wordなんかの場合だとそれが難しい。

前回紹介した

akashi-keirin.hatenablog.com

コイツの登場ですよ!

テキストファイルをデータ保持用に使う

Wordドキュメントと同じフォルダ内に、「config」というフォルダを用意し、「config.txt」というテキストファイルを作成しておく。

んで、テキストファイルには

f:id:akashi_keirin:20180125193533j:plain

たとえば、このように語句を半角カンマ区切りで入力しておく。

次に、Wordドキュメント上に、

f:id:akashi_keirin:20180125193540j:plain

こんなふうに文章を打ち込んでおく。

ここまでで準備はおk。

テキストファイルのデータを利用して、特定の語句を狙い撃ちでゴシック体化するマクロのコード

リスト1 標準モジュール
Public Sub main()
  Dim targetDir As String
  targetDir = ThisDocument.Path & "\config\"     '"
  Dim targetArray As Variant
  targetArray = getTextFromFile(fileFullName:=targetDir & "config.txt", _
                                linesCount:=2)    '……(1)'
  Dim compareToArray As Variant
  compareToArray = Split(targetArray(0), ",")    '……(2)'
  Dim i As Integer
  For i = 0 To UBound(compareToArray)    '……(3)'
    If Not applyFontType(targetSentences:=Selection.Characters, _
                         compareTo:=compareToArray(i), _
                         nameOfFont:="MS ゴシック") Then
        Call makeUserSick("失敗www")
        Exit Sub
    End If
  Next
  compareToArray = Split(targetArray(1), ",")    '……(4)'
  For i = 0 To UBound(compareToArray)
    If Not applyFontType(targetSentences:=Selection.Characters, _
                         compareTo:=compareToArray(i), _
                         nameOfFont:="MS 明朝") Then
        Call makeUserSick("失敗www")
        Exit Sub
    End If
  Next
End Sub

(1)の

targetArray = getTextFromFile(fileFullName:=targetDir & "config.txt", _
                              linesCount:=2)

では、前回のリスト1で作成したgetTextFromFileメソッドを用いて、変数targetArrayに「config.txt」の文字列2行分を配列としてぶち込んでいる。

(2)の

compareToArray = Split(targetArray(0), ",")

では、Split関数を使って、targetArrayの1つ目の要素、すなわち、「config.txt」の1行目の文字列を配列としてcompareToArrayにぶち込む。

(3)からの8行(実質6行)

For i = 0 To UBound(compareToArray)    '……(3)'
  If Not applyFontType(targetSentences:=Selection.Characters, _
                       compareTo:=compareToArray(i), _
                       nameOfFont:="MS ゴシック") Then
      Call makeUserSick("失敗www")
      Exit Sub
  End If
Next

では、

akashi-keirin.hatenablog.com

このときに作成したapplyFontTypeメソッドを用いてcompareToArrayの要素と一致する文字列のフォントをMS ゴシックに変える。

フォント変換になんらかの原因で失敗したらapplyFontTypeがFalseを返すので、おなじみのmakeUserSickメソッドを呼び出してユーザーを無駄に煽るようにしているw

(4)の

compareToArray = Split(targetArray(1), ",")

では、今度はtargetArrayの2番目の要素、すなわち「config.txt」の2行目のテキストを配列化してcompareToArrayに上書きしている。

あとは、applyFontTypeメソッドをもう一度呼び出して、ゴシック化しては困る文字列に元のフォントをセットして処理終了。

実行結果

f:id:akashi_keirin:20180125193547j:plain

文字列を選択して、リスト1を実行すると、

f:id:akashi_keirin:20180125193554j:plain

まずは「深谷」、「浅井」、「新田」、「平原」、「三谷」が無差別に全てゴシック化され、

f:id:akashi_keirin:20180125193611j:plain

その後、「深谷ネギ」、「浅井長政」の部分が明朝化される。

従って、見た目上は、選手名としての「深谷」、「浅井」、「新田」、「平原」、「三谷」だけが狙い撃ちでゴシック化されたように見える。

おわりに

必要なデータをテキストファイル上で直接編集しないといけないので、データの保護の観点からはイマイチだと思うけれど、データをWordドキュメントの外に出せるというのは大きいと思う。

これからいろいろ応用を考えよう。

@akashi_keirin on Twitter