以前にも似たようなサンプルコードを作成して記事にしたけれど、今回は、半角のカタカナを全角に、全角の英字、数字、記号を半角に変換するユーザー定義関数のサンプルプログラムを作ったので覚書。
"半角のカタカナを全角に、全角の英字、数字、記号を半角に"と書きましたが、実際には、半角では困る文字を全角に、全角では困る文字を半角に変換するユーザー定義関数。
ExcelのVBAでもAccessのVBAでも使用できます。
ユーザー定義関数の概要
これまで全角、半角変換に関するプログラムはASCIIコードを使用して判別、変換というロジックでしたが、今回はだいぶ異なります。
まず2つの文字列変数を用意して1つの変数には"全角から半角に変換したい文字"を羅列した文字列を代入しておきます。
同様に"半角から全角に変換したい文字列"を羅列した文字列をもう1つの変数に代入しておきます。
あとは引数として受け取った文字列の1文字1文字を上記2つの変数に代入されている文字列の1文字1文字と比較して変換対象なら変換するという感じです。
ユーザー定義関数のサンプルプログラム
以下にユーザー定義関数のサンプルプログラムを記載します。 Excelで作る場合でもAccessで作る場合でも標準モジュールに記載してください。
Function StringConv(strTarget)
Dim zenkaku As String, hankaku As String, singleString As String
'空文字とNull対応
If Len(strTarget) = 0 Or IsNull(strTarget) Then
Exit Function
End If
'全角では困る文字列を変数 zenkaku に代入する
zenkaku = zenkaku & "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
zenkaku = zenkaku & "abcdefghijklmnopqrstuvwxyz"
zenkaku = zenkaku & "1234567890"
zenkaku = zenkaku & "!#$%&()*+,-./:;<=>?[¥]^_{|}~@`" & """"
'半角では困る文字列を変数 hankaku に代入する
hankaku = "。「」、・ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ー"
For i = 1 To Len(strTarget)
'引数として受け取った文字列を順番に1文字ずつ取り出す
singleString = Mid(strTarget, i, 1)
'取り出した文字が変数zenkakuの文字列のいずれかに該当するかチェック
If InStr(zenkaku, singleString) <> 0 Then
'該当している場合は、半角に変換して文字列を作り直す
strTarget = Left(strTarget, i - 1) & StrConv(singleString, 8) & _
Right(strTarget, Len(strTarget) - i)
End If
'取り出した文字が変数hankakuの文字列のいずれかに該当するかチェック
If InStr(hankaku, singleString) <> 0 Then
'該当している場合は、全角に変換して文字列を作り直す
strTarget = Left(strTarget, i - 1) & StrConv(singleString, 4) & _
Right(strTarget, Len(strTarget) - i)
End If
Next
'変換しなおされた文字列を返す
StringConv = strTarget
End Function
ユーザー定義関数の使用例
作成したユーザー定義関数をプログラム中から呼び出して使用する方法を以下に記載します。
ユーザー定義関数を呼び出して使用するサンプルプログラムの例
Sub sample()
Debug.Print StringConv("ABCdef%&()*+,-123ャュョッアイウエ")
End Sub
実行すると以下のようにデバックウィンドウに変換された文字列が表示されます。
ABCdef%&'()*+,-123ャュョッアイウエ
プログラムからだけでなく、AccessやExcelの組み込み関数と同じように使用することもできます。
基本的には、ユーザー定義関数の中で使用されている関数(StrConv、Mid、Left、Right)を持っている言語なら同じものを作れると思います。
VBScript には、「StrConv」関数がないため実現できなさそうですが、「BASP21」を組み込んであげれば「BASP21」側に同じ機能を持つ関数が用意されていて利用できるため、VBScript でも実現できると思います。
「BASP21」の詳細は、こちらをどうぞ。
コメント
初めましてこんにちは。VBA勉強中のモノです。
文字列変換について調べていたら、こちらのサンプルを見つけました。
自分が探していたコードサンプルとして非常に近いもので、また
変換部分のコードもわかりやすく、ぜひ使わせていただきたいと思いました。
ですが、標準モジュールに貼付け、実行してみたのですが、
エクセルから何も反応がありませんでした・・・ただ貼り付け、実行しても
ダメなのでしょうか?
また、もし指定のセルに対して変換を行う場合は
subプロシージャでどう指定すればよろしいでしょう?
長文すみません。よろしければご教授いただけないでしょうか。
よろしくお願いします。
ほぼ頂いた内容にて処理できました。ただ、カタカナのタが抜けているように思いました。
ありがとうございました。
ちゃちゃ様、コメントと指摘ありがとうございます!
タとミが抜けていたので修正しました。