業務効率化したい人向けのワードマクロ初心者講座(ファイル選択フォーム, キー操作保存, 単語置換, 連想配列, テーブル情報読み込み)の第2回講座です。
今回は、単語変換マクロの変換対象を管理する情報を管理する変数を作成していきます。
対になった情報を管理するのには、連想配列という変数の型を使うのが便利なのですが、ワードのマクロで使っているプログラミング言語「VBA」ではそのような変数の型がありません。
そのかわり、Dictionaryという名前のオブジェクトとして連想配列が使えるので、今回はDictionaryオブジェクトを使っていきます。
オブジェクトとは
オブジェクトというのは、日本語では「物体」なのですが、プログラミングの言葉としては、簡単に言うと「変数と処理するプログラムをひとまとめにして管理しやすくしたもの」となります。
例えば、ワード文書を操作するプログラムを作成するのにしても、「Document」オブジェクトとして、ワード文書を操作するための変数や処理がひとまとめになって用意されています。
そのため、私達ユーザーがマクロを組むとき一から全部記述しなくてもDocumentオブジェクトを利用してワード文書を操作することができます。
簡単にワード文書を開いたり、文字列を挿入して保存したりも、それぞれ1行のステートメントでできるんですよ。
Dictionary(連想配列)オブジェクトと配列の違い
VBAにはもともと配列が使えます。
たくさんのデータを一つの変数で管理するのに便利なのですが、変数の添字に数字しか使えないという制限があります。
配列の例
例えば、配列の使用例を表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
'配列のテスト Public Sub 配列テスト() Dim Henkan_Mae(2) As String '変換前の単語を追加 Henkan_Mae(0) = "僕" Henkan_Mae(1) = "だけど" Henkan_Mae(2) = "いない" Dim Henkan_Ato(2) As String '変換後の単語を追加 Henkan_Ato(0) = "私" Henkan_Ato(1) = "ですが" Henkan_Ato(2) = "いません" Dim str_hyoji As String '表示用文字列 Dim i As Integer '配列の添字代入用の変数 For i = 0 To 2 'i に 0 から 2 までの数を入れて繰り返し処理 'str_hyoji に表示用の文字列を追加 str_hyoji = str_hyoji & Henkan_Mae(i) & " → " & Henkan_Ato(i) & vbCrLf Next 'メッセージボックスで表示 MsgBox "変換前単語 と 変換後単語" & vbCrLf & str_hyoji End Sub |
Henkan_Maeという名前のString型の配列に、単語変換の置換前の語句を代入しています。
変換後の語句はHenkan_Atoように別の配列を使って登録しています。バラバラの2つの変数だと、管理が少し面倒ですよね。
上のコードは、変数なしのサブルーチンとなっていますので、Module1に記述すれば、マクロとして実行することができますよ。
実行すると、MsgBoxによって下図のメッセージが表示されます。
少し、上のサンプルコードの補足説明をしておきますね。
For文は、繰り返し処理をする構文です。この場合、For から Next までのステートメントが、i に 0 ~ 2 を入れて3回 実行されます。
記事「ワードマクロ:For Nextループによる繰り返し」に詳しく解説しています。
MsgBoxを呼ぶときに、中括弧「(」が使われていませんが、第一回で「処理をしますか?」の問い合わせで使用したようにMsgBoxの結果を参照するときは()付きで呼び出します。
今回は表示するだけでMsgBoxの結果を使わないときは中括弧「()」なしで呼び出します。
また、& は文字列を連結する演算子、vbCrLf というのは、改行を表す文字列になってます。
連想配列の例
配列に対して、Dictionaryオブジェクトを使った連想配列の例は以下のようになります。
同じ配列の例と同様に、変換前単語と変換後単語を管理するのですが、配列の添字代わりに変換前単語をインデックスとすることで、一つの連想配列で変換前単語と変換後単語を一緒に管理することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
'連想配列のテスト Public Sub 連想配列テスト() '連想配列を使用 Dim cnv_dic As Object Set cnv_dic = CreateObject("Scripting.Dictionary") '連想配列に単語を追加 cnv_dic.Add "僕", "私" cnv_dic.Add "だけど", "ですが" cnv_dic.Add "いない", "いません" Dim str_hyoji As String '表示用文字列 Dim cnv_key As Variant '連想配列のキー代入用 For Each cnv_key In cnv_dic.Keys '連想配列のキー全てに対して処理 str_hyoji = str_hyoji & cnv_key & " → " & cnv_dic(cnv_key) & vbCrLf Next MsgBox "連想配列:変換前単語 と 変換後単語" & vbCrLf & str_hyoji End Sub |
同様にModule1に上記のコードを記述して実行すると、先ほどと同じ様に下図のようにメッセージボックスが表示されます。
違いとしては、 CreateObject というステートメントで連想配列を作って、変数 cnv_dic に代入しているところです。また、オブジェクトを代入するときは、 Set を使います。
1 |
cnv_dic.Add "僕", "私" |
で単語を追加していますが、最初の”僕”がインデックスで、”私” が配列に代入するデータとなってます。インデックスをキーと呼んでいます。
For Each ~ Next の構文で、すべてのキーに対して処理を行っています。
今回追加するコード
今回は、マクロ本文に、変換する単語を連想配列で定義していきます。
先程の、連想配列の例 ほぼそのままですが、マクロ本文に記述していきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'マクロ本体 Public Sub マクロ本体(doc As Document) If MsgBox(doc.Name & " を処理します。", vbOKCancel, "単語変換マクロ") = vbCancel Then Exit Sub End If 'ここから処理を書いていきます。 '連想配列を使用 Dim cnv_dic As Object Set cnv_dic = CreateObject("Scripting.Dictionary") '連想配列に単語を追加 cnv_dic.Add "僕", "私" cnv_dic.Add "だけど", "ですが" cnv_dic.Add "いない", "いません" Dim str_hyoji As String '表示用文字列 Dim cnv_key As Variant '連想配列のキー代入用 For Each cnv_key In cnv_dic.Keys '連想配列のキー全てに対して処理 str_hyoji = str_hyoji & cnv_key & " → " & cnv_dic(cnv_key) & vbCrLf Next MsgBox "入力ファイル: " & doc.Name & vbCrLf & _ "変換前単語 と 変換後単語" & vbCrLf & str_hyoji End Sub |
追加してるコードは、下図の赤枠の中です。ほぼ、「連想配列テスト」のままですよね。
ちなみに、MsgBox の文が長くなったので、2行に分けて書いています。その際に、一行目の最後に 「_」(アンダーライン) を追加する決まりになってますので、覚えておきましょう。
最後に
今回は、連想配列の説明と、連想配列で変換する単語の設定を行う部分を説明しました。
次回以降で、この「マクロ本体」の中の For Each の中に置換処理を入れていくことで、マクロを完成させます。
次回も楽しみにしておいてください。
ワードマクロ初心者講座:
業務効率化したい人向けのワードマクロ初心者講座(ファイル選択フォーム, キー操作保存, 単語置換, 連想配列, テーブル情報読み込み)
第1回:ワードマクロでファイル選択フォームをつくろう(フォーム, ファイルダイアログの使い方)
第2回:添字に文字列を使える連想配列で対になった情報を管理しよう
第3回:キー操作の保存からマクロを作成し単語の置換処理を作ろう
第4回(最終回):ワードマクロでテーブル(表)に書いた単語変換マクロの設定を読み取ろう
コメント