読者です 読者をやめる 読者になる 読者になる

六帖のかたすみ

DVを受けていた男性。家を脱出して二周目の人生を生きています。自閉症スペクトラム(受動型)です。http://rokujo.org/ に引っ越しました。

VBA:それは全角と半角、大文字小文字を区別しないアバウトな言語

仕事でAccessVBAを使っていて1点ハマったことがあった。CSVファイルのカンマ区切りの指定したカラムの文字列を取り出す、という私ではない誰かが作った関数に欠陥があるので、その調査をしていた。

'※記述は変えてあります
Public Function mid_between_comma(strin As String, strout As String, J As Integer) As Integer
Dim i As Integer, AAA As Integer, cnt As Integer
Dim cnt_X(2) As Integer, cnt_A(2) As Integer
Dim strtemp As String
cnt = 0
    For i = 1 To Len(strin)
        strtemp = Mid(strin, i, 1)
            If strtemp = "," Then
                cnt = cnt + 1
                    If cnt = J Then
                        cnt_X(1) = cnt
                        cnt_A(1) = i
                    End If
                    
                    If cnt = J + 1 Then
                        cnt_X(2) = cnt
                        cnt_A(2) = i
                    End If
            End If
    Next
'以下略

これだけ見ると動作しそうだ。しかし、次のような行を読ませるとまともに動作しない(内容は変えてあります)。

5,55,5555,55,5555,5555,5555555555,5555,555555,"ジョセフ・ジョースター,きさま!,見ているなッ!",55,555,5,5555,5,5,5555,5,5,5,5,5,5,5,"5,55,55,5555

『,"ジョセフ・ジョースター,きさま!,見ているなッ!"』このカラムを丸ごと取り出したいのに、全角カンマが何故かセパレーターと認識され、例えば『"ジョセフ・ジョースター』だけが取り出されてしまう。理由がわからないので上記のコードをデバッグしていた。すると

If strtemp = "," Then

なんとここ、strtempに全角カンマが入っていても、Trueとなった!!あほか!!!!
カンマだけなのか?とデバッガ上で次のように試してみた。

"S" = "S" 'True
"0" = "0" 'True
"a" = "A" 'True
"0B1" = "0b1" 'True

おいマジかよ!アンビリーバボー!ありがた迷惑!
というわけで、VBAを扱う方は注意!彼のイコール演算子は、全角半角、大文字小文字を区別してくれない。丹精込めて作成したコードが思わぬ誤動作をしているならば、このクソみたいな仕様が原因かもしれない。。なお、VB.NETでは、上記の比較は全てFalseになる。それがまともな判断だと思う。
それでもExcelAccessで前時代的なVBAを使わなければいけない貴方は次のメソッドを使いましょう。

StrComp(",", ",", vbBinaryCompare) 'False