表題のこの表現が正しいかどうかはわかりませんが、最近表題のような事象に遭遇したので書き留めます。
どういうことかというと、全角スペースは” ”、半角スペースは” “と表現すると思いますが、Access VBAでは、どちらも同じ「スペース(空白)」として認識されるようです。
(Excel VBAではこのようなことはなく、全角スペースは全角スペースとして、半角スペースは半角スペースとして認識されます)
例えば下記のようなユーザー定義関数があるとします。
Function Access全角半角区別しない(t_str As String)
Access全角半角区別しない = "全角スペース:" & UBound(Split(t_str, " ")) & _
" 半角スペース:" & UBound(Split(t_str, " "))
End Function
上記の関数をクエリで利用した場合、「全角 のはず」(空白は全角)という文字列の戻り値は
本来は「全角スペース:1 半角スペース:0」となるはずが「全角スペース:1 半角スペース:1」となり、半角スペースとしても認識されてしまいます。(逆も同じ、理由は不明)
→Excelでは正しく「全角スペース:1 半角スペース:0」と返ります。
理由はわからないのですが、Accessではバイナリーを厳格に認識しているのかなと思い、下記のようなコードに変更したところ、全角スペースと半角スペースを正しく認識しました。
Function 全角スペースと半角スペースの数(t_str As String) As String
Dim zen_str As Integer '全角スペースの数
Dim han_str As Integer '半角スペースの数
Dim i, tmp_str
For i = 1 To Len(t_str)
tmp_str = Mid(t_str, i, 1)
Select Case InStr(1, tmp_str, " ", 0) '←ここがポイント
Case Is > 0: zen_str = zen_str + 1
End Select
Select Case InStr(1, tmp_str, " ", 0) '←ここがポイント
Case Is > 0: han_str = han_str + 1
End Select
Next
全角スペースと半角スペースの数 = "全角スペース: " & zen_str & _
" 半角スペース: " & han_str
End Function
上記の関数をクエリで利用した場合、「全角 のはず」(空白は全角)という文字列の戻り値は
正しく「全角スペース:1 半角スペース:0」となりました。
InStr関数の最後の引数「compare」に「0」を指定※することで、バイナリモードで比較を行うので、全角半角、大文字小文字が区別され、直前の引数” ”を全角と認識してくれるようです。(もちろんこの関数はExcelでも全角スペースと半角スペースを正しく認識します)
※InStr関数の最後の引数「compare」の初期値は「0」なので、これを省略してもバイナリ比較になります。
コメント