バグ

【トラブル】InStr・InStrRev関数で結果が正しく取得されない

マクロを組んでいると、たまにInStr関数やInStrRev関数の結果が
正しく取得されない時があるので検証してみました。
サンプルは○○-○○-○○-09-****というような番号から、
****だけを抜き出すというマクロです。

strWord = 〜の部分をどちらか一方をコメントにしてそれぞれ実行すると、
「strWord = "○○-〜」の方は正常に取得できるのに、
「strWord = "ガ○-〜」の方は1文字分ずれてしまいます。

サンプルコード1



Sub NumCheck1()
 Dim strWord As String
 Dim check As String '「****」のチェック用
 Dim i As Long

 strWord = "○○-○○-○○-09-****" '正常
 strWord = "ガ○-○○-○○-09-****" 'ずれる

 '◆管理番号の「****」が数字に直っているかチェック
 i = InStrRev(StrConv(strWord, vbNarrow), "-")

 If i > 0 Then
  check = Mid$(strWord, i + 1, 4)
 End If

 '◇確認用
 MsgBox check

 If check = "****" Then
  MsgBox "管理番号の「****」を数字に直してください。"
 End If
End Sub


半角カナの濁音・半濁音は文字部分と濁点・半濁点の部分が分かれているために、このような状況になるらしいです。
たとえば、「ガ」を半角にすると、半角の「カ」と濁点で2文字になります。

Public Sub ConvertTest()
 Dim strWord As String
 strWord = "ガ"
 MsgBox Len(strWord)       '全角カタカナは1文字
 MsgBox Len(StrConv(strWord, vbNarrow)) '半角カタカナの濁音・半濁音は2文字
End Sub

文字数が増えるのは濁音・半濁音の部分だけなので、単純に文字数が2倍になるというわけではないのがやっかいです。

まとめ(文字化け対策のため画像です)
katakana01.png

記事にコメントで指摘いただきましたとおり、文字位置を半角で取得したらMid関数で取り出すときも半角に変換した文字を使うことで対応できます。

Public Sub NumCheck2()
 Dim strWideWord As String
 Dim strNarrowWord As String
 Dim check As String '「****」のチェック用
 Dim i As Long

 strWideWord = "○○-○○-○○-09-****" '正常
 strWideWord = "ガ○-○○-○○-09-****" 'ずれる

 '◆半角に変換
 strNarrowWord = StrConv(strWideWord, vbNarrow)

 '◆管理番号の「****」が数字に直っているかチェック
 i = InStrRev(strNarrowWord, "-")

 If i > 0 Then
  check = Mid$(strNarrowWord, i + 1, 4)
 End If

 '◇確認用
 MsgBox check

 If check = "****" Then
  MsgBox "管理番号の「****」を数字に直してください。"
 End If
End Sub


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



Powered by Seesaa
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。