Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5832 / 13645 ツリー ←次へ | 前へ→

【48577】複数フォルダの全ファイル取得方法 もとあし 07/4/23(月) 15:48 質問[未読]
【48579】Re:複数フォルダの全ファイル取得方法 ハチ 07/4/23(月) 17:28 回答[未読]
【48595】Re:複数フォルダの全ファイル取得方法 もとあし 07/4/24(火) 11:50 お礼[未読]
【48597】Re:複数フォルダの全ファイル取得方法 ハチ 07/4/24(火) 14:00 回答[未読]
【48609】Re:複数フォルダの全ファイル取得方法 もとあし 07/4/25(水) 14:24 お礼[未読]
【48610】Re:複数フォルダの全ファイル取得方法 ハチ 07/4/25(水) 15:47 発言[未読]
【48613】Re:複数フォルダの全ファイル取得方法 もとあし 07/4/25(水) 16:08 お礼[未読]
【48581】Re:複数フォルダの全ファイル取得方法 ichinose 07/4/23(月) 18:42 発言[未読]
【48596】Re:複数フォルダの全ファイル取得方法 もとあし 07/4/24(火) 12:01 お礼[未読]
【48612】Re:複数フォルダの全ファイル取得方法 もとあし 07/4/25(水) 15:53 質問[未読]
【48618】Re:複数フォルダの全ファイル取得方法 ichinose 07/4/25(水) 19:52 発言[未読]
【48627】Re:複数フォルダの全ファイル取得方法 もとあし 07/4/26(木) 10:31 お礼[未読]
【48638】Re:複数フォルダの全ファイル取得方法 ichinose 07/4/26(木) 22:01 発言[未読]
【48639】Re:複数フォルダの全ファイル取得方法 追伸 ichinose 07/4/27(金) 7:32 発言[未読]
【48642】Re:複数フォルダの全ファイル取得方法 追伸 もとあし 07/4/27(金) 12:02 お礼[未読]

【48577】複数フォルダの全ファイル取得方法
質問  もとあし  - 07/4/23(月) 15:48 -

引用なし
パスワード
   こんにちは。
いつもお世話になっています。
また行き詰っているので、教えてください。

複数の階層に渡って存在する複数のフォルダの各末端にデータファイルがたくさんあります。
FolderA の下に SubFolder1, SF2, SF3,...。
その各SFのしたにSubSubFolderイ, SSFロ, SSFハ...と続き、
その各SSFの下にDetaFileあ, DFい, DFう...と続きます。

フォルダもファイルも会社のサーバー内にあり、ファイルはカテゴリで分けられており、
データファイルが新規に増えれば、フォルダもファイルも新しく増える可能性があります。
その全ファイル名のリストを取得したのですが、その方法が分かりません。

#22734が一番近いような気がしたので、「にらめっこ」したのですが、
何をしているのか、ぼんやりとしか分からない状態です。

下記のコードは、エラーがでます。(安易なもので、すみません。。。)
なぜかは分かっていませんが、Dirを異なる階層で何度もループで使用するのは
Dirの戻り値が変わるから、良くないのかな。。。と思っています。

何か、糸口だけでも教えていただけないでしょうか。
また上記の理由が間違っていましたら、その正しいエラーの出る
理由も併せて教えていただけないでしょうか。

よろしくお願いします。


Sub FSearch()

Dim PartsPath As String
Dim FldName1 As String
Dim FldName2 As String
Dim FilName As String

PartsPath = "K:\AAA\BBBB\"

FldName1 = Dir(PartsPath, vbDirectory)

Do While FldName1 <> ""
  If FldName1 <> "." And FldName1 <> ".." Then
    If (GetAttr(PartsPath & FldName1) And vbDirectory) = vbDirectory Then
      FldName2 = Dir(PartsPath & FldName1 & "\", vbDirectory)
      Do While FldName2 <> ""
        If FldName2 <> "." And FldName2 <> ".." Then
          If (GetAttr(PartsPath & FldName1 & "\" & FldName2) & _
            And vbDirectory) = vbDirectory Then
            FilName = Dir(PartsPath & FldName1 & "*.xls", vbNormal)
            Do While FilName <> ""
              Debug.Print FldName1, FldName2, FilName
              FilName = Dir
            Loop
          End If
        End If
        FldName2 = Dir  →ここでエラー
      Loop
    End If
  End If
  FldName1 = Dir
Loop

End Sub

【48579】Re:複数フォルダの全ファイル取得方法
回答  ハチ  - 07/4/23(月) 17:28 -

引用なし
パスワード
   ▼もとあし さん:
>>下記のコードは、エラーがでます。(安易なもので、すみません。。。)
>なぜかは分かっていませんが、Dirを異なる階層で何度もループで使用するのは
>Dirの戻り値が変わるから、良くないのかな。。。と思っています。

ここは、お察しの通りだと思いますが、
自分の環境で実行するとそれ以前の箇所でエラーが出てしまいます。
(もちろんパスは修正してますが)

>何か、糸口だけでも教えていただけないでしょうか。
>また上記の理由が間違っていましたら、その正しいエラーの出る
>理由も併せて教えていただけないでしょうか。

Dirだけで行うとすると結構面倒な作業だと思います。
自分だったら、
FileSystemObjectでFoldersを再帰的に呼び出すか、
コマンドラインのDirを使ってやります。

混乱しそうなら下記コードは無視してください。
Sub Test()
Dim WSH As Object
Dim Cmd As Object
Dim CmdTxt As String
Dim myPath As String
Dim i As Long

Const Target_File As String = "*.xls"
Const Dir_Opt As String = "/S /B /A:-D" 'Dirオプションの指定(コマンドプロンプトで確認)

myPath = "C:\Work" '検索のルートパスの指定

CmdTxt = """dir" & Dir_Opt & " " & """" & myPath & "\" & Target_File & """"""
Set WSH = CreateObject("WScript.Shell")
Set Cmd = WSH.Exec("%ComSpec% /C " & CmdTxt)
i = 1
Do Until Cmd.StdOut.AtEndOfStream
  Cells(i, 1).Value = Cmd.StdOut.ReadLine
  i = i + 1
Loop

Set Cmd = Nothing
Set WSH = Nothing

End Sub

【48581】Re:複数フォルダの全ファイル取得方法
発言  ichinose  - 07/4/23(月) 18:42 -

引用なし
パスワード
   ▼もとあし さん:
こんばんは。


>複数の階層に渡って存在する複数のフォルダの各末端にデータファイルがたくさんあります。
>FolderA の下に SubFolder1, SF2, SF3,...。
>その各SFのしたにSubSubFolderイ, SSFロ, SSFハ...と続き、
>その各SSFの下にDetaFileあ, DFい, DFう...と続きます。
>
>フォルダもファイルも会社のサーバー内にあり、ファイルはカテゴリで分けられており、
>データファイルが新規に増えれば、フォルダもファイルも新しく増える可能性があります。
>その全ファイル名のリストを取得したのですが、その方法が分かりません。
>
>#22734が一番近いような気がしたので、「にらめっこ」したのですが、
>何をしているのか、ぼんやりとしか分からない状態です。
>
>下記のコードは、エラーがでます。(安易なもので、すみません。。。)
>なぜかは分かっていませんが、Dirを異なる階層で何度もループで使用するのは
>Dirの戻り値が変わるから、良くないのかな。。。と思っています。
>
>何か、糸口だけでも教えていただけないでしょうか。
>また上記の理由が間違っていましたら、その正しいエラーの出る
>理由も併せて教えていただけないでしょうか。
>
>よろしくお願いします。
>

目安箱にいくつもありますよ!!

www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=74;id=FAQ

FSOを使ったコードが再帰ロジックの典型コードとして
よく使われていますから、再帰処理を学ぶにはよさそうですよ!!


>Sub FSearch()
>
>Dim PartsPath As String
>Dim FldName1 As String
>Dim FldName2 As String
>Dim FilName As String
>
>PartsPath = "K:\AAA\BBBB\"
>
>FldName1 = Dir(PartsPath, vbDirectory)
>
>Do While FldName1 <> ""
>  If FldName1 <> "." And FldName1 <> ".." Then
>    If (GetAttr(PartsPath & FldName1) And vbDirectory) = vbDirectory Then
>      FldName2 = Dir(PartsPath & FldName1 & "\", vbDirectory)
>      Do While FldName2 <> ""
>        If FldName2 <> "." And FldName2 <> ".." Then
>          If (GetAttr(PartsPath & FldName1 & "\" & FldName2) & _
>            And vbDirectory) = vbDirectory Then
>            FilName = Dir(PartsPath & FldName1 & "*.xls", vbNormal)
>            Do While FilName <> ""
>              Debug.Print FldName1, FldName2, FilName
>              FilName = Dir
>            Loop
>          End If
>        End If
>        FldName2 = Dir  →ここでエラー
>      Loop
>    End If
>  End If
>  FldName1 = Dir
>Loop
>
>End Sub

【48595】Re:複数フォルダの全ファイル取得方法
お礼  もとあし  - 07/4/24(火) 11:50 -

引用なし
パスワード
   ハチ さん、こんにちは。

回答をありがとうございます。

>FileSystemObjectでFoldersを再帰的に呼び出すか、
FileSystemObjectは最近知り、今回も頭をよぎって少し考えたのですが、
どう使いこなせばいいのか、分かりませんでした。
ichinoseさんが、目安箱での例を教えてくださったので、そちらもこれから見てみます。

>コマンドラインのDirを使ってやります。
Dirコマンドは、ハチさんのアドバイスで始めて知りました。

>混乱しそうなら下記コードは無視してください。
確かに私には分からないところがたくさんあるのですが、
とってもシンプルなのでこのコードを調べながら、見てみました。
(でも調べものは、盛りだくさんで、すごいなぁ・・・とただただ感嘆です)

>CmdTxt = """dir" & Dir_Opt & " " & """" & myPath & "\" & Target_File & """"""
ここで、""がたくさんあるのが、どういう意味なのか、わかりません。が、
もう少し記述の法則など調べてみます。

>Set WSH = CreateObject("WScript.Shell")
>Set Cmd = WSH.Exec("%ComSpec% /C " & CmdTxt)
ここの%ComSpec% は環境変数というものですか?(%は何をしているのでしょうか?)
それでC:\WINDOWS\system32\cmd.exeが起動されるようですが、
コマンドプロンプトとは違うものですか?
また、これを表示しないようにする方法はありますか?

たくさん質問をしてすみません。
この、WScriptとDirといろいろ初めてが絡み合って確かに混乱してますが、
知っていくのはとても楽しいので、混乱承知で調べていきます。
なのでお忙しいところ申し訳ありませんが、もう少しお付き合いくださって、
コードの解説をもしいただければ嬉しいです。
よろしくお願いします。

【48596】Re:複数フォルダの全ファイル取得方法
お礼  もとあし  - 07/4/24(火) 12:01 -

引用なし
パスワード
   ichinose さん、こんにちは。


>目安箱にいくつもありますよ!!
>
>www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=74;id=FAQ
>
>FSOを使ったコードが再帰ロジックの典型コードとして
>よく使われていますから、再帰処理を学ぶにはよさそうですよ!!

教えてくださり、ありがとうございます!
ざざっと目を通し、いくつかの方法があることを知りましたが、
ハチさんのコードと奮闘していたので、まだきちんと見ていません。

APIは私には難しそうなのですが、APIは試行錯誤するのは危険だと、何かで読みました。
なので、確実に知識になった分から、少しずつ使えていけたらな。と思っています。
なので、最初の初心者に最適だというFSOバージョンを見てみます。
そこで、分からないことがありましたが、近日中にまた質問をさせていただきたいと
思っていますので、その時はどうぞよろしくお願いします。

【48597】Re:複数フォルダの全ファイル取得方法
回答  ハチ  - 07/4/24(火) 14:00 -

引用なし
パスワード
   ▼もとあし さん:
>>CmdTxt = """dir" & Dir_Opt & " " & """" & myPath & "\" & Target_File & """"""
>ここで、""がたくさんあるのが、どういう意味なのか、わかりません。が、
>もう少し記述の法則など調べてみます。

VBA上で、"を認識させるには、""とする必要があります。
結果を確認してみてください。
Sub Test1()
  Debug.Print """"
  Debug.Print """"""
End Sub


>>Set WSH = CreateObject("WScript.Shell")
>>Set Cmd = WSH.Exec("%ComSpec% /C " & CmdTxt)
>ここの%ComSpec% は環境変数というものですか?(%は何をしているのでしょうか?)

その通りです。コマンドラインで環境変数を使う場合は、%で括ります。
試しにコマンドプロンプトを開いて
set と入力してみてください。
その後、echo %変数名%(%OS%とか)
標準出力(表示)されるのがわかると思います。
このへんはDOSとかBATファイルとか勉強してみてください。

>それでC:\WINDOWS\system32\cmd.exeが起動されるようですが、
>コマンドプロンプトとは違うものですか?

同じです。Win9xでは、cmd.exeではなくてcommand.exeになりますので、
OS依存を避ける為にComSpecを使いました。

>また、これを表示しないようにする方法はありますか?

Execメソッドではできません。
Runメソッドならできますが、標準出力を直接取得することはできない為、
リダイレクトでテキストファイルに出力し、それを読み込むことできます。
(そこまでやるなら、別の方法でやるほうが良いと思いますが・・)
とりあえずTest2()を実行するとtxtファイルができます。
どこにできるかは、調べられるはずです^^

>なのでお忙しいところ申し訳ありませんが、もう少しお付き合いくださって、
>コードの解説をもしいただければ嬉しいです。
>よろしくお願いします。

Option Explicit

Sub Test()
Dim WSH As Object
Dim Cmd As Object
Dim CmdTxt As String
Dim myPath As String
Dim i As Long

Const Target_File As String = "*.xls"
Const Dir_Opt As String = "/S /B /A:-D" 'Dirオプションの指定(コマンドプロンプトで確認)

myPath = "e:Work" 'ルートパスの指定
CmdTxt = """dir" & Dir_Opt & " " & """" & myPath & "\" & Target_File & """"""

'修正
CmdTxt = "%ComSpec% /C " & CmdTxt
'確認用に追加。イミディエイトで確認
'これをコマンドプロンプトに貼り付けて実行すると、同じ結果が表示されるはず。
Debug.Print CmdTxt

'標準出力を取得するのにWScript.Shell.Exceを使用する。
Set WSH = CreateObject("WScript.Shell")
Set Cmd = WSH.Exec(CmdTxt)

i = 1
'実行結果の標準出力を一行づつ読み込んでセルに書き出し
Do Until Cmd.StdOut.AtEndOfStream
  Cells(i, 1).Value = Cmd.StdOut.ReadLine
  i = i + 1
Loop

Set Cmd = Nothing
Set WSH = Nothing

End Sub

Sub Test2()
Dim WSH As Object
Dim CmdTxt As String
Dim myPath As String
Dim i As Long

Const Target_File As String = "*.xls"
Const Dir_Opt As String = "/S /B /A:-D" 'Dirオプションの指定(コマンドプロンプトで確認)

myPath = "e:Work" 'ルートパスの指定
CmdTxt = """dir" & Dir_Opt & " " & """" & myPath & "\" & Target_File & """"""

'修正
CmdTxt = "%ComSpec% /C " & CmdTxt & " > %HOMEPATH%\TestDir.txt"
'確認用に追加。イミディエイトで確認
Debug.Print CmdTxt

Set WSH = CreateObject("WScript.Shell")
'Runメソッドに変更
WSH.Run CmdTxt, 0

Set WSH = Nothing

End Sub

【48609】Re:複数フォルダの全ファイル取得方法
お礼  もとあし  - 07/4/25(水) 14:24 -

引用なし
パスワード
   ハチ さん、こんにちは。

""""や環境変数についてのご説明ありがとうございました。
よく分かりました。

ところで、Dirコマンドで伺いたいのですが、
色々なサイトでDirコマンドを調べると

DIR [ドライブ:][パス][ファイル名] [/A[[:]属性]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]ソート順]] [/P] [/S] [/T[[:]タイムフィールド]] [/W] [/X]

と説明されています。
ハチさんの
>Const Dir_Opt As String = "/S /B /A:-D" 'Dirオプションの指定(コマンドプロンプトで確認)
>
>myPath = "e:Work" 'ルートパスの指定
>CmdTxt = """dir" & Dir_Opt & " " & """" & myPath & "\" & Target_File & """"""
ですと、[ドライブ:][パス][ファイル名] [/A[[:]属性]] が最後になっている
と思うのです。どちらもコマンドプロンプトで試したのですが、正しく動いているようです。
順番はどちらでも大丈夫なのですか?

またRunメソッドの方法も試しました。
使用している端末はXP Professionalなので%HOMEPATH%は \Documents and Settings\Taro 
かと思ったのですが、C:\Tempに入ってました。
そういえばコマンドプロンプトの表示もC:\Temp>とでてます。
これは会社のPCなので、管理者が変更してるのでしょうか?

はじめ見たとき、全然分からなかったコードが今は、完全とは言えないものの
だいぶ何をしているのかが理解できて、すごく嬉しいです!

ありがとうございました!

>Sub Test2()
>Dim WSH As Object
>Dim CmdTxt As String
>Dim myPath As String
>Dim i As Long
>
>Const Target_File As String = "*.xls"
>Const Dir_Opt As String = "/S /B /A:-D" 'Dirオプションの指定(コマンドプロンプトで確認)
>
>myPath = "e:Work" 'ルートパスの指定
>CmdTxt = """dir" & Dir_Opt & " " & """" & myPath & "\" & Target_File & """"""
>
>'修正
>CmdTxt = "%ComSpec% /C " & CmdTxt & " > %HOMEPATH%\TestDir.txt"
>'確認用に追加。イミディエイトで確認
>Debug.Print CmdTxt
>
>Set WSH = CreateObject("WScript.Shell")
>'Runメソッドに変更
>WSH.Run CmdTxt, 0
>
>Set WSH = Nothing
>
>End Sub

【48610】Re:複数フォルダの全ファイル取得方法
発言  ハチ  - 07/4/25(水) 15:47 -

引用なし
パスワード
   ▼もとあし さん:

>ところで、Dirコマンドで伺いたいのですが、
>色々なサイトでDirコマンドを調べると
>
>DIR [ドライブ:][パス][ファイル名] [/A[[:]属性]] [/B] [/C] [/D] [/L] [/N]
>[/O[[:]ソート順]] [/P] [/S] [/T[[:]タイムフィールド]] [/W] [/X]
>
>と説明されています。
>ハチさんの
>>Const Dir_Opt As String = "/S /B /A:-D" 'Dirオプションの指定(コマンドプロンプトで確認)
>>
>>myPath = "e:Work" 'ルートパスの指定
>>CmdTxt = """dir" & Dir_Opt & " " & """" & myPath & "\" & Target_File & """"""
>ですと、[ドライブ:][パス][ファイル名] [/A[[:]属性]] が最後になっている
>と思うのです。どちらもコマンドプロンプトで試したのですが、正しく動いているようです。
>順番はどちらでも大丈夫なのですか?

あんまり気にしたことがなかったですが・・・
Helpでは確かにそうなってますね。初めて知りました。
[オプション][オプションの引数][オプション][オプションの引数][・・・
と記述する形式のモノが結構あるので、そんなクセがついているのかも知れません。
大丈夫かと言われると・・いままでトラブったことはありません。
心配だったら、Helpの表記にあわせたほうが良いかも。

>またRunメソッドの方法も試しました。
>使用している端末はXP Professionalなので%HOMEPATH%は \Documents and Settings\Taro 
>かと思ったのですが、C:\Tempに入ってました。
>そういえばコマンドプロンプトの表示もC:\Temp>とでてます。
>これは会社のPCなので、管理者が変更してるのでしょうか?

ユーザープロファイルの問題なので、環境によると思います。
コンピュータの管理>ローカルユーザーとグループ
でホームディレクトリは変更できたと思います。(違ってたらすいません。)

【48612】Re:複数フォルダの全ファイル取得方法
質問  もとあし  - 07/4/25(水) 15:53 -

引用なし
パスワード
   ichinose さん、こんにちは。

>>目安箱にいくつもありますよ!!
>>
>>www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=74;id=FAQ
>>
>>FSOを使ったコードが再帰ロジックの典型コードとして
>>よく使われていますから、再帰処理を学ぶにはよさそうですよ!!
【その1 FSO Version】を見てみました。が、エラーが出ますので、教えていただけないでしょうか。
それまでも何度か別のエラーは出ました。
そこで、参照設定でShell controls and automationと
Scripting runtimeにチェックを入れました。
また、strTargetPath にPathを入れました。
すると、エラー13:型が一致しませんと、下記の場所ででます。
Debug.printしてみたりして自分で確認してみたりもしたのですが、
どうして、型が一致しないのか、よく分からないのです。
何かを私は理解していない気がするのです。
それが何か自分で分からないので、すみません。教えていただけませんか?
よろしくお願いします。

>'呼び出し用
>Sub CallFilePathList1()
>  Dim objFSO     As FileSystemObject
>  Dim strTargetPath  As String      '対象フォルダパス
>  
>  Set objFSO = New FileSystemObject
   strTargetPath = "K:\"
>  
>  Call EnumFilePathList1(objFSO.GetFolder(strTargetPath)) → ここでエラー
>End Sub
>
>'本体
>Sub EnumFilePathList1(objFolder As Folder)
>  Dim objTargetFile  As File
>  Dim objSubFolder   As Folder
>  
>  'ファイル名を列挙
>  For Each objTargetFile In objFolder.Files
>    Debug.Print objTargetFile.Path
>  Next objTargetFile
>  
>  'サブフォルダを検索
>  For Each objSubFolder In objFolder.SubFolders
>    Call EnumFilePathList1(objSubFolder)
>  Next objSubFolder
>End Sub

【48613】Re:複数フォルダの全ファイル取得方法
お礼  もとあし  - 07/4/25(水) 16:08 -

引用なし
パスワード
   ハチさん、

長々とお付き合いくださり、本当にありがとうございました。
これからもがんばってVBAと奮闘していきます。

【48618】Re:複数フォルダの全ファイル取得方法
発言  ichinose  - 07/4/25(水) 19:52 -

引用なし
パスワード
   ▼もとあし さん:
こんばんは。
私の環境では、正常にさどうしていますけどねえ!!


>どうして、型が一致しないのか、よく分からないのです。

>それが何か自分で分からないので、すみません。教えていただけませんか?
>よろしくお願いします。


これで再度試してみてください。

Sub CallFilePathList1()
  Dim objFSO     As Object
  Dim strTargetPath  As Variant   '対象フォルダパス
  strTargetPath = "k:\"
  Set objFSO = CreateObject("Scripting.FileSystemObject")
 
  Call EnumFilePathList1(objFSO.GetFolder(strTargetPath))
End Sub

'本体
Sub EnumFilePathList1(objFolder As Object)
  Dim objTargetFile  As File
  Dim objSubFolder   As Folder
 
  'ファイル名を列挙
  On Error Resume Next
  For Each objTargetFile In objFolder.Files
    Debug.Print objTargetFile.Path
  Next objTargetFile
 
  'サブフォルダを検索
  For Each objSubFolder In objFolder.SubFolders
    Call EnumFilePathList1(objSubFolder)
  Next objSubFolder
End Sub

【48627】Re:複数フォルダの全ファイル取得方法
お礼  もとあし  - 07/4/26(木) 10:31 -

引用なし
パスワード
   ichinose さん、こんにちは。

お返事ありがとうございます。

>私の環境では、正常にさどうしていますけどねえ!!
やっぱり私の方はだめです。。。なぜ、私の方ではダメなのでしょうか。。。

>これで再度試してみてください。
>
>Sub CallFilePathList1()
>  Dim objFSO     As Object
>  Dim strTargetPath  As Variant   '対象フォルダパス
>  strTargetPath = "k:\"
>  Set objFSO = CreateObject("Scripting.FileSystemObject")
> 
>  Call EnumFilePathList1(objFSO.GetFolder(strTargetPath))
>End Sub
>
>'本体
>Sub EnumFilePathList1(objFolder As Object)
>  Dim objTargetFile  As File
>  Dim objSubFolder   As Folder
> 
>  'ファイル名を列挙
>  On Error Resume Next
>  For Each objTargetFile In objFolder.Files
>    Debug.Print objTargetFile.Path
>  Next objTargetFile
> 
>  'サブフォルダを検索
>  For Each objSubFolder In objFolder.SubFolders
>    Call EnumFilePathList1(objSubFolder)
>  Next objSubFolder
>End Sub

トライさせていただきました。
これは何の問題もなく、動作しました。
objFSOをCreateObjectで行うのと、
New FileSystemObject でするのとは
何が変わってくるのですか?

すみません。教えてください。
よろしくお願いします。

【48638】Re:複数フォルダの全ファイル取得方法
発言  ichinose  - 07/4/26(木) 22:01 -

引用なし
パスワード
   ▼もとあし さん:
こんばんは。

>
>お返事ありがとうございます。
>
>>私の環境では、正常にさどうしていますけどねえ!!
>やっぱり私の方はだめです。。。なぜ、私の方ではダメなのでしょうか。。。

>そこで、参照設定でShell controls and automationと
これを見落としていました。この参照設定、要りません。
Microsoft Scripting Runtimeにも
Shell controls and automationにも
Folderオブジェクトがあります。

名前は同じでもオブジェクトは違います。
ただFolderと指定すると、優先順位の高い方が採用されます。

「Shell controls and automation」の方が高くなっていませんか?

尚、Createobjectは、別件で試していた名残なので
New Filesystemobjectでも同じです。失礼しました。

【48639】Re:複数フォルダの全ファイル取得方法 ...
発言  ichinose  - 07/4/27(金) 7:32 -

引用なし
パスワード
   おはようございます。
>>
>>そこで、参照設定でShell controls and automationと
>これを見落としていました。この参照設定、要りません。
>Microsoft Scripting Runtimeにも
>Shell controls and automationにも
>Folderオブジェクトがあります。

因みに上記の二つとも参照設定している場合
(Shell controls and automationの優先順位が高くても)でも・・・、

Sub EnumFilePathList1(objFolder As Scripting.Folder)
  Dim objTargetFile  As Scripting.File
  Dim objSubFolder   As Scripting.Folder

'              ↑このように型宣言を行えば正常に動作します
 
  'ファイル名を列挙
  For Each objTargetFile In objFolder.Files
    Debug.Print objTargetFile.Path
  Next objTargetFile
 
  'サブフォルダを検索
  For Each objSubFolder In objFolder.SubFolders
    Call EnumFilePathList1(objSubFolder)
  Next objSubFolder
End Sub

【48642】Re:複数フォルダの全ファイル取得方法 ...
お礼  もとあし  - 07/4/27(金) 12:02 -

引用なし
パスワード
   ichinose さん、こんにちは。

>>>そこで、参照設定でShell controls and automationと
>>これを見落としていました。この参照設定、要りません。
>>Microsoft Scripting Runtimeにも
>>Shell controls and automationにも
>>Folderオブジェクトがあります。
そうだったのですか。
Shell controls and automationの優先順位の方が確かに高かったです。
このチェックを外したら、問題なく動きました!

>因みに上記の二つとも参照設定している場合
>(Shell controls and automationの優先順位が高くても)でも・・・、
>
>Sub EnumFilePathList1(objFolder As Scripting.Folder)
>  Dim objTargetFile  As Scripting.File
>  Dim objSubFolder   As Scripting.Folder
>
>'              ↑このように型宣言を行えば正常に動作します
こちらも試して、正常に動作するのを確認できました!

参照設定に関する知識は、必要に応じてその都度少しずつ学んでいっているだけです。
参照設定で表示されるリストを見ると、「なんでこんなに!」と思うほどあり、
そのほとんどが何なのか分かりません。
今回も、分からないコードなどを調べているときに、
「これを使うときは、このライブラリにチェックしてね」
と書いてある、Webサイトを見て、「ふーん。このオブジェクトにはこれなんだ」
と単純に思って、入れているだけなのです。。。
「何を使うと、どのライブラリにチェックすれば良いのかなどは、
一元的に説明された資料がないのが普通で、ある程度経験が必要」
とどこかで見ました。少しずつ知識を増やして行くしか、ないのですね。。。

ですが、今回Folderオブジェクトが複数のライブラリにあることを知りました。
ありがとうございました。
また、行き詰ったら教えてください。
よろしくお願いします。

5832 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free