エクセル2007では、filesearch が使えなくなってしまいました。2003で多用していたモノで、とても困っています。次のような使い方をしていた場合、同じ処理を最も簡単に行うためにはどうしたらいいでしょう?できれば参考URLよりも、処理文を回答頂けるとうれしいのですが。

 with application.fileserach
.lookin=thisworkbook.path
.filename="*.xls"
if .execute>0 then
for i = 1 to .foundfiles.count
workbooks.open filename:=.foundfiles(i)
next i
end if
end with

回答の条件
  • 1人2回まで
  • 登録:2008/01/25 07:48:51
  • 終了:2008/01/26 09:29:23

ベストアンサー

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692008/01/25 09:46:39

ポイント100pt

FileSystemObjectと再帰を使ってこんな感じかな

(ちなみに下の階層に同名のファイルがあるとエラーでますが)

Private FSO

Sub Macro()
    Dim fold As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    Set fold = FSO.getfolder(ThisWorkbook.Path)
    
    Call openFile(fold)
    
    Set FSO = Nothing
End Sub

Sub openFile(fold As Object)
    Dim myFile As Object
    Dim myFold As Object
    
    For Each myFile In fold.Files
        If StrConv(Right(myFile.Name, 4), vbLowerCase) = ".xls" Then
            Workbooks.Open Filename:=myFile.Path
        End If
    Next
    
    For Each myFold In fold.subfolders
        Call openFile(myFold)
    Next
End Sub
id:choro3

やっぱりこの方法になるんですね。ネット検索してこの方法は見たのですが、独学の自分には、"Set"とかが出てくると、かなりのステップアップ感があって、使いこなせるかなぁと思ってはいたのです。

ちなみに、"sub openFile"の最後のfor~Nextは、下層のディレクトリの検索をさせている部分と考えてよろしいのでしょうか。

ちょっと概念的に今の自分には難しい感じがするのですが、これを少し簡略化して使ってみることにします。ありがとうございました。

2008/01/26 09:09:08

その他の回答(1件)

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692008/01/25 09:46:39ここでベストアンサー

ポイント100pt

FileSystemObjectと再帰を使ってこんな感じかな

(ちなみに下の階層に同名のファイルがあるとエラーでますが)

Private FSO

Sub Macro()
    Dim fold As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    Set fold = FSO.getfolder(ThisWorkbook.Path)
    
    Call openFile(fold)
    
    Set FSO = Nothing
End Sub

Sub openFile(fold As Object)
    Dim myFile As Object
    Dim myFold As Object
    
    For Each myFile In fold.Files
        If StrConv(Right(myFile.Name, 4), vbLowerCase) = ".xls" Then
            Workbooks.Open Filename:=myFile.Path
        End If
    Next
    
    For Each myFold In fold.subfolders
        Call openFile(myFold)
    Next
End Sub
id:choro3

やっぱりこの方法になるんですね。ネット検索してこの方法は見たのですが、独学の自分には、"Set"とかが出てくると、かなりのステップアップ感があって、使いこなせるかなぁと思ってはいたのです。

ちなみに、"sub openFile"の最後のfor~Nextは、下層のディレクトリの検索をさせている部分と考えてよろしいのでしょうか。

ちょっと概念的に今の自分には難しい感じがするのですが、これを少し簡略化して使ってみることにします。ありがとうございました。

2008/01/26 09:09:08
id:ardarim No.2

ardarim回答回数892ベストアンサー獲得回数1422008/01/26 00:30:48

ポイント50pt

これで同じ動きになると思いますが、どうでしょうか。

    Dim FoundFile As String
    
    FoundFile = Dir(ThisWorkbook.Path & "\*.xls")
    Do While FoundFile <> ""
        Workbooks.Open Filename:=FoundFile
        FoundFile = Dir()
    Loop
id:choro3

これは簡単ですね。"Dir"関数は使ったことがなかったので、この発想はありませんでした。

ちなみに、"FoundFile"はファイル名だけのようで、パスをつけてやらないとだめみたいでした。

Workbooks.Open Filename:=Thisworkbook.Path & "\" & FoundFile

お答えいただいた方法だと下層のディレクトリの検索もしたい場合は、ちょっと工夫して再帰を仕込まなければならないんですね。参考になりました。ありがとうございます。

2008/01/26 09:25:53
  • id:ardarim
    回答の補足(訂正)です。
    Dir()で検索したファイル名にはパスが含まれませんので、フルパスが必要な場合は「ThisWorkbook.Path & "\" & FoundFile」としてください。
  • id:choro3
    あはは。終了してから見たものですから、同じ事を書いてしまいました^^
    ありがとうございました。
  • id:SALINGER
    FileSerchオブジェクトはSubfolderプロパティをtrueにするだけで、
    フォルダ階層内の全てのファイルを検索するので便利なんですが、
    調べると2007では使えないんですね。
    openFile()は引数のフォルダの中のファイルをオープンするという再帰処理です。
    openFile()の中からopenFile()を呼ぶことでサブフォルダの数だけ階層をたどれます。
  • id:choro3
    追加のコメントありがとうございます。
    再帰のために一つのサブルーチンではなく、どんどん深く探っていくための仕様なんだなとは、何とか理解できました。
    今回の僕のルーチンでは下層ディレクトリの検索は必要がないので、
    Sub Macro()
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set fold = FSO.getfolder(ThisWorkbook.Path)
    For Each myFile In fold.Files
    If StrConv(Right(myFile.Name, 4), vbLowerCase) = ".xls" Then
    Workbooks.Open Filename:=myFile.Path
    End If
    Next
    Set FSO = Nothing
    End Sub
    に変えることにしました。
    一行目の概念が今まで扱ったことがなかったので、この辺は難しいですね。
    "Dim"の宣言も配列を組むときくらいしか使わないので、"object"に定義するなんて技も使ったことが無く、今までより一歩進んだ気がします。
    どうもありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません