初めて自分の家と他人の家が違う、と意識した時

下記コードが、ついこの前までは、きちんと "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

A 回答 (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

この回答への補足

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

補足日時:2007/03/06 21:08
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/03/06 23:16

こんばんは。



>>デスクトップにあるということですね。
>場所により、コードに何らかの影響があるのでしょうか?

影響の問題ではないのですが、ある程度のレベルにある人は、デスクトップの取り方が、前回で示したように、現在のUser と同じデスクトップを取得するように作るということです。その分、難しくなるのです。ファイルを置くこと自体はかまわないと思いますが、長く置く場所ではありませんね。

では、
>C: とか D: などの直下がよいのでしょうか?
それは、どこでもかまわないと思います。ただ、私が作ると、ドライブが、Readyかどうかを調べるというコードを付け足します。

>マクロコードが記述されてる Excelファイルと同じフォルダがよいのでしょうか?
そのようなことはありませんが、まず、余計なことが不要なので楽ですね。フォルダのフルネームが必要ありません。

私の場合は、他人の環境に適応させるためのコードは、どうやったらエラーを出さないか考えます。

ただ、これは、私個人の意見なのですが、掲示板で、自分自身のVBAの勉強の参考になるものは少ないと思います。私のものも含めて。私は、私自身のスタイルに持ち込もうとしてしまいます。

しょせん、他人のコードは他人のもの、自分のコードは自分だけのものかもしれません。あまり、掲示板の中で振り回されないようにしたほうが、より上達の目的に近づくような気がします。なくて七癖で、人のコードにはそれなりの癖があるものです。確かに、FileSearch などは、人の意見はためになりますが、特例です。

それと、最後に、ひとつの方法でダメだった場合は、それに深入りしないほうが良いようです。当面の解決だけを目的にして、早めに別な方法に切り替えて、再び、その問題に取り組む時期が来るのを待つことが上達の早道のような気がします。単純に解決しないものは、自分の手には余る複合的な問題が絡んでいることがあります。これは、私の本当にバカな失敗から言えることですが。

この回答への補足

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

度々、と申し訳ありません。

補足日時:2007/03/05 22:27
    • good
    • 0

こんにちは。

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演算子のためのものです。間違わないでください。
    • good
    • 0
この回答へのお礼

こんばんわ、
誠に有難うございます。
私ごとですが、未熟な為に、本コードでゆうに12時間以上は要したと思います。
限界でした。座ってた時間が長時間で、腰がおかしくなりました。
皆様のせっかくのご回答意見さえ、十分こなすことが出来ずに。(毎度のことですが)
私が、マクロ等だけにこれほどまでにはまりまくっていることは、今までの人生でも、ございません。
とにかく、有難うございました。

Sheets(1).Move After
とするだけで、私の場合は、OKでした。

すみません、一つだけお願い致します。
>デスクトップにあるということですね。
場所により、コードに何らかの影響があるのでしょうか?
もしそうでしたならば、今後、場所を変更したいと思っております。
C: とか D: などの直下がよいのでしょうか?
また、階層の深い場所ではいけないのでしょうか?
マクロコードが記述されてる Excelファイルと同じフォルダがよいのでしょうか?

お礼日時:2007/03/05 19:56

http://oshiete1.goo.ne.jp/qa2728987.html
↑でも述べましたが、Application.FileSearch に良い思い出は有りません。
上記リンクの私の回答をアレンジすれば目的は達成できると思います。
(サブフォルダまで検索しています)

さらに、2007では現役引退の様子です。
Hidden なので引っ張り出すことも出来るかもしれませんけど・・・
http://msdn2.microsoft.com/en-us/library/bb24266 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/03/06 23:13

FileSearchをやめて


DirとかFileSystemObjectを使用されては如何でしょう。
理由はWendy02さんと同じです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/03/06 23:08

こんにちは。

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 は、うまくいかないことのほうが多いのではないかと思います。これは、前に説明したかもしれませんが。

この回答への補足

>たとえば、どんなファイル名をヒットさせようとしていますか?
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

補足日時:2007/03/04 06:58
    • good
    • 0

う~ん単純に考えると


A?07??????.CSVの'?'は任意の一文字だから
A007000000.CSVはヒットするけど
A00700000.CSVはヒットしない。

DOS窓を開いて、プロンプトで
> cd C:\Documents and Settings\Owner\デスクトップ\ああ
> dir A?07??????.CSV
とやってファイルが見つかりますか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/03/06 23:07

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