Excel VBAの「StrComp 関数」について解説します。
StrComp 関数とは
Excel VBA の StrComp 関数とは、二つの文字列を比較して結果を数値で返します
返された数値が 0 なら等しい。0 以外なら等しくないということです。
StrComp 関数(Visual Basic for Applications リファレンス)
構文(引数と戻り値)
Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。
構文
StrComp(string1, string2[, compare ])
引数
引数 | 説明 |
---|---|
string1 | 【必須】任意の文字列(式)を指定します |
string2 | 【必須】任意の文字列(式)を指定します |
compare | 【省略可能】比較するモードを指定します ※省略時の規定はバイナリモード(0)です。 |
[compare] 比較モード
定数 | 値 | 説明 |
---|---|---|
vbBinaryCompare | 0 | バイナリモードで比較します【省略時の既定モード】 大/小文字、全/半角、ひらがな/カタカナを区別します。 |
vbTextCompare | 1 | テキストモードで比較します 大/小文字、全/半角、ひらがな/カタカナを区別しません。 |
戻り値
StrComp 関数の戻り値は次のとおりです。
比較結果 | StrComp が戻す値 |
---|---|
string1 と string2 が 等しい | 0 |
string1 が string2 より 小さい | -1 |
string1 が string2 より 大きい | 1 |
string1 または string2 が Null | Null |
比較結果の戻り値が 0 なら等しい。0 以外なら等しくないということです。
文字列の比較は先頭から1文字づつ比較していき、相違した文字の文字コードの比較で「小さい(-1)」「大きい(1)」を判定しています。
解説(使用例)
簡単なサンプルコードを作成して使用例を解説します。
StrComp 関数 サンプル
StrComp 関数の動作がわかる簡単なサンプルを見てみましょう。
文字列の比較モードによる違いを表示する
'■StrComp関数の比較モードを確認する
Sub StrComp_Sample01()
Dim a As String, b As String
Dim bc As Integer, tc As Integer
'▼比較文字列を各変数に代入
a = "JAPAN": b = "japan"
GoSub res '比較サブルーチンへ分岐
a = "JAPAN": b = "Japan"
GoSub res
a = "ニッポン": b = "ニッポン"
GoSub res
a = "ニッポン": b = "にっぽん"
GoSub res
Exit Sub
'▼StrComp各比較モードで実行して結果を比較表示
res:
bc = StrComp(a, b) 'バイナリモード比較
tc = StrComp(a, b, 1) 'テキストモード比較
Debug.Print a & " と " & b & " の比較結果は"
Debug.Print "バイナリモードでは:" & bc
Debug.Print "テキストモードでは:" & tc _
& vbCrLf
Return '元の場所へ復帰
End Sub
実行結果の イミディエイト 画像がこちらです。
▼比較する文字列を各変数に代入します
・6行目、変数 a に “JAPAN” 、変数 b に “japan” を代入しています。
・8行目、10行目、12行目も同じようにそれぞれの変数に文字列を代入させています。
・7行目、GoSub…Returnステートメントで 16行目の res: 行へ処理を分岐させています。
▼StrComp各比較モードで実行して結果を比較表示
・17行目、StrComp関数のバイナリモード(既定)で文字列を比較して変数 bc に戻り値を入れています。
・18行目、StrComp関数のテキストモード(compare=1)で文字列を比較して変数 tc に戻り値を入れています。
・19~22行目で、結果を Debug.Print 表示しています。上の結果画像を参照ください。
・23行目は、Return で分岐元の場所へ処理を戻しています。
テキストモードでは、文字種が違っていても同一とみなされてしまうことが確認できます。
文字列内の全文字を比較するサンプル
文字列比較では、最初に相違した部分の文字コードで返される値が決まります。StrComp 関数はその結果を返して終了しますが、どの部分が相違していたのかはわかりません。
そこで次のサンプルは、文字列を一文字づつ比較して何文字目がどのように相違しているのかを表示します。
'■文字列内の全文字を比較して結果を表示するサンプル
Sub StrComp_Sample02()
Dim a As String, b As String, res As String
Dim i As Integer
Dim n As Long, m As Long
'▼比較文字列を各変数に代入
a = "ABCD"
b = "AbCdE"
'▼文字列数の最大値取得
m = WorksheetFunction.max(Len(a), Len(b))
'▼先頭から1文字づつ比較して結果を保存
For n = 1 To m
i = StrComp(Mid(a, n, 1), Mid(b, n, 1))
If i <> 0 Then
res = res & n & "番目の文字:" & _
Mid(a, n, 1) & "<>" & Mid(b, n, 1) & vbCrLf
End If
Next
'▼比較結果をMsgBoxで表示
If res <> "" Then
MsgBox "文字列「" & a & "」と" & vbCrLf & _
"文字列「" & b & "」は" & vbCrLf & _
"次の文字が相違しています" & vbCrLf & res
Else
MsgBox "文字列「" & a & "」と" & vbCrLf & _
"文字列「" & b & "」は" & vbCrLf & _
"文字相違はありませんでした!"
End If
End Sub
実行結果の MsgBox 画像です。
▼比較文字列を各変数に代入
・7行目、8行目で、比較したいそれぞれの文字列を各変数 a , b に代入しています。
▼文字列数の最大値取得
・10行目、m = WorksheetFunction.max(Len(a), Len(b)) は、ワークシート関数の Max を使ってそれぞれの文字数の最大値を取得しています。この値がループ処理の最終値になります。
▼先頭から1文字づつ比較して結果を保存するループ処理
・13行目で、StrComp 関数に各文字列の先頭から1文字づつ比較させています。Mid 関数で1文字づつ文字を取り出していく設定です。戻り値を変数 i に代入します。
・14~17行目では、文字比較の戻り値 i の値で処理を分岐させます。i = 0 の場合は「同一」なので処理をしません。i <> 0 の場合、レスポンス用の変数 res に結果を書き込んでいく設定です。
▼比較結果をMsgBoxで表示
・20~28行目は、比較結果を MsgBox で表示する設定です。20行目で res が空白だった場合は 25 行目の MsgBox、res がある場合は 25 行目の MsgBox(コード下の画像)を表示します。
実行結果で相違が無かった場合の MsgBox サンプル画像がこちらです。
おわりに
VBAの関数一覧はこちらです。
VBAサンプルファイルダウンロードページのご案内
このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。
ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!
Excel VBA StrComp 関数で二つの文字列を比較してその結果を返す方法について解説しました。
比較結果の戻り値が 0 なら等しい。0 以外なら等しくないということです。
比較は文字列の先頭から比較していった最初の文字の文字コードを比較する仕様となっています。
StrComp 関数の戻り値からは、どの文字が相違していたのかは判断できません。
記事内に提示したサンプルコードでは、文字列のすべての文字同士を StrComp 関数で比較して、何番目のどの文字で相違していたのかがわかります。
このように、関数単独では把握できない情報も、他の関数やステートメントを VBA でうまく組み合わせて使うことによって取得させることができます。
以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;