和風スパゲティのレシピ

日本語でコーディングするExcelVBA

文字列比較の設定を変更する - Option Compare

文字列を比較する際、通常は大/小文字や全/半角は区別されます。

If "A" = "a" Then
   MsgBox "ここは実行されません。"
End If

この設定を変更し、大/小文字、全/半角を同一とみなす設定にするには、
Option Compare ステートメントを使用します。

サンプルコード

Option Explicit
' 文字列比較を大/小文字、全/半角区別なしに変更
Option Compare Text

Sub 文字列比較テスト()

    If "APPLE" = "apple" Then
        MsgBox "一致"
    End If

End Sub

解説

Option Compare ステートメントを使用することで、
文字列比較の設定をバイナリ↔テキストで切り替えできます。

バイナリ比較では「大文字/小文字、全角/半角」が区別され、
テキスト比較ではこれらが区別されません。


通常はバイナリモードになっていますので、
事実上はテキストモードに切り替えるときに使用するステートメントですね。


一応設定できる値が3つあり、

Option Compare Text
Option Compare Binary
Option Compare Database

この3種のステートメント実行方法がありますが、

Binaryは元の設定であるため指定する意味は特になく、
DataBaseはAccess専用の設定でExcelVBAではエラーになります。

よって実際はTextの時のみ使用するステートメントと思ってOKです。

比較演算子「<」「>」を使用したときの挙動

文字列の比較は「=」だけでなく、
比較演算子「<」「>」も使用することができます。

文字コード上でどちらが大きいか(並び替えで上にくる方が小)を比較でき、
以下のようなコードで判定を行うことができます。

If "A" < "B" Then
    MsgBox "ここは実行されます。"
End If

 
この比較にもOption Compareステートメントは反映され、
以下のコードの判定結果が変わります。

Option Explicit
' 文字列比較を大/小文字、全/半角区別なしに変更
Option Compare Text

Sub 文字列比較テスト()

    If "a" < "B" Then
        MsgBox "Option Compare Textでは実行されます。"
    End If

End Sub

 
aとBの大小がちょっと複雑ですが、アルファベットだけで概要を説明しますと、

バイナリ A < B < C < … < Z < a < b < …
テキスト A = a < B = b < C = c < …

このような判定になっています。


大文字小文字を区別せずに文字列をソートする関数などを作る際は、
専用のモジュールを作りこの設定を使用してください。

特定のコードでのみテキスト比較を行う - StrComp関数

今回の設定は「モジュール全体」に反映されてしまうため、
他のコードに影響しては困る場合は使用できません。


ある特定の行の比較でのみテキスト比較を行いたい場合は、
StrComp関数を使用します。

Sub 文字列比較テスト()

    If StrComp("APPLE", "apple", vbTextCompare) = 0 Then
        MsgBox "一致"
    End If

End Sub

StrComp関数の第3引数に「vbTextCompare」を指定することで、
テキスト比較による文字列判定を行うことができます。


結果値は以下の3種(例外を入れて4種)になっていますので、
一致判定は上記コードの通り「=0」で行うことになります。

比較結果 文字列の判定
-1 文字列1<文字列2
0 文字列1=文字列2
1 文字列1>文字列2
Null いずれかの文字列がNull


この関数を使用すれば、特定の行のみテキスト比較を行うことができます。

モジュール全体に設定できない場合はこちらを使用してください。


詳しくはこちらのページをどうぞ。
www.limecode.jp