VBAで文字列を比較していると、「大文字と小文字を区別したい」「区別せずに判定したい」と考える場面があります。このような文字列比較のルールをモジュール単位で設定できるのがOption Compareステートメントです。
しかし、Option CompareにはBinaryとTextの2種類があり、それぞれ比較結果が異なるため、意味を理解せずに設定すると意図しない判定になることがあります。
この記事では、Option Compareステートメントの基本的な役割から、BinaryとTextの違い、実務でどちらを選ぶべきかまで分かりやすく解説します。
✅ Option Compareステートメントとは
Option Compareは、文字列を比較するときのルールをモジュール単位で指定するステートメントです。
普段は意識せずに文字列比較を行っていても、環境や設定によって比較結果が変わることがあります。
特に顧客コードや商品コード、ユーザーIDなどを扱うシステムでは、「ABC」と「abc」を同じ文字列として扱うのか、それとも別の文字列として扱うのかを明確に決めておく必要があります。
そのため、Option Compareの役割を理解しておくことは、保守性の高いVBAを作成するうえで重要です。
・Option Compareで指定できる種類
VBAでは主に次の2種類を使用します。
- Option Compare Binary
- Option Compare Text
それぞれ文字列比較の方法が異なります。
モジュールの先頭へ記述することで、そのモジュール全体の比較方法が決まります。
・記述する場所
Option Compareは、モジュールの一番上に記述します。
例えば次のようになります。
Option Compare Binary
Option Explicit
または
Option Compare Text
Option Explicit
Option Explicitより前に記述する必要があります。
途中へ記述したり、プロシージャ内へ書いたりすることはできません。
・設定しない場合はどうなる?
Option Compareを省略した場合は、
Option Compare Binary
が指定されたものとして動作します。
つまり、大文字・小文字を区別する比較が標準になります。
そのため、Textで比較したい場合は明示的に設定する必要があります。
Option Compareは文字列比較のルールを決めるステートメントです。実際に「=」「<>」などの演算子で文字列を比較する方法や注意点については、【VBA】演算子で文字列を比較する方法|一致判定・大小比較・注意点を実務で理解するの記事で詳しく解説しています。
✅ Option Compare Binaryとは
Option Compare Binaryは、文字コードを基準に文字列を比較します。
そのため、大文字と小文字は別の文字として扱われます。
VBAではこちらが標準設定です。
実務でも、IDやコードなどを厳密に比較したい場合によく利用されます。
・比較結果の違い
例えば次のような文字列を比較するとします。
ABC
abc
Binaryでは、この2つは一致しません。
つまり、
- ABC ≠ abc
- A ≠ a
という判定になります。
・Binaryが向いているケース
Binaryは、文字列を厳密に比較したい場面で利用します。
例えば、
- 商品コード
- 顧客ID
- 社員番号
- システム識別子
- ファイル名
などです。
これらは、大文字と小文字を区別しなければならないケースがあるため、Binaryの方が安全です。
Option Compareの設定は、IF文による文字列比較の結果にも影響します。完全一致で安全に判定する方法については、【VBA】文字列の完全一致の処理(IF文)|実務で壊れない条件分岐の基本設計の記事も参考にしてください。
✅ Option Compare Textとは
Option Compare Textは、大文字と小文字を区別せずに比較します。
ユーザーが入力した文字列を検索したい場合などでは、こちらの方が使いやすいケースもあります。
ただし、すべての文字列比較がTextになるため、用途を考えて設定する必要があります。
・比較結果の違い
例えば、
Excel
excel
を比較すると、
Textでは一致と判定されます。
つまり、
- Excel = excel
- VBA = vba
という結果になります。
利用者が入力するデータを扱う場合には便利な設定です。
✅ BinaryとTextはどちらを選ぶべき?
「どちらを設定すればよいのか」と迷う方も多いでしょう。
実際には、プロジェクト全体の設計方針によって使い分けることが重要です。
単純に「Textの方が便利」「Binaryの方が安全」と決めるのではなく、どのようなデータを扱うのかを考えて選択する必要があります。
次の章では、実務で保守しやすいコードを書くために、なぜ安易にOption Compare Textへ変更しない方がよいケースがあるのか、また実際のコード例を交えながら設計の考え方と使い分けのポイントについて詳しく解説します。
✅ 実務ではOption Compareをどう使い分けるべき?
Option Compareは一度設定すると、そのモジュール内のすべての文字列比較に影響します。
そのため、「この比較だけ大文字・小文字を無視したい」という理由だけで Option Compare Text を設定すると、後から別の比較処理にも影響し、思わぬ不具合につながる可能性があります。
実務では「モジュール全体のルールを変更する」のか、「特定の処理だけ比較方法を変える」のかを意識して設計することが大切です。
・基本はBinaryを採用するケースが多い
実務では、Option Compareを記述しない(=Binaryのまま利用する)ケースが多くあります。
理由は、Binaryであれば文字列を厳密に比較できるためです。
例えば、
- 商品コード
- 顧客コード
- 社員番号
- ファイル名
- フォルダ名
- システム識別子
などは、大文字・小文字を区別する前提で設計されていることがあります。
最初からTextへ変更してしまうと、本来は別データとして扱うべき文字列まで一致と判定してしまう可能性があります。
そのため、保守性を重視する実務では、まずBinaryを基準として考えることが一般的です。
・Textが向いているケース
一方で、Textの方が適している場面もあります。
例えば、
- 利用者が入力した名前を検索する
- 商品名を検索する
- 都道府県名を比較する
- アンケート回答を判定する
など、人が入力する文字列では、大文字・小文字を区別しない方が自然なケースがあります。
例えば、
- Excel
- excel
- EXCEL
これらをすべて同じ文字列として扱いたいのであれば、Textを利用するメリットがあります。
ただし、そのモジュール内すべての比較に影響することを理解したうえで設定することが重要です。
大文字・小文字を区別しない比較を行いたい場合は、UCase関数を利用して文字列を統一してから比較する方法もあります。詳しくは【VBA】UCase関数で文字列を大文字に変換する方法|実務で役立つ活用例も解説の記事をご覧ください。
モジュール全体の比較ルールを変更するのではなく、比較方法を処理ごとに明示したい場合は、StrComp関数を利用する方法がおすすめです。詳しい使い方は、【VBA】StrComp関数の活用|文字列比較を安全・正確に行う実務テクニックの記事で解説しています。
✅ 実務で保守しやすいコードを書くための考え方
Option Compareはモジュール全体へ影響するため、実務では「本当に変更する必要があるのか」を先に考えるようにしています。
比較方法を変えたい処理が一か所だけなら、モジュール全体の設定を変更するよりも、その処理だけ比較方法を指定した方が後から見ても意図が分かりやすくなります。
ここでは、保守性を意識した実装例を紹介します。
・比較方法が分かるコードを書く
次のコードでは、モジュール全体はBinaryのままにしつつ、StrComp関数を利用して比較方法を明示しています。
Option Compare Binary
Option Explicit
Sub CompareUserName()
'比較対象の文字列
Dim inputUserName As String
Dim registeredUserName As String
inputUserName = "excel"
registeredUserName = "Excel"
'TextCompareを指定して大文字・小文字を区別しない比較を実施
If StrComp(inputUserName, registeredUserName, vbTextCompare) = 0 Then
MsgBox "一致しました。"
Else
MsgBox "一致しません。"
End If
End Sub
このような書き方にしている理由は、「この比較だけ大文字・小文字を区別しない」という意図をコードから読み取れるようにするためです。
モジュール全体をTextへ変更すると、他の開発者が後からコードを読んだ際に「なぜこの比較も一致するのか」が分かりにくくなります。
一方で、StrCompへvbTextCompareを指定しておけば、その処理だけ比較方法を変更していることが一目で分かり、後から仕様変更する場合も影響範囲を把握しやすくなります。
今回紹介したStrComp関数について、構文や比較モードの違い、実務での活用例をさらに詳しく知りたい方は、【VBA】StrComp関数の活用|文字列比較を安全・正確に行う実務テクニックの記事もご覧ください。
✅ Option Compareを使うときの注意点
Option Compareは便利な機能ですが、いくつか知っておきたい注意点があります。
設定場所や影響範囲を理解していないと、思わぬ比較結果になることがあります。
・モジュールごとに設定される
Option Compareはプロジェクト全体ではなく、モジュール単位で設定されます。
つまり、
- Module1はBinary
- Module2はText
というように、モジュールごとに異なる設定を行うことも可能です。
そのため、大規模なプロジェクトでは、どのモジュールがどの設定になっているかを把握しておく必要があります。
標準モジュールの役割や、Sub・Functionの呼び出し方について詳しく知りたい方は、【VBA】標準モジュールの呼び出し方法とは|Sub・Functionの使い分けと実務設計の記事もあわせてご覧ください。
・途中から変更すると影響範囲が大きい
既存のモジュールでBinaryからTextへ変更すると、それまで動作していた文字列比較の結果が変わる可能性があります。
例えば、
- If文
- Select Case
- Like演算子
- Replace関数
- InStr関数(一部の使い方)
など、文字列比較を伴う処理では結果が変わることがあります。
既存システムでは、十分にテストしてから変更することが重要です。
・比較方法をコード内で明示する方法もある
「この処理だけ比較方法を変更したい」という場合は、Option Compareに頼る必要はありません。
例えば、
StrCompInStrReplace
などの関数では、比較方法を引数で指定できるものがあります。
実務では、モジュール全体へ影響するOption Compareよりも、このように必要な箇所だけ比較方法を指定する設計の方が保守しやすいケースも多くあります。
InStr関数でも比較方法を指定できます。文字列検索を行う際の実践的な使い方については、【VBA】(セル内)特定の文字の最初の位置を検索(InStr関数の使用方法)の記事で詳しく解説しています。
Option Compareはモジュール単位で設定されます。モジュールの種類や役割について理解を深めたい方は、【VBA】モジュールの【種類・役割・特徴】とは何か|正しい使い分けと実務設計を徹底解説の記事も参考になります。
✅ まとめ:Option Compareは影響範囲を理解して使い分けよう
Option Compareステートメントは、VBAの文字列比較ルールをモジュール単位で設定できる便利な機能です。
しかし、設定を変更するとモジュール全体へ影響するため、用途を理解したうえで利用することが重要です。
- Option Compareは文字列比較方法を指定するステートメント
- Binaryは大文字・小文字を区別して比較する
- Textは大文字・小文字を区別せず比較する
- 設定しない場合はBinaryとして動作する
- モジュール全体へ影響するため変更は慎重に行う
- 実務ではBinaryを基本とするケースが多い
- 特定の処理だけ比較方法を変更したい場合は、
StrCompなどで明示的に指定すると保守性が高まる
文字列比較は、見た目では同じでも処理結果に大きな影響を与えることがあります。Option Compareの役割を正しく理解し、データの性質やシステム設計に合わせて適切に使い分けることで、保守しやすく信頼性の高いVBAコードを作成できるようになります。