[VBA] StrComp : Text モードで文字列を比較

 この記事では VBA で 大文字と小文字を同じものとして判定する比較方法 について解説します。
 

Bynary モードと Text モード

さっそくですけど、次のマクロを実行してみてくださいな。

'[VBA] Bynaryモードで文字列を比較するプロシージャ

Sub Compare_Words()

  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

 Compare_Words() は「KOBATO」と「kobato」を比較させて、その真偽を返すように書かれたマクロなのですけど、結果は False(偽)と表示されます。つまり、VBA の既定では「大文字と小文字」を異なるデータとして判定していることになります。同じように、「全角と半角」や「ひらがなとカタカナ」も異なる文字列として判定されます。このような比較方法を Bynary モード とよびます。でもマクロによっては、これらを同じものとして扱ったほうが便利なこともあります。「大文字と小文字」「全角と半角」「ひらがなとカタカナ」を同じものとして判定する比較方法を Text モード といいます。
 

[VBA] StrComp 関数

 StrComp は2つの文字列を比較して結果を数値または Null 値で返す関数です。

=StrComp(文字列1, 文字列2 [,比較モード])

 3つめの引数 [比較モード] を 1 または vbTextCompare で指定すると、Text モードの比較になります。2つの文字列が等しいときは 0 (True), 異なるときは 1 (False) が返ります。ちなみに StrComp は String Compare の略です。先ほどのマクロをちょっとだけ書き変えてみます。

'[VBA] Textモードで文字列を比較するプロシージャ_1

Sub Text_Mode_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

 Text_Mode_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() を実行すると単語の入力が促されるので、たとえば全角、半角で「コバト」「コバト」と入れると「同じ単語だよ」というメッセージが返ります。「コバト」「コトバ」と入れると「違う単語だよ」というメッセージが返ります ... 当たり前だけですけどね。たまに間違える人がいるんですよね。「ことばさん」てね。そのたびに「こ・ば・とです!」とはっきり訂正するんだけど、同じ人から届いた挨拶状にやっぱり「ことばさん」て書いてあるのを見たときは「きききい!」てなりましたよ。


 

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)