業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、LenB関数とStrConvメソッドを使って、半角カナと全角カナが混ざった文字列を、全て全角カナの文字列に変換する方法を紹介します。
Tips「Excelでカタカナ/ひらがな、半角/全角の文字列変換をするには」の最後にLen関数やLenB関数を使って、半角カナ混じりの文字列を全角カナの文字列に変換するコードの宿題? を出しておいたのだが、できただろうか?
今回は、その回答の一例を紹介する。
例えば、図1のように半角カナと全角カナの入り混じった文字があったとする。中には全角カナだけの文字(マイクロソフト)も存在している。Excelメニューの[挿入]→[図形]から「角丸四角形」を配置して「実行」というボタンにしている。
マクロは下記のように{半角のチェック}が0より大きい場合に半角文字を含んでいる、という判定をし、半角文字なら全角に変換するものになる。この中身を解説していこう。この中身を解説していこう。
{半角のチェック}= LenB({対象文字列})-LenB(StrConv({対象文字列}),vbFromUnicode)
今回はLenB関数を使う。LenB関数は、文字の長さをバイト単位で返す関数なので、例えば「アア」は「3バイト」を返すと思いがちだが、単純にそうとは計算できない事情が存在する。
WindowsのVBAの内部においては、文字コードは全てUnicodeの「2バイトコード」であるため、半角カナ文字も、文字のバイト数を取得する、LenB関数では1文字で「2バイト」を返すようになる。よって「アア」は「4バイト」を返してしまう。
これに対処するには、StrConvメソッドを使って下記のように記述するとよい。
LenB(StrConv({文字列}, vbFromUnicode))
この変換によって、全角カナは1文字「2バイト」、半角カナ文字は1文字「1バイト」を返すようになる。
変換をしないで、例えば、「ヤクシジ クニヤス」の文字のバイト数をLenB関数で求めると、全て2バイトの「18バイト」を返す、これを先の変換方式で取得すると、ちゃんと「15バイト」を返すようになる。全角カナ文字が「6文字」で「12バイト」、半角カナ文字が半角スペースを含めて「3文字」で「3バイト」の計「15バイト」が正解となる。
このLenB関数の値がきっちり取れていないと正常に変換されないので、注意してほしい。
図1の半角カナ文字混じりの文字を全角カナ文字に変換するコードはリスト1になる。もともと全角カナの文字は変換する必要がないので、その場合は文字色を赤で表示させている。
Option Explicit Sub 半角カナを含む文字を全角カナに変える() Dim i As Integer Dim 文字の長さ1 As Integer Dim 文字の長さ2 As Integer Dim 半角のチェック As Integer For i = 1 To 4 文字の長さ1 = LenB(Cells(i, 1)) 文字の長さ2 = LenB(StrConv(Cells(i, 1), vbFromUnicode)) 半角のチェック = 文字の長さ1 - 文字の長さ2 If 半角のチェック > 0 Then Cells(i, 2) = StrConv(Cells(i, 1), vbWide) Else Cells(i, 1).Font.ColorIndex = 3 End If Next End Sub
Integer型の変数「i」「文字の長さ1」「文字の長さ2」「半角のチェック」を宣言する。変数「i」を1行目から4行目まで反復する過程において以下の処理を行う。
変数「文字の長さ1」にLenB関数で文字のバイト数を求めて格納する。全角カナ、半角カナ、全て2バイトで計算される。変数「文字の長さ2」には、先ほど解説したLenBの変換方法で、きちんと全角カナ(2バイト)と半角カナ(1バイト)を区別して「バイト数」を取得して格納する。
変数「半角のチェック」に「文字の長さ1」から「文字の長さ2」を差し引いた値を格納する。この「半角のチェック」変数の値が「0」より大きいと半角カナ文字が含まれていることになる。
半角カナ文字が含まれていた場合は、「2列目(B列)」に全角カナに変換した文字列を表示する。そうでない場合、つまり半角カナが含まれていない全角カナ文字列の場合は、その文字色を「3(赤)」に変換する。
ColorIndexの色番号については、記事「セルの数値、フォント、文字位置、背景色、けい線など表示形式/書式設定の使い方」を参照してほしい。
VBEを起動して上記コードを「Module1」内に記述し、マクロを図1の「実行」ボタンに関連付けて実行すると、図2のように表示される。
今回は半角カナ交じりの文字列を全角カナ文字列に変換する方法を解説した。ここで重要なのは、WindowsのVBAの内部においては、文字コードは全てUnicodeの「2バイトコード」である、という点だ。だから、LenB関数には先に解説したようにStrconvメソッドでvbFromUnicodeに変換して、きっちりと、半角、全角カナのバイト数を取得する必要がある。これさえ分かれば後は簡単だ。
全角カナの文字列の中に間違って半角カナ文字を含めてしまった場合の処理に便利だろう。
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev(Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Copyright © ITmedia, Inc. All Rights Reserved.