Like演算子で、[と]を文字として扱い比較したい
今、フォルダ内のファイルリストを作成するVBA(Excel2003)を作っています。そこで、ファイル(絶対パス:フルパス)に「含まれていい文字」と「含まれない文字」(キーワード)を指定できる機能を作っています。
以前、VB6で類似の機能を作った時は、すんなり行ったのですが、VBAではうまくいきません。正規表現が使えるに越したことはないのですが、「 [ や ] を文字として認識するだけでもいいです。」
リストを作るフォルダには、
[20].txt
テキスト[a]txt
メモ[10] - コピー.txt
などのテストファイルとその他ファイルが存在します。
キーワードを指定しないときには、うまく行きます。
指定すると、たとえば [10].txt というファイルがヒットしないように、NGワードを [10] を指定すると、[20].txtまでヒットしません。[a]では全てがヒットしません。
また、OKワードに[10]を指定すると[10]と[20]がヒットします。
===== NGワードを比較している部分 ====
引数:in_str が NGワード(スペースで区切って複数指定可能)
引数:target_Str がフルパス
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) <> "" And target_Str <> "" Then
If target_Str Like "*" & wordArray(wordIDX) & "*" = True Then
tempFLG = False
End If
End If
Next
If tempFLG = True Then
keywords_NG = True
Else
keywords_NG = False
End If
End Function
===== OKワードを比較している部分 ====
引数:in_Str が OKワード(スペースで区切って複数指定可能)
引数:target_Str がフルパス
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) <> "" And target_Str <> "" Then
If target_Str Like "*" & wordArray(wordIDX) & "*" = True Then
tempFLG = True
End If
End If
Next
If tempFLG = True Then
keywords_OK = True
Else
keywords_OK = False
End If
End Function
===== [や]を区切り文字ではなくする関数 ====
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
keywords_escape_sequence = str_X
End Function
=====================================================
If keywords_OK(keywords_OK_Str, フルパス)) = True And _
keywords_NG(keywords_NG_Str, フルパス)) = True Then
'ファイルリスト作成
end if
=====================================================
正規表現を使うためには…というページを見つけ参照設定に以下の項目にチェックを入れてみましたが、結果は変わらす
□Microsoft VBScript Regular Expressions 5.5
===== RegExp と CreateObject ====
参照設定をできれば変更したくない場合は、RegExp と CreateObject を使えば良いとあるページに書いてありましたが、参照設定でもできなかったので、これだけは試してません。
ヒントだけでもお教えください。
お礼
早速有り難うございました。 言われていることが、何となくですが、分かります。 前にも似たような質問をしたことがあり、 その時にも勉強したのですが、今ひとつ自分のものにできていません。 基礎が出来ていないからでしょう。 今回も同じようにならないため、もう少し踏み込んで勉強したいと思います。 (1)index関数 (2)\Q$key\Eとして$key中のメタ文字から特殊な意味を無くしてしまう (3)Encodeを使ってUnicode文字列に変換する (1)、(2)は何とか検索などで調べられ、やってみられるかなと思いますが、 (3)は何処か参考になるサイトなり、サンプルなりはありますでしょうか。 私のやりたいことからして、(3)が一番適切かなと思うのですが。 宜しくお願いします。
補足
お世話になります。 その後、調べたり考えたりした結果、 問題は漢字だったので、前から使っていたindexによる検索を併用して解決しました。 m//iは英字の大文字小文字混在を解決すべく変更したモノで、 漢字とは排他の関係にありますので。 unicodeは少し読んでみましたが、一からしっかり読まなくてはならないと思います。 勉強してみます。 どうも有り難うございました。