【Access VBA】Accessでは全角スペースと半角スペースを区別しない

表題のこの表現が正しいかどうかはわかりませんが、最近表題のような事象に遭遇したので書き留めます。

どういうことかというと、全角スペースは” ”、半角スペースは” “と表現すると思いますが、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」なので、これを省略してもバイナリ比較になります。

コメント

タイトルとURLをコピーしました