こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押してコードを生成する日々から一歩進み、「自分の手で自由自在に文書を操りたい」と感じている頃ではないでしょうか。
今回は、実務で誰もが頭を悩ませる「全角・半角の揺らぎ」をテーマにお届けします。
「社内アンケートの結果を見たら、カタカナの『アイウエオ』と『アイウエオ』が混ざっている……」
「半角の英数字と全角の英数字がバラバラに入り乱れていて、見た目が美しくない……」
こうした文書の整備を人の目でやっていたら、目がいくつあっても足りませんよね。もちろん、Wordの標準機能にある「検索と置換」画面を使ってもいいのですが、微妙なオプション設定に翻弄されて「あれ?ヒットしないぞ?」とイライラした経験はありませんか?
今回は、Word VBAの検索エンジン(Findオブジェクト)の心臓部である`MatchByte`(バイト数の一致)プロパティにスポットを当て、この全角・半角の魔物を完全に手なずける方法を伝授します。ここをクリアすれば、あなたのWord VBAスキルは間違いなく中級者の領域に到達しますよ。
—
なぜ、全角・半角の検索でつまずくのか?
Word VBAで文字列を検索・置換するとき、私たちはつい次のようなコードを書きがちです。
‘ 【よくある失敗パターン】
Sub SearchErrorSample()
Dim rng As Range
Set rng = ActiveDocument.Content
‘ 「テスト」という文字を探したい
rng.Find.Text = “テスト”
If rng.Find.Execute Then
MsgBox “見つかりました!”
Else
MsgBox “見つかりません……”
End If
End Sub
このコード、実は文書内に「テスト(半角カナ)」しかなかった場合、「見つかりません」と判定されてしまいます。
逆に、半角の `”test”` を探そうとしたときに、文書側に全角の `”test”` が混ざっていても、やはりスルーされてしまいます。
なぜこんなことが起きるのでしょうか?
それは、Wordの検索エンジンが標準状態では「全角と半角を厳密に区別する(バイト数を区別する)」という頑固な設定になっているからです。
—
救世主は `MatchByte` プロパティ!
この頑固な検索エンジンをコントロールするのが、Findオブジェクトの `MatchByte`(マッチ・バイト) というプロパティです。
- `MatchByte = True` (デフォルト)
- 全角と半角を区別する(「A」と「A」は別物とみなす)。
- `MatchByte = False`
- 全角と半角を区別しない(「A」も「A」も同じものとして探す)。
言葉を変えると、「全角・半角の揺らぎを吸収したい」なら、`MatchByte = False` に設定すればいいのです。これだけで、検索の網にかかる情報の幅が劇的に広がります。
—
【実践】全角・半角の揺らぎを完全制圧するVBAコード
それでは、実務の現場でそのままコピペして使える、堅牢(ロバスト)なプロシージャをご紹介しましょう。
今回は、文書内にある半角・全角のカタカナ(あるいは英字)をターゲットにして、一括で検索・置換するサンプルです。先輩エンジニアからの丁寧なコメント付きですので、動きを確認しながら読んでみてください。
Sub FixWidthFluctuations()
Dim targetText As String
targetText = “テスト” ‘ 検索したい基準の文字列(ここでは半角カナ)
‘ ドキュメントの先頭から末尾までを対象にするRangeオブジェクトを取得
Dim rng As Range
Set rng = ActiveDocument.Content
‘ 検索条件(Findオブジェクト)のリセット
‘ ※前回の検索条件が残っているとバグの原因になるため、必ずクリアする鉄則です!
rng.Find.ClearFormatting
rng.Find.Replacement.ClearFormatting
With rng.Find
.Text = targetText
.Replacement.Text = “テスト” ‘ 統一したい正式な文字列(全角)
‘ —【ここが今回の最重要ポイント】—
‘ 全角・半角の揺らぎを無視する(半角の「テスト」も全角の「テスト」も一緒に探す)
.MatchByte = False
‘ ついでに大文字・小文字の区別もなくす場合(必要に応じてTrue/Falseを切り替え)
.MatchCase = False
‘ あらゆる言語設定の文字種を柔軟にヒットさせるための基本設定
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchWildcards = False
.MatchWholeWord = False
.MatchFuzzy = True ‘ 曖昧検索を有効化
End With
‘ 文書全体に対して「一括置換(ReplaceAll)」を実行
‘ 戻り値として「何箇所置換されたか」のカウントが返ってきます
Dim replaceCount As Long
‘ Executeメソッドの引数に wdReplaceAll を指定すると一発置換できます
‘ (※正確には返り値を直接取得できないため、以下のように安全に実行します)
rng.Find.Execute Replace:=wdReplaceAll
MsgBox “全角・半角の揺らぎを吸収し、置換処理が完了しました!”, vbInformation, “処理成功”
End Sub
コードのここがプロの技!
1. `Find.ClearFormatting` の重要性
Wordの検索機能は、一度設定したフォントや段落の条件を記憶し続けるという厄介な仕様(ステートフル)を持っています。コードの最初で必ずこれをクリアしないと、前回手動で検索した太字設定などが残ってしまい、「突然動かなくなった!」というパニックを引き起こします。
2. `MatchByte = False` の組み合わせ
これを明示的に `False` にすることで、半角・全角の壁を軽々と超えて一網打尽にできるようになります。
—
陥りやすいエラーと注意点
初学者の方がこの「全角・半角の検索」を実装する際によくハマる罠が2つあります。
罠その1:「あれ、置換されない文字がある……」
`MatchByte = False` にしても、ひらがなとカタカナや、漢字の新旧字体までは自動で吸収してくれません。あくまで「同じ文字の全角・半角バージョン(例: `A` と `A`、`ア` と `ア`)」が対象です。
ひらがな・カタカナの変換まで同時に行いたい場合は、VBAの組み込み関数である `StrConv` 関数を併用するか、別ロジックで段階的に処理する必要があります。
罠その2:意図しない部分までヒットしてしまう
全角・半角の区別をなくす(`MatchByte = False`)ということは、検索ワードが短い場合(例: `1` という数字など)、半角の `1` も全角の `1` も、果ては類似の全角文字まで想定外に巻き込んで置換してしまうリスクがあります。
置換を実行する前に、本当にその置換で問題ないか、`MsgBox` や `Do While rng.Find.Execute` を使ったループ処理で1件ずつユーザーに確認(またはログ出力)するアプローチも、実務では非常に安全です。
—
まとめ:ここをクリアすればWord VBAの基本はバッチリ!
今回は、全角・半角の揺らぎを吸収するための `MatchByte` プロパティのコントロール術を解説しました。
- Wordの検索はデフォルトでは全角・半角を厳密に区別する。
- `MatchByte = False` を指定することで、その壁を取り払うことができる。
- コードの冒頭での `ClearFormatting` を忘れないことで、環境に左右されない安定したマクロになる。
この細やかなプロパティの制御ができるようになると、単なる「作業の自動化」を超えて、「人間の目では見落としてしまうような文書のノイズを綺麗に整える、知的なドキュメント・エンジニアリング」が実現できるようになります。
ぜひ、あなたの手元のマクロにも組み込んで、その強力さを体感してみてくださいね。それでは、次のステップでお会いしましょう!
