この記事では VBA で大文字と小文字を同じものとして判定する比較方法について解説します。
【VBA】StrComp関数
さっそくですけど、次のマクロを実行してみてくださいな。
'[VBA] Bynaryモードで文字列を比較 Sub CompareWords() Dim tf As Boolean Dim mystr1 As String Dim mystr2 As String mystr1 = "KOBATO" mystr2 = "kobato" 'mystr1=mystr2の真偽を変数に入れます bool = mystr1 = mystr2 Debug.Print bool End Sub
CompareWords() は「KOBATO」と「kobato」を比較させて、その真偽を返すように書かれたマクロなのですけど、結果は False(偽)と表示されます。つまり、VBA の既定では「大文字と小文字」を異なるデータとして判定していることになります。同じように、「全角と半角」や「ひらがなとカタカナ」も異なる文字列として判定されます。このような比較方法を Bynary モード とよびます。マクロによっては、大文字と小文字を同じものとして扱ったほうが便利なこともあります。「大文字と小文字」「全角と半角」「ひらがなとカタカナ」を同じものとして判定する比較方法を Text モードといいます。VBA でTextモードで比較したいときは以下で解説する StrComp 関数を使います。
VBA の StrComp は2つの文字列を比較して結果を数値または Null 値で返す関数です。
=StrComp(文字列1, 文字列2[,比較モード])
3つめの引数 [比較モード] を 1 または vbTextCompare で指定すると、Text モードの比較になります。2つの文字列が等しいときは 0 (True), 異なるときは 1 (False) が返ります。ちなみに StrComp は String Compare の略です。先ほどのマクロをちょっとだけ書き変えてみます。
'[VBA] Textモードで文字列を比較(1) Sub TextMode_1() Dim tf As Variant Dim mystr1 As String Dim mystr2 As String mystr1 = "KOBATO" mystr2 = "kobato" 'mystr1 と mystr2 の比較結果を tf に入れます bool = StrComp(mystr1, mystr2, vbTextCompare) Debug.Print bool End Sub 'TextMode_1()の実行結果: '0
TextMode_1() を実行すると 0 が戻ります。つまり「KOBATO」と「kobato」は同じ文字列であると判定されたわけです。最後にユーザーさんが好きな単語を入力して、それが同じであるかどうかを判定するマクロを作ってみます。
'[VBA] Textモードで文字列を比較(2) Sub Text_Mode_2() Dim tf As Variant Dim mystr1 As String Dim mystr2 As String mystr1 = InputBox("1つめの単語を入れてね") mystr2 = InputBox("2つめの単語を入れてね") 'mystr1 と mystr2 の比較結果を tf に入れます bool = StrComp(mystr1, mystr2, vbTextCompare) If bool = 0 Then MsgBox "同じ単語だよ" Else MsgBox "違う単語だよ" End If End Sub
Text_Mode_2() を実行すると単語の入力が促されるので、たとえば全角、半角で「コバト」「コバト」と入れると「同じ単語だよ」というメッセージが返ります。「コバト」「コトバ」と入れると「違う単語だよ」というメッセージが返ります … 当たり前だけですけどね。たまに間違える人がいるんですよね。「ことばさん」てね。そのたびに「こ・ば・とです!」とはっきり訂正するんだけど、同じ人から届いた挨拶状にやっぱり「ことばさん」て書いてあるのを見たときは「きききい!」てなりましたよ。
コメント
【ChatGPT解説】VBAのStrComp
エンジニアA: こんにちは!最近、StrComp関数について考えていたんだけど、どうしても君の意見が知りたくて来たよ。
エンジニアB: おお、そうか。StrCompについて議論するのは面白そうだね。どんなことについて話したいの?
エンジニアA: 実は、StrComp関数の比較方法について疑問があるんだ。文字列の比較をする際、どのオプションを使うべきか迷っているんだよ。
エンジニアB: そうか、StrCompのオプションは3つあるよね。vbBinaryCompare、vbTextCompare、vbDatabaseCompareだっけ。君はどのオプションを使いたいの?
エンジニアA: 実は、vbBinaryCompareとvbTextCompareの違いについてよく分からないんだよね。どちらを使うべきか迷っているんだ。
エンジニアB: それは興味深い質問だね。vbBinaryCompareはバイナリ比較を行うオプションで、大文字と小文字を区別するよ。つまり、”Apple”と”apple”は異なると判断されるんだ。
エンジニアA: なるほど、バイナリ比較なら大文字と小文字を区別するのか。では、vbTextCompareはどうなの?
エンジニアB: vbTextCompareはテキスト比較を行うオプションで、大文字と小文字を区別しないんだ。つまり、”Apple”と”apple”は同じと判断されるよ。
エンジニアA: なるほど、バイナリ比較とテキスト比較の違いが分かったよ。でも、実際にどちらを使うべきなのかはまだ決められないな。
エンジニアB: それは使い方や要件によるんじゃないかな。例えば、ファイルのソートや比較をする場合は、vbBinaryCompareが適しているかもしれないね。一方、ユーザー名やキーワードの比較をする場合は、vbTextCompareが適しているかもしれない。
エンジニアA: なるほど、使い方や要件によって使い分けるんだね。それは確かに納得できる。でも、もう1つのオプション、vbDatabaseCompareはどうなんだろう?
エンジニアB: vbDatabaseCompareはデータベースのソートや比較に特化しているんだ。具体的なデータベースシステムに依存することが多いから、一般的な比較にはあまり使われないよ。
エンジニアA: なるほど、vbDatabaseCompareは特殊なケースに使われるのか。理解したよ。
エンジニアB: どうだい、StrCompのオプションについてもう少し理解できたかな?
エンジニアA: うん、確かに理解が深まったよ。使い方や要件に応じて、vbBinaryCompareとvbTextCompareを使い分けることが重要だね。
エンジニアB: そうだね!StrCompの使い方について議論できて楽しかったよ。他のVBAの機能についても一緒に探求しよう!
エンジニアA: いいね!次はどの機能について調べるか考えておこう。