和風スパゲティのレシピ

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

文字列の順序を比較する - StrComp関数

文字列の順序を比較する際に使用する、StrComp関数について解説します。

基本構文

比較結果 = StrComp(文字列1, 文字列2, 比較種類)

 

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

 

比較種類 判定内容
vbUseCompareOption -1 Option Compare に従う
省略時はこれだがなぜか明示するとエラー
vbBinaryCompare 0 バイナリ比較(大/小文字、全/半角を区別しない)
vbTextCompare 1 テキスト比較(大/小文字、全/半角を区別しない)
vbDatabaseCompare 2 使用不可(Microsoft Access)

サンプルコード

Debug.Print StrComp("A", "a", vbBinaryCompare) ' -1
Debug.Print StrComp("A", "a", vbTextCompare) ' 0
Debug.Print StrComp("A", "a") ' -1 ※ Option Compareの設定による

Debug.Print StrComp("A", "B", vbBinaryCompare) ' -1
Debug.Print StrComp("a", "B", vbBinaryCompare) ' 1
Debug.Print StrComp("a", "B", vbTextCompare) ' -1

解説

文字列の順序(文字コード順にしたときどちらが大きいか)を比較する際は、
StrComp関数が使用できます。


結果値は-1、0、1の3値で判定されますので、
以下の対応から文字列比較の結果を読み取ってください。

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


比較の仕様は「バイナリ/テキスト」の2つを選択することができ、
大文字小文字、全角半角を区別するかどうかを指定できます。

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

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

このような大小関係になっています。


この設定(第3引数)を省略時は通常バイナリ比較が行われますが、
Option Compare Textの宣言モジュールではテキスト比較になります。


よって第3引数は省略時「vbUseCompareOption」だと思われるのですが、
なぜかこの引数を明示するとエラーになります。

しかも「変数が定義されていません」エラーという不思議な挙動。


理由は不明ですが、Option Compareに従わせたい場合は第3引数を省略して下さい。

比較演算子「<」「>」も普通に使用できます。

文字列同士の順序(大小)を比較するのは配列のソートなど、
文字列を並び替えたりする場合が多いかもしれません。

ただ、実際のところ文字列は普通に比較演算子「<」「>」で比較できます。

Debug.Print "A" < "a" ' True

 
普通にこのコードの方が見やすいので、バイナリ比較はこちらでいい気がします。


StrComp関数は、

  • テキスト比較を行いたい(大文字小文字の区別をしたくない)が
  • Option Compareでモジュール全体をテキスト比較にはできない

場合の手段としてとらえておくといいのではないかと思います。