業務効率化したい人向けのワードマクロ初心者講座(ファイル選択フォーム, キー操作保存, 単語置換, 連想配列, テーブル情報読み込み)の第3回講座です。
今回は、単語変換マクロの心臓部である単語の置換処理を実装していきます。
毎回、マクロを一から作るのは大変ですので、ワードの置換機能を記録して、それをもとにマクロを組み込んでいきましょう。
手順としては、
- まずは「キー操作の保存」機能を使って、ワードの置換機能を使って文字列を置換する
- 記録されたマクロをコピー・編集して単語の置換処理を実装する
という手順で行っていきます。
それでは始めていきましょう。
単語の置換処理の実装
手順1:「キー操作の保存」にてワードの置換機能をマクロに保存
手順1-1: マクロの記録開始
ここでは、まず、キー操作の保存によって、単語の置換する動作を記録してみます。
まず、Wordファイルに単語変換できるだけの文章を書いて、メニューの「開発→コードグループ→マクロの記録」をクリックします。
「マクロの記録」ウィンドウで、マクロ名、マクロの保存先も「すべての文書(Normal.dotm)」のまま「OK」をクリックします。
キー操作の保存の方法については、記事「ワードマクロで一番カンタンに作業を自動化する方法:キー操作の保存」に詳しく説明していますので興味があれば読んでみてください。
手順1-2:単語の置換
単語置換を行います。
メニューの「ホーム→編集グループ→置換」をクリックします。
ここでは「僕」を「私」と変換してみましょう。また、置換した単語の色も変えてみましょう。
「置換後の文字列」をクリックしてから「オプション」をクリックします。
表示される「検索オプション」の下「置換」で、「書式→フォント」を選択します。
「置換後の文字列」をクリックしていないと「置換」の代わりに「検索」になってる場合があるので注意してください。
「検索する文字」ウィンドウが開くので、「フォント」タブのフォントの色の三角アイコンをクリックし、色を選択します。ここでは赤色にしましょう。
「OK」で確定します。
「検索と置換」ウィンドウに戻って、「すべて置換」をクリックして、置換しましょう。
下図のように、置換され、文字色も変更されたら成功です。「検索と置換」ウィンドウは、右上のバツボタンを押して閉じて良いです。
手順1-3:マクロの記録の停止
マクロの記録は終わりです。
メニューの「開発タブ→コードグループ→記録終了」をクリックして、マクロの記録を停止しましょう。
手順2:記録されたマクロをコピー・編集して単語の置換処理を実装
手順2-1:コードのコピー
記録されたマクロを見てみましょう。
Altキー+F11(ファンクションキー)を押すか、「開発タブ→コードグループ→Visual Basic」でVBEを起動します。
VBE(Visual Basic Editor)が開きます。マクロの保存先がデフォルトの場合、「プロジェクト」ウィンドウで「Normalプロジェクト→標準モジュール→NewMacros」をダブルクリックするか、NewMacros を右クリックして「コードの表示」を選択すれば、右側にコードウィンドウが開きます。
記録されたキー操作のマクロ表現については、記事「ワードマクロ:キー操作の記録したマクロはVBAで表現されてます」に詳しく説明していますので参考にしてください。
このコードを少し変更して使っていきたいので、まずは、Macro1() に書かれたコードをコピーして、「単語変換マクロ」にコピーしましょう。
Sub Macro1()のコードを選択し、「Ctrlキー+C」を押すか、右クリックして「コピー」をクリックすると、クリップボードにコピーされます。
次に、「単語変換マクロ」の標準モジュール「Module1」の「マクロ本体」サブルーチンの下をクリックしてカーソルを合わせて、「Ctrlキー+C」を押すか、右クリックして「貼り付け」をクリックすると、コピーしたコードが貼り付けられます。
手順2-2:マクロを編集して単語変換サブルーチンを作成
ではコピーしてきたマクロを変更していきましょう。
変更点は、
- サブルーチン名の変更
- 変換するワード文書、変換元単語、変換先単語 の3つを引数で指定できるようにする
- 変換元単語、変換先単語を引数で受け取ったものにする
- 変換の範囲を「ワード文書全体」とする
です。では、順番に進めていきます。
サブルーチン名の変更
わかりやすく、「単語変換処理」としましょう。
1 |
Sub Macro1() |
を
1 |
Private Sub 単語変換処理() |
とします。この処理は「Module1」の中にある「マクロ本体」サブルーチンから使う予定ですので、「Private」属性を付けておきます。
「Public」属性が マクロとしても、他のモジュールからも呼び出すことができるのに対して、「Private」属性はそのプロシージャが同じModuleの中からしか呼び出すことができないようになっています。なるべく必要のないものは外部に見れないように隠しておくのが混乱が少なくなるコツですので覚えておいてください。
変換するワード文書、変換元単語、変換先単語 の3つを引数で指定できるようにする
同様に、Sub 部分の () の中に、引数を指定していきます。「マクロ本体」サブルーチンの引数の指定の仕方が参考になります。
1 |
Private Sub 単語変換処理(doc As Document, str_src as Variant, str_tar as String) |
上のコードで、doc がワード文書、str_src が変換前単語、str_tar が変換後単語を指定する引数としました。str は stringの略で、srcはsourceで元、tarはtargetでターゲットの略としています。
Asの後ろは引数の型となっており、Documentはワード文書を表すオブジェクト、Stringは、文字列型を示しています。str_srcの変数型が Variant となっているのは、「単語変換処理」を呼び出す「マクロ本体」の中で使用する際に変数型がVariantになっているので、それに合わせてString型ではなくVariant型にしています。
Variant型(バリアント型)はなんにでも使える型になっており便利な型になっています。しかし、いろんな型の変数が入る可能性があると、プログラミングにバグが発生しやすくなります。
また、バグが発生したときのデバッグが大変なのでなるべくVariant型は使わないようにしましょう。
変換元単語、変換先単語を引数で受け取ったものにする
単語変換処理の中で、変換元単語、変換先単語は、以下の赤枠の部分になってます。
Selection.Find.Text が、変換前の単語、
Selection.Find.Replacement.Text が変換後の単語です。
以下のように、仮引数を使うように変更しておきましょう。
1 2 |
.Text = str_src '変換前単語 .Replacement.Text = str_tar '変換後単語 |
変換の範囲を「ワード文書全体」とする
マクロを見ていると、すべて、 Selection.~~~ のようにSelection のあとに文字が続いています。
「.」はその左側にあるオブジェクトの持っている変数やメソッド(サブルーチン)を指定するものです。
With構文は、End With までの間、表記を省略しても良いという意味です。
例えばWith構文の直後にある .Text は、 Selection.Find.Text の意味になるので、やっぱりすべてSelection の中になっています。
つまり、「単語変換処理」の中は、全てSelectionというオブジェクトに対して処理を行っています。
そして、Selection というのは、ワード文書の中で選択されている場所という意味になります。これを、doc で指定したワード文書全体にしましょう。
1 |
doc.Content |
とすることで、docの本文全体を示すことができます。
オブジェクトがどんな変数やメソッドをメンバーとして所有しているかは、「オブジェクトブラウザー」で確認することもできます。
記事「ワードマクロ:VBA オブジェクトブラウザーの使い方」に使い方を解説していますので参考にしてください。
変更後のコードは、以下のようになります。 Selection の代わりに doc.Content を使っています。また、たくさん書くのは大変なので、 With ~~~ End With 構文を使って、省略しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Private Sub 単語変換処理(doc As Document, str_src As Variant, str_tar As String) With doc.Content 'docの本文全体に対して処理を行う .Find.ClearFormatting .Find.Replacement.ClearFormatting .Find.Replacement.Font.Color = wdColorRed With .Find .Text = str_src '変換前単語 .Replacement.Text = str_tar '変換後単語 .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchWildcards = False .MatchFuzzy = False End With .Find.Execute Replace:=wdReplaceAll End With End Sub |
以上で、「単語変換処理」の変更は終了です。
手順2-3:作った単語変換サブルーチンの呼び出し処理を追加
次は先程作った「単語変換処理」を実際に呼び出す処理を作っていきます。
「マクロ本体」の処理を思い出してみると、連想配列 cnv_dic に変換する単語の情報が入っていました。
配列の添字に当たるキーに、変換前単語が入っており、連想配列のデータとして 変換後単語が入っています。
そして、 For Each 構文の中では、cnv_key にキーを入れているため、
cnv_key : 変換前単語
cnv_dic(cnv_key):変換後単語
が入っています。これを使って、「単語変換処理」を呼び出してみましょう。
以下の様に「マクロ本体」のコードを変更します。
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 単語変換処理 doc, cnv_key, cnv_dic(cnv_key) '変換処理の呼び出しを追加 Next MsgBox "入力ファイル: " & doc.Name & vbCrLf & _ "変換前単語 と 変換後単語" & vbCrLf & str_hyoji End Sub |
For Each 構文の中に「単語変換処理」を1行追加しただけです。
動かしてみよう
以上で、一応「単語変換マクロ」は一通り動くようになりました。
さっそく実行してみましょう。
「開発タブ→コード→マクロ」をクリックし、「単語変換マクロGUI」を選択し「実行」をクリックします。
起動したら、「選択」でワード文書ファイルを選択し、
「実行」ボタンをクリックします。
変換が終わり、以下のメッセージボックスが表示されます。
すると、以下のような文章が、
次のように単語変換されました。
最後に
一応、これで単語変換マクロは完成です。ですが、今のままでは、変換する単語を追加したり変更する場合、コードを編集する必要があります。
次回はマクロのコードを変更しなくても、変換する単語を調整できるように、マクロ文書(docm)に設定用のテーブル(表)を持ち、テーブルに設定された単語を変換するようにしていきます。
次回も楽しみにしてください。
ワードマクロ初心者講座:
業務効率化したい人向けのワードマクロ初心者講座(ファイル選択フォーム, キー操作保存, 単語置換, 連想配列, テーブル情報読み込み)
第1回:ワードマクロでファイル選択フォームをつくろう(フォーム, ファイルダイアログの使い方)
第2回:添字に文字列を使える連想配列で対になった情報を管理しよう
第3回:キー操作の保存からマクロを作成し単語の置換処理を作ろう
第4回(最終回):ワードマクロでテーブル(表)に書いた単語変換マクロの設定を読み取ろう
コメント