仕事で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