Access VBA のInStr関数がおかしい

InStr関数の戻り値がおかしい。AccessのVBEを起動してイミディエイトウィンドウで試してみてください。

 

? InStr("かきくけこ","こ")
 5
? InStr("がぎぐげご","ご")
 9

なにこれ?でしょ。これはInStr関数の比較モードがデータベースモード(vbDatabaseCompare)の場合にこうなります。比較モードがデータベースモードの場合には,濁点も1文字と数えるという仕様が原因だそうです。Access VBAではデフォルトがこの比較モードなのでわりと頻繁に発生します。

普通に文字列の中から普通に位置を知りたい場合は次のように比較モードを指定します。

? InStr(1,"がぎぐげご","ご",vbTextCompare)
 5

この場合,注意しなければならないのは第1引数(検索開始位置)が省略できなくなることです。ヘルプにも,「引数 compare を指定した場合は、引数 start も指定する必要があります。」とあります。別な回避方法としては,

Option Compare Text

を使う方法がありますが,ここを変更すると普通に文字列の比較をしている部分での動作も違ってきてしまいますので,注意が必要です。

この事実は,普通に

InStr(strFoo, strBar)

という書き方をしている部分は全てバグが発生する可能性があるということを表します。ご自分の書いたコードを見直してInStr関数を使用しているところはすべてチェックすべきでしょう。

参考サイト

[ACC2002] Access プロジェクトで VBA の InStr 関数が返す値が間違っている

 

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。