重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

マクロ作成中、If文でlike演算子を使ってます。ワイルドカードを使い、どう見てもTrueと思える文字列がFalse扱いされており、確認したいのです。

他方法でも構いません。

A 回答 (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
'//
    • good
    • 0
この回答へのお礼

ありがとうございます。

>If strFolder Like f Then   ' ★ここが問題
今さらながら申し訳ありませんが、誤記しました。

>If strFolder Like f.Name Then   ' ★ここが問題
が正しい、かどうかは別として私の書いたマクロです。

Likeに順序があるとは知りませんでした。

お礼日時:2015/01/16 20:51

こんにちは。



Like演算子は、ある意味では、バイナリ比較になってしまいます。全角と半角、大文字と小文字の違いは検出してしまいます。そこで、モジュール先頭に、「Option Compare Text」 ステートメントを置くという方法を見かけます。そうすることによって、ある程度、大雑把な比較で済みます。

また、私自身は、Instr 関数で、TextCompare モードにしたり、同じく、StrComp関数を用いてすることがありますが、ワイルドカードで複雑なものは、正規表現(VBScript.RegExp) の文字比較を使うことがあります。

実際に、具体的には、どんな比較をされているのでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。
No1へのコメントに詳細記入しました。何かありましたらお願いします。

お礼日時:2015/01/16 19:56

FIND関数での確認は?



実際のコードと文字列を提示したら原因を探してもらえると思います
    • good
    • 0
この回答へのお礼

ありがとうございます。
指定の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はフルパス表示がなされます。これは正しいと思っていいでしょうか?

お礼日時:2015/01/16 19:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!