もう2015年だというのにWindowsで「外字」を使ったデータに遭遇しました。
標準で使える文字に置き換える、もしくは文字を画像として作るのが定番となって久しいと思っていたので、驚きました。
ともあれ、外字の有無をチェックする必要が生じたので、ユーザー定義関数を作ってみました。
シフトJISの場合、16進で0xF000-0xFFFCが外字の領域になります。
VBAにはAscという関数があり、文字列の先頭のコードを返します。このコードはシフトJISのコードと比べると、外字の領域を含む範囲では、ちょうど0x10000の分だけ少ないので、これを利用します。
Function is_gaiji(text As String) As Boolean
'外字を含む文字列の場合、TRUEを返す。
'シフトJISの場合、0xF000-0xFFFCが外字の領域。
'シフトJISのコードとVBAのAscが返すコードの差は0x10000。
Dim asc_start As Long
Dim asc_end As Long
Dim len_text As Long
Dim i As Long
Dim t As String
Dim a As Long
asc_start = CLng("&hF000") - CLng("&h10000")
asc_end = CLng("&hFFFC") - CLng("&h10000")
len_text = Len(text)
is_gaiji = False
For i = 1 To len_text
t = Mid(text, i, 1)
a = Asc(t)
If asc_start <= a And a <= asc_end Then
is_gaiji = True
End If
Next i
End Function
'外字を含む文字列の場合、TRUEを返す。
'シフトJISの場合、0xF000-0xFFFCが外字の領域。
'シフトJISのコードとVBAのAscが返すコードの差は0x10000。
Dim asc_start As Long
Dim asc_end As Long
Dim len_text As Long
Dim i As Long
Dim t As String
Dim a As Long
asc_start = CLng("&hF000") - CLng("&h10000")
asc_end = CLng("&hFFFC") - CLng("&h10000")
len_text = Len(text)
is_gaiji = False
For i = 1 To len_text
t = Mid(text, i, 1)
a = Asc(t)
If asc_start <= a And a <= asc_end Then
is_gaiji = True
End If
Next i
End Function
Excel2013で確認しましたが、充分なデバッグをしていませんし、環境によっても違うかもしれませんので、ご利用にあたっては自己責任ということでお願いします。
コメント