「そこにあるのに拾えない」事件

先日 Excel について、ある調査を依頼されました。
セル内に記載された品名を、正しく取得できないというのです。

このマクロは、例えば 、もし A1 に「六角穴付きボルト」と入力されているならば
「在庫数を確認してください。」
のメッセージを表示する、といった処理を行うものです。

f:id:Infoment:20180706213221p:plain

Sub Sample()
    If Range("A1").Value = "六角穴付きボルト" Then
        MsgBox "在庫数を確認してください。"
    End If
End Sub

f:id:Infoment:20180706213353p:plain

ところが実際は、ダンマリになってしまう。
私も試してみましたが、A1 セルの「六角穴付きボルト」を正しく拾ってくれません。

そこでまず、以下を疑いました。

  • 送り仮名の有り無し問題ではないか?(「六角穴付ボルト」など)
  • 「ボルト」が、半角になってないか?(「六角穴付きボルト」など)

しかしどれも、原因ではありませんでした。
最終的に原因を知りえたのは、全くの偶然です。

f:id:Infoment:20180706214434p:plain

理由はわかりませんが文字列の後ろに半角スペースが付されており、別の文字として認識されていたことが原因でした。

特に文字列の最後に入力されたスペースは、無色・無味・無臭の毒物に等しい。同じ理由で苦労した経験がないと、なかなか気づくことが出来ません。今回は簡易的に、Trim関数で前後のスペースを削除することで、ひとまず解決としました。

Sub Sample()
    Dim str As String
    str = Trim(Range("A1").Value)
    If str = "六角穴付きボルト" Then
        MsgBox "在庫数を確認してください。"
    End If
End Sub

今回のまとめ
現象:文字列を期待通りに認識できない
調査:本当に同じ文字列か?(送り仮名、半角全角など)
原因:文字の末尾に半角スペースが付されていた
処方:Trim関数で半角スペースを除去
結果:期待通りの動作となった

参考まで。