元システムエンジニアのプログラム覚書と映画レビューその他(仮)

それほど映画に詳しいわけでもないけど、結構映画館に行くのが好きなおっさん元SEが観た映画をレビューします。ネタバレ的なこともいうので、これから観るって人は注意してください笑。たまにプログラムの覚書、グルメ、たわごと…などをぶちまけます。

instr関数が大文字と小文字の区別をしない?

アクセスVBAでプログラムを組んでいる。

で、ある変数の中に指定した文字列があるかどうかを調べるとき、
instr関数というのを使っている。

例えば、すごく雑な例だけど

Dim strA As String
Dim strB As String
strA = "123A"
strB = "3b"

If InStr(strA, strB) <> 0 Then
MsgBox "ある"
Else
MsgBox "ない"
End If

みたいに。

この時、当然、「ない」となる。
ちなみに、instrの返り値はその文字がある場所を返すので
上の場合

strA = "123A"
strB = "3b"
MsgBox InStr(strA, strB)

とすると"0"と表示される。
 

これをこうしても

 strA = "123A"
strB = "3a"
MsgBox InStr(strA, strB)

"0"と表示される。

つまり、大文字と小文字の英数字を判定していることになる。

もし大文字、小文字の区別をしたくないという場合は
「instrの引数に"vbTextCompare"の指定をする」
ということになる。
 
 
で、問題は…
どういうわけか、仕事場の環境では
 
strA = "123A"
strB = "3a"
MsgBox InStr(strA, strB)

とした場合、"3"が返ってくる。

つまり、大文字であろうが、小文字であろうが
「"a"と"A"は同じ」
というようになってしまう。

これではよろしくないので
大文字、小文字の区別をさせようとするには…

と調べたところ、
「instrの引数に"vbBinaryCompare"の指定をする」
といったことが書かれているのを発見。

MsgBox InStr(strA, strB, vbBinaryCompare)

んで、やってみたんだが
「型が一致しません」
というメッセージが出てエラーになってしまう。

どういうこっちゃ…


と調べていくと、どうやら
instr関数には引数がいろいろあって、
通常は省略可能なものが多く、

MsgBox InStr(strA, strB)
こんな書き方だけでいいんだけど、
"vbBinaryCompare"
とか
"vbTextCompare"
といった引数を指定する場合は
「何文字から検索するか?」
というものも同時に指定しないといけないらしい。

で、
strA = "123A"
strB = "3a"
MsgBox InStr(1, strA, strB, vbBinaryCompare)

とすると、ちゃんと大文字と小文字の区別をしてくれて
"0"が返るようになった。

instr関数の引数に関して書かれているサイトはいろいろあるみたいだけど

"vbBinaryCompare"
とか
"vbTextCompare"
といった引数を指定する場合は
「何文字から検索するか?」
というものも同時に指定しないといけない
ということを書かれているものはあまりなかったと思う。