WordVBAで処理に使うデータを外部化する
指定した文字列のフォントを狙い撃ちで変えるマクロの改良
データを外部ファイル化する
たとえば、明朝体で書かれた文書のうち、特定の語句だけを狙い撃ちでゴシック体にしたい、というときには、
ゴシック体に変えたい語句(X)
と、
Xを含んでいるけれどゴシック体に変えては困る語句
というのがあると、非常にメンドクサイことになる。
Excelの場合だと、データ保持用のシートを隠し持っておいて、上記の2種類のデータを持たせておけば、VBAからそのデータを参照して処理に使うことができるが、Wordなんかの場合だとそれが難しい。
前回紹介した
コイツの登場ですよ!
テキストファイルをデータ保持用に使う
Wordドキュメントと同じフォルダ内に、「config」というフォルダを用意し、「config.txt」というテキストファイルを作成しておく。
んで、テキストファイルには
たとえば、このように語句を半角カンマ区切りで入力しておく。
次に、Wordドキュメント上に、
こんなふうに文章を打ち込んでおく。
ここまでで準備はお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
では、
このときに作成したapplyFontTypeメソッドを用いてcompareToArrayの要素と一致する文字列のフォントをMS ゴシックに変える。
フォント変換になんらかの原因で失敗したらapplyFontTypeがFalseを返すので、おなじみのmakeUserSickメソッドを呼び出してユーザーを無駄に煽るようにしているw
(4)の
compareToArray = Split(targetArray(1), ",")
では、今度はtargetArrayの2番目の要素、すなわち「config.txt」の2行目のテキストを配列化してcompareToArrayに上書きしている。
あとは、applyFontTypeメソッドをもう一度呼び出して、ゴシック化しては困る文字列に元のフォントをセットして処理終了。
実行結果
文字列を選択して、リスト1を実行すると、
まずは「深谷」、「浅井」、「新田」、「平原」、「三谷」が無差別に全てゴシック化され、
従って、見た目上は、選手名としての「深谷」、「浅井」、「新田」、「平原」、「三谷」だけが狙い撃ちでゴシック化されたように見える。
おわりに
必要なデータをテキストファイル上で直接編集しないといけないので、データの保護の観点からはイマイチだと思うけれど、データをWordドキュメントの外に出せるというのは大きいと思う。
これからいろいろ応用を考えよう。