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になる。それがまともな判断だと思う。
それでもExcelやAccessで前時代的なVBAを使わなければいけない貴方は次のメソッドを使いましょう。

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

コメントを残す

メールアドレスが公開されることはありません。