|
はじめまして。
最近VBAを触るようになりまして、時々掲示板を拝見しお世話になっております。
今回どうしてもできないことがあって質問させていただくことになりました。
Excel2000を使用しているのですが、
目的は指定したディレクトリ配下のサブディレクトリも含む全てのファイル名を
取得することなのですが、DIR関数を用いて行ったところ、始めはファイル名順に
取得されていた名前が、最近理解のできない順番で取得されるようになりました。
インターネットなどで調べてFileSearchオブジェクトなどを用いてやると
ファイル名順には検索できるのですが、今度はディレクトリを無視したファイル名
順で検索されてしまいます。
わかりにくいかもしれませんが例をあげますと、
D:\test\01\a.xls
\b.xls
\c.xls
\02\001.xls
\002.xls
\03\0001.xls
\0002.xls
みたいな順番でファイル名及びディレクトリ名を取得していきたいのですが、
(最終的にはこの順番でさまざまな処理を行いたいので)
何かよい方法はありますでしょうか?
念のため現在の方法を下に挙げておきます。
・DIR関数を用いた方法
'========================================
'
'MAIN
'
'========================================
Call Get_DIR(指定パス)
'=======================================
'
'フォルダ検索
'
'=======================================
Function Get_DIR(MyPath As String)
Dim MyName As String
Dim DirName(256)
Dim Dir_N As Long
Dim i As Long
On Error GoTo err_hdl
If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"
GetFile (MyPath)
Dir_N = 0
MyName = Dir(MyPath, vbDirectory) ' 最初のフォルダ名
Do While MyName <> ""
If MyName <> "." And MyName <> ".." Then '現在のフォルダと親フォルダは無視
If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then ' ビット単位の比較を行う
Dir_N = Dir_N + 1
DirName(Dir_N) = MyPath + MyName
End If
End If
MyName = Dir '次のフォルダを検索
Loop
If Dir_N > 0 Then
For i = 1 To Dir_N
Get_DIR (DirName(i) + "\")
Next i
End If
err_hdl:
If Err = 53 Then
MsgBox (DirName(i) + " file not found")
End If
End Function
'======================================================
'
'ファイル名の取得
'
'======================================================
Function GetFile(MyPath As String)
Dim MyName As String
Dim No As Integer
Dim a As Integer
Dim WS_CT As Integer
If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\"
MyName = Dir(MyPath & "\*.xls", vbNormal) ' 最初のfile名
Do While MyName <> "" ' ループを開始
'現在のフォルダと親フォルダは無視
If MyName <> "." And MyName <> ".." And MyName <> "試作マクロ.xls" Then
' ビット単位の比較を行う
If (GetAttr(MyPath & MyName) And vbNormal) = vbNormal Then
'ファイルごとに行う実際の処理
End If
End If
MyName = Dir
Loop
End function
・FileSearchオブジェクトを用いた方法
With Application.FileSearch
.LookIn = CUR_PATH '検索するフォルダを指定
.SearchSubFolders = True 'サブフォルダも検索対象にする
.Filename = "*.xls" 'Excleファイルの全てを検索
.FileType = msoFileTypeExcelWorkbooks '検索対象はエクセルブック
If .Execute(SortBy:=msoSortByFileName, _
SortOrder:=msoSortOrderAscending) > 0 Then 'ファイルの名前でソート
MsgBox .FoundFiles.Count & " 個のExcelブックが見つかりました"
For i = 1 To .FoundFiles.Count
If .FoundFiles(i) <> CUR_PATH & "試作マクロ.xls" Then '無視
If (GetAttr(MyPath & .FoundFiles(i)) And vbNormal) = vbNormal Then ' ビット単位の比較を行う
'実際のファイル毎の処理
End If
End If
Next i
Else
MsgBox "Excelファイルは存在しません。"
End If
End With
長文になってしまいましたがよろしくお願い致します。
|
|