• ベストアンサー

ワイルドカードの記述が、原因でしょうか?

下記コードが、ついこの前までは、きちんと "A?07??????.CSV" を読み込んでたんですが、 今は、 "検索条件を満たすファイルはありません。"  となってしまいます。 1、ワイルドカードの記述が、おかしいでしょうか? 2、フォルダ名は、漢字等はやめて、半角英数字にしたほうがよいのでしょうか? 3、このような、現象は、よくあることでしょうか? 以上 原因がわかりませんので、何卒ご教示くださいませ。 ----------------- Private Sub TEST() Dim myFS As FileSearch Dim i As Long ChDir "C:\Documents and Settings\Owner\デスクトップ\ああ" Set myFS = Application.FileSearch With myFS .LookIn = "C:\Documents and Settings\Owner\デスクトップ\ああ" .Filename = "A?07??????.CSV" If .Execute > 0 Then For i = 1 To .FoundFiles.Count '見つかったファイルを一つずつ開く Workbooks.OpenText Filename:=.FoundFiles(i), _ StartRow:=1, _ DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, _ Comma:=True 'ああ.xlsブックに移動 Sheets(1).Move after:=Workbooks("ああ.xls").Worksheets(Workbooks("ああ.xls").Sheets.Count) Next i Else MsgBox "検索条件を満たすファイルはありません。" End If End With End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんばんは。 やっぱり、FileSearchは壊れています。 私も一度壊したことがあります。掲示板の質問でも、壊れた人の対応はしたことがあるのですが、直りませんでした。壊れているのは、C言語のツールの'Dependency Walker' でみると、どこかの Dll ファイルが赤い色になって出てくるので、分かるのですが、OS自体に関わってきて、直接、Office などを再インストールしても直らないのです。ファイルとファイルの依存性の問題なので、レジストリに関係しているのだろうっていうのは分かります。そのファイル名かは忘れましたが、MSサポートには出てきます。私の場合は、ADOのMDACをインストールした時に壊れたような気がします。同系ですからね。 今回の場合は、単に、Dir で、ちょっと変えるだけでよいです。 もともと、当時の壊れた時のコードを思い出して書いたので、移植は簡単です。動的配列で、格納していますが、oshietecho-daiさんでしたら、読めるとは思います。この方法は、他にも応用できます。 それと、Like演算子を使っているので、いろいろ応用することも出来ます。 Sub FileSeachPrcR2()   Dim Dirs() As Variant   Dim FileName As String   Dim i As Long   Const MYFILE As String = "A?07#######.CSV"   Const MYDIR As String = "C:\Documents and Settings\owner\デスクトップ\" '必ず、末尾に'\'を入れてください。   FileName = Dir(MYDIR & "*.csv")   Do While FileName <> ""     ReDim Preserve Dirs(i)     Dirs(i) = FileName     i = i + 1   FileName = Dir()   Loop     If i > 0 Then       For i = 0 To UBound(Dirs())         'Like演算子で、ふるいに掛ける         If StrConv(Dirs(i), vbUpperCase) Like MYFILE Then          Workbooks.OpenText FileName:=MYDIR & Dirs(i), _          StartRow:=1, _          DataType:=xlDelimited, _          TextQualifier:=xlDoubleQuote, _          ConsecutiveDelimiter:=False, _          Comma:=True         'ああ.xlsブックに移動         ActiveWorkbook.Sheets(1).Move _         after:=Workbooks("ああ.xls").Worksheets(Workbooks("ああ.xls").Sheets.Count)         End If       Next i     Else       MsgBox "検索条件を満たすファイルはありません。"     End If End Sub

oshietecho-dai
質問者

お礼

全て、入れ替えました。 誠に有難うございました。

oshietecho-dai
質問者

補足

こんばんわ、 度々と大変恐縮しました。 当ファイルで、間違えて同名のマクロ名を作り閉じてしまいましたら、もお開くことが出来なくなってしまいました。 バックとってたのっで、良かったです。 今から、コードを使ってみます。

その他の回答 (6)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 >>デスクトップにあるということですね。 >場所により、コードに何らかの影響があるのでしょうか? 影響の問題ではないのですが、ある程度のレベルにある人は、デスクトップの取り方が、前回で示したように、現在のUser と同じデスクトップを取得するように作るということです。その分、難しくなるのです。ファイルを置くこと自体はかまわないと思いますが、長く置く場所ではありませんね。 では、 >C: とか D: などの直下がよいのでしょうか? それは、どこでもかまわないと思います。ただ、私が作ると、ドライブが、Readyかどうかを調べるというコードを付け足します。 >マクロコードが記述されてる Excelファイルと同じフォルダがよいのでしょうか? そのようなことはありませんが、まず、余計なことが不要なので楽ですね。フォルダのフルネームが必要ありません。 私の場合は、他人の環境に適応させるためのコードは、どうやったらエラーを出さないか考えます。 ただ、これは、私個人の意見なのですが、掲示板で、自分自身のVBAの勉強の参考になるものは少ないと思います。私のものも含めて。私は、私自身のスタイルに持ち込もうとしてしまいます。 しょせん、他人のコードは他人のもの、自分のコードは自分だけのものかもしれません。あまり、掲示板の中で振り回されないようにしたほうが、より上達の目的に近づくような気がします。なくて七癖で、人のコードにはそれなりの癖があるものです。確かに、FileSearch などは、人の意見はためになりますが、特例です。 それと、最後に、ひとつの方法でダメだった場合は、それに深入りしないほうが良いようです。当面の解決だけを目的にして、早めに別な方法に切り替えて、再び、その問題に取り組む時期が来るのを待つことが上達の早道のような気がします。単純に解決しないものは、自分の手には余る複合的な問題が絡んでいることがあります。これは、私の本当にバカな失敗から言えることですが。

oshietecho-dai
質問者

補足

こんばんわ、 お礼の後なのに、誠に申し訳ありません。 最初は、実行できましたが、後に、また、前回の質問時のような現象(エラーにならずに、じりじり音がしてしまい、休止状態)になってしましました。 何度も、試みてますが、同じです。 セキュリティ等、他の原因でしょうか? 私には、よく解りませんが、特定のファイルだけをヒットさせることは、あきらめて、 「 FileSearchをやめて Dir とか FileSystemObject 」   というコードに変更すれば、(ヒット以外のことなら)解決できますでしょうか? 度々、と申し訳ありません。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。Wendy02です。 デスクトップにあるということですね。 基本的に、私の元のコードに対しては、ぜんぜん、内容が違っていますね。 ちょっと、みなさんのアドバイスに逆らって、FileSearch にこだわってみましょうか? そのほうが、理解しやすいと思います。 それと、FileSearch の元のエンジンは、Outlook にあります。ただ、この前から、Outlook 2003 を試してみているのですが、FileSearchが生きているようにはありませんね。 Sub FileSeachPrcR()   Dim myFs As FileSearch      Const MYFILE As String = "A?07#######.CSV"   Const MYDIR As String = "C:\Documents and Settings\owner\デスクトップ\"   Set myFs = Application.FileSearch   With myFs     .NewSearch     .LookIn = MYDIR     .Filename = "CSV"     .MatchTextExactly = False     .FileType = msoFileTypeOfficeFiles     If .Execute > 0 Then       For i = 1 To .FoundFiles.Count         'Like演算子で、ふるいに掛ける         If StrConv(.FoundFiles(i), vbUpperCase) Like "*" & MYFILE Then          Workbooks.OpenText Filename:=.FoundFiles(i), _          StartRow:=1, _          DataType:=xlDelimited, _          TextQualifier:=xlDoubleQuote, _          ConsecutiveDelimiter:=False, _          Comma:=True         'ああ.xlsブックに移動         AcitveWorkbook.Sheets(1).Move _         After:=Workbooks("ああ.xls").Worksheets(Workbooks("ああ.xls").Sheets.Count)         End If       Next i     Else       MsgBox "検索条件を満たすファイルはありません。"     End If   End With   Set myFs = Nothing End Sub 後、アドバイスですが、FileSearch のような外部メソッドやワークシートメソッドは、繰り返して実験を重ね、確信を得なければ、プロパティの省略はしてはいけません。また、人に教えるときは、特に省略型は使えません。今回の方法は、以前、FileSearch が壊れたときに使った書き方です。 それから、 "A?07??????.CSV" 本来、こういう厳密なワイルドカードはあまり関心しません。普段は、A?07*.CSV などでよいと思います。出来る限りは、他の方法を求められるのがよいと思います。今回のワイルドカードは、Like演算子のためのものです。間違わないでください。

oshietecho-dai
質問者

お礼

こんばんわ、 誠に有難うございます。 私ごとですが、未熟な為に、本コードでゆうに12時間以上は要したと思います。 限界でした。座ってた時間が長時間で、腰がおかしくなりました。 皆様のせっかくのご回答意見さえ、十分こなすことが出来ずに。(毎度のことですが) 私が、マクロ等だけにこれほどまでにはまりまくっていることは、今までの人生でも、ございません。 とにかく、有難うございました。 Sheets(1).Move After とするだけで、私の場合は、OKでした。 すみません、一つだけお願い致します。 >デスクトップにあるということですね。 場所により、コードに何らかの影響があるのでしょうか? もしそうでしたならば、今後、場所を変更したいと思っております。 C: とか D: などの直下がよいのでしょうか? また、階層の深い場所ではいけないのでしょうか? マクロコードが記述されてる Excelファイルと同じフォルダがよいのでしょうか?

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.4

http://oshiete1.goo.ne.jp/qa2728987.html ↑でも述べましたが、Application.FileSearch に良い思い出は有りません。 上記リンクの私の回答をアレンジすれば目的は達成できると思います。 (サブフォルダまで検索しています) さらに、2007では現役引退の様子です。 Hidden なので引っ張り出すことも出来るかもしれませんけど・・・ http://msdn2.microsoft.com/en-us/library/bb242669.aspx

oshietecho-dai
質問者

お礼

ご回答誠に有難うございました。 私に可能かどうか、 なんとか、アレンジに挑戦してみます。

noname#31387
noname#31387
回答No.3

FileSearchをやめて DirとかFileSystemObjectを使用されては如何でしょう。 理由はWendy02さんと同じです。

oshietecho-dai
質問者

お礼

ご回答誠に有難うございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。Wendy02です。 結局、この前のものは解決しないままでしたのですか?私は、どうしても、自分のスタイルに持ち込みたくなってしまいます。ご自身のコードの中で解決したいのですね。分かりました、考え方を変えます。すみませんでした。 ただ、あまり、FileSearch には、深入りしないほうがよいです。その理由は、どこにも、きちんとした仕様も書かれていませんし、不安定だからです。VBAをある程度経験した人たちは、みな同じ意見だと思います。 >1、ワイルドカードの記述が、おかしいでしょうか? FileSearch は、基本的に、ワイルドカードの仕様が、一般的なファイル検索などの仕様と違います。隠れた仕様があります。当然、MS-DOSのワイルドカードの仕様とも違うことがありますし、また、バージョンによって仕様が違うことがあることがあります。 .Filename = "A?07??????.CSV" たとえば、どんなファイル名をヒットさせようとしていますか? 'AB070302aa.csv' とか? もし、ヒットしにくいようでしたら、デスクトップでしたら、数が少ないはずですから、 *.CSV で検索しておいて、 For i = 1 To .FoundFiles.Count この場所で、 If .FoundFiles(i) Like "A?07??????.CSV" Then としてもよいと思います。 >2、フォルダ名は、漢字等はやめて、半角英数字にしたほうがよいのでしょうか? Win XPなら、直接の問題はないはずです。 >3、このような、現象は、よくあることでしょうか? FileSearch は、うまくいかないことのほうが多いのではないかと思います。これは、前に説明したかもしれませんが。

oshietecho-dai
質問者

補足

>たとえば、どんなファイル名をヒットさせようとしていますか? AB070302201.csv AB070302202.csv  ~  AB070302212.csv AG070312301.csv AG070312302.csv  ~  AG070312312.csv AK050344401.csv AK050344402.csv  ~  AK050344412.csv などが 10~40個 あります。 いっそのことコードを変えてしまえば、ヒットするようになると思いまして、 No.4様のご教示して頂いたページです。 http://oshiete1.goo.ne.jp/qa2728987.html Wendy02様のコードに追加編集していますが、挟まれた線の間がうまく出来ません。 .FoundFiles. でエラー 他もおかしいと思いますが、よろしくお願い致します。 --- Sub FileSeachPrc() Dim Fso As Object Dim objFolder As Object Dim buf() As Variant Dim f As Variant Dim i As Long Dim j As Integer Dim flg As Boolean Const MYFILE As String = "A?07??????.CSV" Const MYDRIVE As String = "C:\Documents and Settings\Owner\デスクトップ\ああ" '必ず、末尾に'\'を入れてください。 'ドライブのReady チェック Set Fso = CreateObject("Scripting.FilesystemObject") '以下は変数が利かないので、リテラル値 "A" If Fso.Drives("C:\Documents and Settings\Owner\デスクトップ\ああ").IsReady = False Then MsgBox "ドライブ" & MYDRIVE & "は、準備されていません。", vbInformation Set Fso = Nothing Exit Sub End If Set objFolder = Fso.GetFolder(MYDRIVE) ReDim buf(0) buf(0) = MYDRIVE 'サブフォルダを格納 For Each f In objFolder.SubFolders i = i + 1 ReDim Preserve buf(i) buf(i) = f Next f For Each f In buf If Dir(f & "\" & MYFILE) <> "" Then 'MsgBox "Aドライブの[" & f & "\" & MYFILE & "]をあった", vbInformation 'flg = True 'あまりに、同名ファイルが多すぎるときの保護 'If j > 5 Then Exit For 'j = j + 1 '---------------------------------- For j = 1 To .FoundFiles.Count '見つかったファイルを一つずつ開く Workbooks.OpenText Filename:=.FoundFiles(k), _ StartRow:=1, _ DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, _ Comma:=True 'ああ.xlsブックに移動 Sheets(1).Move after:=Workbooks("ああ.xls").Worksheets(Workbooks("ああ.xls").Sheets.Count) Next j '----------------------------------- End If Next f If flg = False Then MsgBox "Aドライブに[" & MYFILE & "]を保存してね", vbInformation End If Set Fso = Nothing Set objFolder = Nothing End Sub

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

う~ん単純に考えると A?07??????.CSVの'?'は任意の一文字だから A007000000.CSVはヒットするけど A00700000.CSVはヒットしない。 DOS窓を開いて、プロンプトで > cd C:\Documents and Settings\Owner\デスクトップ\ああ > dir A?07??????.CSV とやってファイルが見つかりますか?

oshietecho-dai
質問者

お礼

ご回答誠に有難うございました。

関連するQ&A