Word VBA/マクロ 備忘録

作業効率化のため作成したマクロをバックアップ代わりにアップしていきます。

【Word VBA/マクロ】Word マクロで全角文字をさがす方法

全角チェックするとき、文字カウント機能を使用します。
全角の文字数が分かって便利ですが、全角の場所は教えてくれません。
そこで全角文字をハイライトするマクロを作り始めたのですが、何度修正しても完成しませんでした。
検索(Range.find…)だけではチェック漏れがあるため、見つかった文字を、1字ずつ全角判定が必要です。その判定方法を考えるのに苦労しました。

全角は2バイト、半角は1バイトという認識でしたが、下の画面の「±」など、半角に見える記号のバイト数をLenB(StrConv(Selection.Text, vbFromUnicode))で確認すると2バイトです。


文字カウントでは「全角文字+半角カタカナの数」は0。全角文字でないと判定されます。
半角(に見える)記号が2バイトのため、バイト数で全角判定はできません。「°」も同様です。「±」や「°」は、全角と半角の文字コードが同じです。
同じコードなら同じ文字なのか、文字カウントで全角判定の結果が違うので別の文字なのか、理解できません。

次の画像のMS明朝の「±」は全角に見えます(比較するためTimes New Romanの記号を表示しました)。この記号は、キーボードで入力後、半角変換していますが、見た目は全角と変化ありません。全角に見えても、言語は「英語(米国)」、文字カウントは全角文字数「0」です。

半角なのか疑わしいですが、言語設定が英語の場合、全角なしと判定されるようです。

言語設定と文字カウントの全角判定の結果は一致するため、「言語」による全角判定が可能です。通常は半角は「英語(米)」と表示されます。英語の言語設定は10種類以上あるため(次の図は英語の一部です)、言語確認は必要ですが、半角は「英語(米)」に自動的に設定されるようです。

私は英語以外の文書も扱うため、言語判定はやめました(他人を作成した文書を扱うため、言語が決まっていません)。
最終的には、原点に戻って、文字カウントで判定することにしました。
文字カウントを1字ずつチェックする発想がなく、今ごろ簡単な方法に気づきました。
検索で見つかった文字を、文字数カウントの「全角文字+半角カタカナの数」を取得するComputeStatistics(wdStatisticFarEastCharacters) を用いて、全角チェックするという方法です。

検索なしで、すべての文字をチェックする方法はコードがシンプルですが、時間はかかります。コードを載せますが、Findと組み合わせたほうが、時間は短縮できます。

Sub SetHighlightFullwidthChara()
    Dim rng As Range

    For Each rng In ActiveDocument.Characters
        With rng
            If rng = " " Then
                .HighlightColorIndex = wdBrightGreen
            ElseIf .ComputeStatistics(wdStatisticFarEastCharacters) > 0 Then
                .HighlightColorIndex = wdYellow
            End If
        End With
    Next
End Sub