【入門編】【中級者向け】正規表現で「半角カタカナ」を「全角カタカナ」に一括変換するツール – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身が全然わからない…」と悩んでいませんか?あるいは、大量の文書を開いて、半角カタカナと全角カタカナが混ざったカオスな表記揺れを目の前にし、絶望を感じていませんか?

大丈夫。ここをクリアすれば、あなたのWord VBAのスキルは「初心者」から「現場で頼れる実務派」へと一気にステップアップします。

今回は、Windowsに標準搭載されているVBScriptの正規表現エンジンをWord VBAから巧みに操り、文書内の半角カタカナを一網打尽に全角カタカナへ変換する、実戦的で美しいツールを一緒に作っていきましょう。

先輩エンジニアが、裏側の仕組みまで優しく、かつ深く解説しますね。

—

なぜ「正規表現」と「VBScript」なのか?

Word標準の「検索と置換」機能でも、ワイルドカードを使えばある程度の置換は可能です。しかし、半角カタカナを全角カタカナに綺麗に、かつスマートに変換しようとすると、標準機能では限界が来ます。文字種を判定して一括で置き換えるロジックを自力で書くのは、正直言って車輪の再発明です。

そこで登場するのが、VBScriptの正規表現エンジン(`VBScript.RegExp`)です。
これを使えば、短いコードで高度なパターンの検索・置換が可能になり、さらにWordの重たい画面描画を裏でスマートにコントロールできるようになります。

知っておくべき「文字の重み」

Word VBAでやってはいけない最大のタブー、それは「画面をチラつかせながら1文字ずつ処理すること」です。これをやると、10ページの文書でも固まったようになり、PCのファンがうなりを上げます。

今回紹介するコードでは、「文書全体を一度にメモリ上に読み込み、正規表現で一瞬で置換し、ドキュメントに一気に書き戻す」という、パフォーマンスを極限まで高めたアーキテクチャを採用しています。プロの現場では、この「重み」を意識できるかどうかがエンジニアとしての分かれ道になります。

—

実装コード:半角カタカナ一括変換ツール

以下のコードを、WordのVBAエディタ(Alt + F11で起動)の標準モジュールにそのまま貼り付けてください。

Option Explicit

‘ ==============================================================================
‘ 処理名: 半角カタカナ一括変換ツール
‘ 概要: VBScriptのRegExpを使い、アクティブ文書内の半角カタカナを全角に変換する
‘ ==============================================================================
Sub ConvertHalfWidthKatakanaToFull()
Dim targetRange As Range
Dim regEx As Object
Dim text As String

‘ 1. 処理のパフォーマンスを爆発的に上げるための呪文
‘ (画面の更新を止め、警告を非表示にすることで、処理速度を数十倍にします)
With Application
.ScreenUpdating = False
.DisplayAlerts = wdAlertsNone
End With

‘ 2. 処理対象のレンジ(文書全体)を取得
Set targetRange = ActiveDocument.Content
text = targetRange.Text

‘ 3. VBScriptの正規表現オブジェクトを生成
‘ (※事前バインディングではなく、実行時バインディングで環境依存を防ぐのがプロの流儀)
Set regEx = CreateObject(“VBScript.RegExp”)

With regEx
.Global = True ‘ マッチしたものを全て置換する(大局的検索)
.IgnoreCase = False ‘ 大文字・小文字を区別する
.Pattern = “[ヲ-゚]+” ‘ 半角カタカナの文字コード範囲を指定(連続する文字をまとめる)
End With

‘ 4. 置換を実行(StrConv関数で半角カタカナ(vbNarrow)を全角カタカナ(vbWide)へ変換)
‘ ※正規表現のマッチオブジェクトをフックして変換処理を行うカスタム関数を呼び出します
text = ReplaceHalfToFullKatakana(text, regEx)

‘ 5. 変換後のテキストをWord文書に書き戻す
targetRange.Text = text

‘ 6. 設定を元に戻す
With Application
.ScreenUpdating = True
.DisplayAlerts = wdAlertsAll
End With

‘ 完了メッセージ
MsgBox “半角カタカナの全角変換が完了しました!”, vbInformation, “処理成功”

ErrorHandler_Exit:
‘ 予期せぬエラーでも確実に画面描画を復元するフェイルセーフ
Application.ScreenUpdating = True
Application.DisplayAlerts = wdAlertsAll
Exit Sub

End Sub

‘ ==============================================================================
‘ 補助関数: マッチした半角カタカナの塊を一つずつ全角に変換する
‘ ==============================================================================
Function ReplaceHalfToFullKatakana(ByVal sourceText As String, ByRef regEx As Object) As String
Dim matches As Object
Dim match As Object
Dim convertedStr As String

Set matches = regEx.Execute(sourceText)

‘ 後ろから処理することで、文字列のインデックスが狂うのを防ぐ(堅牢性の担保)
Dim i As Long
For i = matches.Count – 1 To 0 Step -1
Set match = matches(i)
‘ StrConv関数で半角(vbNarrow)から全角(vbWide)へ変換
convertedStr = StrConv(match.Value, vbWide + vbKatakana)

‘ 該当部分を置換
sourceText = Left(sourceText, match.FirstIndex) & _
convertedStr & _
Mid(sourceText, match.FirstIndex + match.Length + 1)
Next i

ReplaceHalfToFullKatakana = sourceText
End Function

—

ジックリとコードの構造を見ていきましょう。ここを理解すれば、他の置換ツールも自由自在に作れるようになります。

1. パフォーマンスの主役:`ScreenUpdating = False`

コードの最初と最後にある `Application.ScreenUpdating` です。Wordは、マクロによって文字が1文字変わるたびに、画面の表示をチラチラと書き直そうとします。これが処理を極端に遅くする原因です。
裏側でこっそり仕事を終わらせて、最後にドーンと画面を更新する。これがプログラミングの基本かつ極意です。

2. VBScript正規表現の導入:`CreateObject(“VBScript.RegExp”)`

Word VBAには独自の正規表現エンジンがありません。そのため、Windows標準のVBScriptエンジンを間借りします。
`[ヲ-゚]+` というパターンは、「半角の『ヲ』から『゚(半角濁点)』までの文字が1文字以上連続している塊」をすべて見つけ出すという指定です。これにより、「アイウエオ」のような連続した半角カタカナを一つの塊として捕まえることができます。

3. VBA標準の武器:`StrConv` 関数

見つけた半角の塊を全角に変換しているのが、VBAが標準で持っている `StrConv` 関数です。
`vbWide` は「全角に変換せよ」、`vbKatakana` は「ひらがなではなくカタカナに強制せよ」という強力なフラグです。この組み合わせにより、濁点や半角の「ー(長音符)」も含めて、綺麗に全角カタカナへと変換されます。

—

陥りやすいエラーと回避のテクニック

初学者がこのコードをカスタマイズする際によくハマる罠をいくつかシェアしておきます。

  • 罠1: 文書の書式(太字や色)が消えてしまう?
  • 今回のコードは `targetRange.Text = text` と文字列単位で一括置き換えを行っているため、対象範囲にあった「文字ごとの色や太字などの書式」がプレーンな状態にリセットされます。
  • 対策: もし書式を保持したい場合は、文字列の一括置換ではなく、Word標準の `Find` オブジェクトとループを組み合わせるアプローチが必要になります(今回はパフォーマンス優先で文字列処理を採用しています)。
  • 罠2: 処理対象が大きすぎてメモリがあふれる
  • 数百ページに及ぶ辞書のようなファイルを一気に処理すると、メモリを圧迫することがあります。その場合は、セクションごとや段落ごとにループを回す設計にマイナーチェンジするのがエンジニアとしての腕の見せ所です。

—

おわりに

お疲れ様でした!
今回学んだ「VBScriptの正規表現を呼び出す手法」と「画面描画を止めてパフォーマンスを稼ぐ手法」は、Word VBAを実務レベルで使いこなすための強力な武器になります。

「ただ動くコード」から「美しく、速く、安全に動くコード」へ。
この小さなツールをきっかけに、あなたのドキュメント作成業務が劇的に効率化されることを、先輩エンジニアとして心から応援しています。

それでは、次回の高度なVBAの世界でお会いしましょう!

タイトルとURLをコピーしました