- ベストアンサー
VBA 2つの文字列の差を見る方法
マクロ作成中、If文でlike演算子を使ってます。ワイルドカードを使い、どう見てもTrueと思える文字列がFalse扱いされており、確認したいのです。 他方法でも構いません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2の回答者です。 一応、マクロの訂正部分です。 Dim FolderList() As Variant まあ、これは、 cnt=cnt=1 →cnt = cnt +1 でしょうね。 >If strFolder Like f Then ' ★ここが問題 これは、逆です。 f Like strFolder です。 それに、コードのままですと、f は、オブジェクトです。 以下は、ちょっと手を入れてみました。 '// Dim strFolder As String, Root As String Dim f As Variant Dim FolderList() As Variant Dim i As Long strFolder = "s*" '全部小文字で。ワイルドカード Root = ThisWorkbook.Path & "\data" Set FSO = CreateObject("Scripting.fileSystemObject").GetFolder(Root).SubFolders cnt = 0 strFolder = StrConv(strFolder, vbLowerCase) For Each f In FSO Range("A1").Value = f.Name '値確認用 Range("A2").Value = strFolder '値確認用 f = StrConv(f.Name, vbLowerCase) If f Like strFolder Then ' ★ここが問題(比較が逆です) cnt = cnt + 1 ReDim Preserve FolderList(cnt) FolderList(cnt) = f End If Next '//
その他の回答 (2)
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 Like演算子は、ある意味では、バイナリ比較になってしまいます。全角と半角、大文字と小文字の違いは検出してしまいます。そこで、モジュール先頭に、「Option Compare Text」 ステートメントを置くという方法を見かけます。そうすることによって、ある程度、大雑把な比較で済みます。 また、私自身は、Instr 関数で、TextCompare モードにしたり、同じく、StrComp関数を用いてすることがありますが、ワイルドカードで複雑なものは、正規表現(VBScript.RegExp) の文字比較を使うことがあります。 実際に、具体的には、どんな比較をされているのでしょうか。
お礼
ありがとうございます。 No1へのコメントに詳細記入しました。何かありましたらお願いします。
- weboner
- ベストアンサー率45% (111/244)
FIND関数での確認は? 実際のコードと文字列を提示したら原因を探してもらえると思います
お礼
ありがとうございます。 指定のRootフォルダ内にある複数のフォルダの中から、strFolderにマッチ(Like使用)するものを選び、配列FolderListとして出力するものです。 sub SearchFolder() Dim strFolder As String, Root As String Dim i As Long Root=Thisworkbook.Path & "\data" Set FSO=CreateObject("Scripting.fileSystemObject").GetFolder(Root).SubFolders cnt=0 For Each f In FSO Range("A1")=f.Name '値確認用 Range("A2")=strFolder '値確認用 If strFolder Like f Then ' ★ここが問題 cnt=cnt=1 ReDim Preserve FolderList(cnt) FolderList(cnt)=f.Name End If Next End Sub Rootのフォルダの中には例えばA,B,Cと3個のフォルダがあるとして、 strFolder="B" として実行すると★行ではf.Name="B"の時にTrue判定してくます。ところが、 strFolder="B*" として実行すると、Falseです。私はTrueである事を期待してますが、何か違うのでしょうか? もうひとつ、デバック中はカーソルを当てた変数の値を確認出来ますが、f.Nameは出来ません。しかしfはフルパス表示がなされます。これは正しいと思っていいでしょうか?
お礼
ありがとうございます。 >If strFolder Like f Then ' ★ここが問題 今さらながら申し訳ありませんが、誤記しました。 >If strFolder Like f.Name Then ' ★ここが問題 が正しい、かどうかは別として私の書いたマクロです。 Likeに順序があるとは知りませんでした。