• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Like演算子で、[と]を文字として扱い比較したい)

Like演算子で、[と]を文字として扱い比較したい

このQ&Aのポイント
  • VBA(Excel2003)でフォルダ内のファイルリストを作成する際に、指定したキーワードを含むかどうかを判定する機能を作りたい。
  • VB6ではうまくいったが、VBAではうまくいかないため、正規表現を使う方法を模索している。
  • 参照設定の変更やRegExpとCreateObjectを試したが、解決しなかった。ヒントを教えてほしい。

質問者が選んだベストアンサー

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Sub try() Dim RegExp As Object Dim v(1 To 3) As String Dim KeyWord As String Dim i As Integer Set RegExp = CreateObject("VBScript.RegExp") v(1) = "[20].txt" v(2) = "テキスト[a]txt" v(3) = "メモ [10] - コピー.txt" KeyWord = "10" 'キーワードは[]の中の数字のみ RegExp.Pattern = "\[" & KeyWord & "\]" For i = 1 To 3 If RegExp.Test(v(i)) Then 'キーワードに一致でOK MsgBox v(i) End If Next MsgBox "チェンジ" For i = 1 To 3 If Not RegExp.Test(v(i)) Then 'キーワードに不一致でOK MsgBox v(i) End If Next Set RegExp = Nothing Erase v End Sub 勘違いでしたらスル~して下さい。

psychang
質問者

お礼

メタ文字すべてをエスケープ(?)してみました。 キーワードをセットするボタンに、エラー処理を作りましたが、文字制限のあるので、載せていません。 Public Function keywords_escape_sequence(keywordStr As String) As String    If keywordStr = "" Then   keywords_escape_sequence = ""   Exit Function  End If  'メタ文字のエスケープはReplace関数を使ったほうがスマートだとは思いますが、自作しました。  If frmKeywords.cbMetaCharMode.Value = False Then 'メタ文字を単なる文字として扱うモード     Dim MetaTagChars As String      MetaTagChars = "^$?*+.|{}\[]()" 'メタ文字の一覧 http://codezine.jp/article/detail/1655     Dim myIDX As Long     Dim str_X As String   str_X = ""       For myIDX = 1 To Len(keywordStr) Step 1    Dim tagIDX As Long      Dim tagFlg As Boolean        tagFlg = False        For tagIDX = 1 To Len(MetaTagChars) Step 1          If Mid(keywordStr, myIDX, 1) = Mid(MetaTagChars, tagIDX, 1) Then      tagFlg = True     End If          If Mid(keywordStr, myIDX, 1) = Mid(MetaTagChars, tagIDX, 1) Then      str_X = str_X & "\" & Mid(MetaTagChars, tagIDX, 1)     End If    Next tagIDX        If tagFlg = False Then     str_X = str_X & Mid(keywordStr, myIDX, 1)    End If   Next myIDX      keywords_escape_sequence = str_X  Else 'メタ文字を自分で記述するモード   keywords_escape_sequence = keywordStr  End If End Function ありがとうございました。m(_ _)m

psychang
質問者

補足

アドバイスありがとうございます。 どうやら、[ → [[] 、[ → []] に置換する部分で、置換前データで上書きしていいたようです。自己解決で、すみません。 でも、せっかく教えて頂いたので、RegExp(正規表現というのですか?)でもできるように、今作っていますυ Like演算子でも正規表現は使えると思うのですが、モドキなんでしょうか? やはりRegExpというのでプログラムを組んだほうが、何かと応用が利くのでしょうか?

その他の回答 (1)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

n-junです。 >Like演算子でも正規表現は使えると思うのですが、モドキなんでしょうか? >やはりRegExpというのでプログラムを組んだほうが、何かと応用が利くのでしょうか? 私的にはLike演算子と正規表現は違う物と認識してます。(実際はわかりませんよ) ただ正規表現自体は、覚えておくと入力チェックなどにも応用できますし、 結構重宝していますのでお薦めしたいですね。

psychang
質問者

お礼

言葉足らずの中、回答頂きありがとうございました。 RegExpの方を使って、プログラミングを続けようと思います。 今日の夜、締め切ります。

psychang
質問者

補足

出来たので、一応載せておきます。 keywords_OK_Str = keywords_escape_sequence(frmKeywords.OK_BOX.Text) keywords_NG_Str = keywords_escape_sequence(frmKeywords.NG_BOX.Text) If keywords_OK(keywords_OK_Str, フルパス)) = True And _   keywords_NG(keywords_NG_Str, フルパス)) = True Then         'ファイルリスト作成 End if ※Microsoft VBScript Regular Expressions 5.5 にチェックを入れなくてもできました。 Public Function keywords_escape_sequence(keywordStr As String) As String          If keywordStr = "" Then         keywords_escape_sequence = ""         Exit Function     End If          Dim myIDX As Currency     Dim str_X As String          str_X = ""              For myIDX = 1 To Len(keywordStr) Step 1         If Mid(keywordStr, myIDX, 1) = "[" Then             str_X = str_X & "\["         ElseIf Mid(keywordStr, myIDX, 1) = "]" Then             str_X = str_X & "\]"         Else             str_X = str_X & Mid(keywordStr, myIDX, 1)         End If     Next          'メタ文字の一覧   http://codezine.jp/article/detail/1655          keywords_escape_sequence = str_X End Function Public Function keywords_NG(in_Str As String, target_Str As String) As Boolean     If in_Str = "" Then         keywords_NG = True         Exit Function     End If          Dim wordArray() As String          Erase wordArray()          wordArray() = Split(in_Str, Space(1)) '(スペースで区切ったキーワードを一個一個取り出し)               Dim tempFLG As Boolean          tempFLG = True          Dim wordIDX As Long          For wordIDX = 0 To UBound(wordArray) Step 1         If wordArray(wordIDX) <> "" Then             Dim RegExp As Object                          Set RegExp = CreateObject("VBScript.RegExp")                          RegExp.Pattern = wordArray(wordIDX)                          If RegExp.Test(target_Str) Then                 tempFLG = False '一個でも一致した場合、NG             End If                          Set RegExp = Nothing         End If     Next          If tempFLG = True Then         keywords_NG = True     Else         keywords_NG = False     End If End Function Public Function keywords_OK(in_Str As String, target_Str As String) As Boolean     If in_Str = "" Then         keywords_OK = True         Exit Function     End If     Dim wordArray() As String          Erase wordArray()          wordArray() = Split(in_Str, Space(1))  '(スペースで区切ったキーワードを一個一個取り出し)          Dim tempFLG As Boolean          tempFLG = False          Dim wordIDX As Long          For wordIDX = 0 To UBound(wordArray) Step 1         If wordArray(wordIDX) <> "" Then             Dim RegExp As Object                          Set RegExp = CreateObject("VBScript.RegExp")                          RegExp.Pattern = wordArray(wordIDX)                          If RegExp.Test(target_Str) Then 'キーワードに一致でOK                 tempFLG = True '一個でも一致した場合、OK             End If                          Set RegExp = Nothing         End If     Next          If tempFLG = True Then         keywords_OK = True     Else         keywords_OK = False     End If     End Function