Board logo

標題: [發問] 多層資料夾尋找檔案的問題 [打印本頁]

作者: ui123    時間: 2014-3-6 22:59     標題: 多層資料夾尋找檔案的問題

本帖最後由 ui123 於 2014-3-6 23:00 編輯

各位大大,遇到一個難題是這樣的:
平時檔案都會放在一個資料夾的第一層,但定時會有人去將這些檔案按年月去歸位
如果在第一層找不到檔案,就要往下一層去找個個資料夾看檔案在哪裡...只會存在在其中一個資料夾,但不知道在哪一個
範例:比方我要找名為file的檔案,找到後然後打開此檔案(沒找到顯示"沒找到此檔案"),如附件。
目前只會使用單層dir

[attach]17697[/attach]
作者: ui123    時間: 2014-3-8 20:02

看到一個標題是這樣的:
"Excel VBA to list files in folder and subfolder with path to .txt file"
如下網址:
http://stackoverflow.com/questions/20219362/excel-vba-to-list-files-in-folder-and-subfolder-with-path-to-txt-file

我試過他會列出所有資料夾的名稱,但有個小小疑問,要怎麼利用dir去尋找這清單然後打開要的檔案?有大大可以教我一下嗎? 由衷感謝^^

    Sub go()
        ShowFolderList ("C:\temp")
    End Sub

    Sub ShowFolderList(folderspec)
        Dim fs, f, f1, fc, s, sFldr
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.GetFolder(folderspec)
        Set fc = f.SubFolders
         For Each f1 In fc
            ShowFolderList f1
        Next
        Set fc = f.Files
        For Each f1 In fc
            Debug.Print folderspec & f1.Name
        Next
    End Sub
作者: Hsieh    時間: 2014-3-8 22:48

回復 2# ui123


   http://gb.twbts.com/index.php/topic,1877.0.html
作者: ui123    時間: 2014-3-9 09:50

回復 3# Hsieh

親愛的版主您好~
我有連進去囉->Excel程式區 1877.0 html 是什麼? 不懂,感恩^^
作者: Hsieh    時間: 2014-3-9 10:10

本帖最後由 Hsieh 於 2014-3-9 10:20 編輯

Dir 函數 - 基本的檔案/資料夾讀取方式
Sub 列出檔案()
path1 = "C:\Temp\*.*"
file1 = Dir(path1): r = 1
Do While file1 <> ""
 Cells(r, 1) = file1
 r = r + 1
 file1 = Dir '取得下一個檔名
Loop
End Sub

Dir 基本應用範例
對一個已被其他電腦(非本機)以資源共享方式開啟的xls檔,有沒有什麼方法來偵測或描述它的屬性或狀態,以表示它是一個「目前已被開啟使用中」的檔案??

以下的巨集會把本機和指定目錄下使用中的xls檔列出。

Sub CheckFile()
Application.ScreenUpdating = False
Range("A1") = "本機已開啟檔案"
For Each book In Workbooks
 GoSub 1: Cells(r, 1) = book.FullName
Next
mypath = "C:\": GoSub 1
myfile = Dir(mypath & "*.xls")
Cells(r, 1) = "他人使用中檔案"
Do While myfile <> "" ' 執行迴圈
 GoSub 1: myfilename = mypath & myfile
 Workbooks.Open myfilename
 If ActiveWorkbook.ReadOnly Then Cells(r, 1) = myfilename
 Workbooks(myfile).Close
 myfile = Dir ' 尋找下一個檔案
Loop: Exit Sub
1 r = Application.WorksheetFunction.CountA(Columns(1)) + 1: Return
End Sub

註:資料夾分享模式應設定為「完整」,否則偵測不到。 

Dir 進階應用範例
列出指定目錄之下所有的子資料夾內容。

Sub list_and_link1()
Dim ary() As String, rw As Long
rw = 1: i = 0
path1 = "C:\myArticle\"
file1 = Dir(path1 & "*.*", vbDirectory) '只處理資料夾
Do While file1 <> ""
 If file1 <> "." And file1 <> ".." And _
   GetAttr(path1 & file1) = vbDirectory Then
   i = i + 1
   ReDim Preserve ary(i)
   ary(i) = file1
 End If
 file1 = Dir
Loop
For i = 1 To UBound(ary)
  Cells(rw, 1) = ary(i)
  rw = rw + 1
  GetSubs path1 & ary(i) & "\", rw, 1
Next i
file1 = Dir(path1 & "*.*")
Do While file1 <> ""
 '此例只列出檔名, 你可寫上要做的動作
 Cells(rw, 1) = file1
 rw = rw + 1
 file1 = Dir
Loop
End Sub

Sub GetSubs(sPath As String, rw As Long, ilevel As Long)
Dim ary1() As String
ReDim ary1(1)
sName = Dir(sPath, vbDirectory)
Do While sName <> ""
 If sName <> "." And sName <> ".." And _
   GetAttr(sPath & sName) = vbDirectory Then
   ary1(UBound(ary1)) = sName
   ReDim Preserve ary1(UBound(ary1) + 1)
 End If
 sName = Dir
Loop
For i = 1 To UBound(ary1) - 1
  Cells(rw, ilevel + 1) = ary1(i)
  rw = rw + 1
  GetSubs sPath & ary1(i) & "\", rw, ilevel + 1
Next i
sName = Dir(sPath & "*.*")
Do While sName <> ""
 Cells(rw, ilevel + 1) = sName
 rw = rw + 1
 sName = Dir
Loop
End Sub

--------------------------------------
Dir 函數的特點:
用於取得檔案或目錄的名稱,適合基本的需求。
FileSystem object 的特點:
因為它是物件,擁有許多屬性和方法,可以做更靈活的運用。

檔案比對 / 目錄操作 (GetFolder)
存檔時如何得知其他幾個資料夾裡已有相同名稱的檔案存在 (已存在檔案有可能是隱藏)??

可在巨集中使用 FileSystem 物件來搜尋比對, 會包含隱藏檔.
假設這五個資料夾位於 C:\My Documents。

Sub 檢查檔案( )
 檔名 = InputBox("請輸入檔名 (包含副檔名):")
 If 檔名 = "" Then Cancel = True: Exit Sub
 Set fs = CreateObject("Scripting.FileSystemObject")
 Set sf = fs.GetFolder("C:\My Documents").SubFolders
 For Each f In sf
  For Each f1 In f.Files
   If f1.Name = 檔名 Then
    MsgBox 檔名 & " 已存在於 " & f.Name & " 資料夾!"
    a = 1: Exit For
   End If
  Next
 Next
 If a = 1 Then Cancel = True
End Sub

若仍想得知該檔案是否為隱藏檔, 可使用下列程式碼 :
If f1.Attributes And 2 Then MsgBox "該檔案為隱藏檔!"

判斷檔案是否存在 (FileExists)
如何判斷欲開啟的檔案是否存在,若存在則開啟之,若不存在則開啟新檔並命名為指定的檔名,若該檔案已經開啟則使該檔案成為作用中的檔案? 

1 檔名 = InputBox("請輸入檔名:")
2 If 檔名 = "" Then Exit Sub
3 For Each win In Windows
4  If UCase(win.Caption) = UCase(檔名) Then x = True: Exit For
5 Next: If x Then win.Activate: Exit Sub
6 Set fs = CreateObject("Scripting.FileSystemObject")
7 If Not fs.FileExists(檔名) Then
'8  Set newfile = Workbooks.Add
'0  newfile.SaveAs 檔名
8  Workbooks.Add.SaveAs 檔名
9 Else: Workbooks.Open 檔名
0 End If

[說明]
1 顯示對話框, 輸入檔名 (要含副檔名)
2 如果沒輸入或按了取消則傳回空字串, 結束巨集
3 對已開啟的每個視窗(檔案)做迴圈比對
4 若視窗標題 = 輸入的檔名則設變數 x = True, 結束迴圈
 (使用 UCase 函數轉換為大寫以便於比對)
5 若 x 為 True 則使該檔案成為使用中視窗
6 建立一個 FileSystem 物件, 以作磁碟檔案處理
7 若指定的檔案不存在
8 開新檔案並存為指定的檔名
9 否則開啟指定的檔案
0 結束 If 判斷

[註]
•為說明之便而加上程式行號, 一般是不需要的
•範例針對"目前"資料夾, 有需要請自行加上路徑

Dir / FileSystem 應用比較
有大量的Excel檔, 其中要把某些字串改成別的字串, 比如所有的aaa要改成bbb。

假設檔案都放在 D:\Temp 資料夾之下, 
要把其中所有 Excel 檔中的 aaa 取代為 bbb.
磁碟/檔案的處理不外乎 Dir函數 和 Filesystem Object 兩種方法.

一. 使用 Dir 函數
Sub 取代一大堆()
 p = "D:\Temp\"
 f = Dir(p & "*.xls")
 Do While f <> ""
  Workbooks.Open p & f
  For Each sh In Worksheets
   sh.Cells.Replace "aaa", "bbb", xlPart
  Next
  ActiveWorkbook.Close True '存檔並關閉
  f = Dir
 Loop
End Sub

二. 使用 Filesystem Object
Sub 取代一大堆()
 Set fs = CreateObject("Scripting.FileSystemObject")
 Set fd = fs.GetFolder("D:\Temp") '取得資料夾
 For Each f In fd.Files
  If fs.GetExtensionName(f.Name) = "xls" Then '取得副檔名
  Workbooks.Open f.Path
  For Each sh In Worksheets
   sh.Cells.Replace "aaa", "bbb", xlPart
  Next
  ActiveWorkbook.Close True
  End If
 Next
End Sub
作者: ui123    時間: 2014-3-9 19:28

回復 5# Hsieh

版大我有看完你PO的文,Sub list_and_link1 可以列出所有檔案名
----------------------------------------------------------------------------------------------------------
另外也找了一種方法,它可以幫我找出所有檔案名稱,但有個小小問題,
如果Sheet1的Range("A1") 是搜尋的檔名,例如:file(如主題中的附件),如何在搜尋到後打開他???感謝您^^

Public Sub TestListDir()
    Worksheets(1).Cells(2, 1).Activate
    Call listDir("C:\Users\ui\Desktop\New folder\", 1)
End Sub

Public Sub listDir(strPath As String, lngSheet As Long)
Dim strFn As String
Dim strDirList() As String
Dim lngArrayMax, x As Long
lngArrayMax = 0
strFn = Dir(strPath & "*.*", 23)
While strFn <> ""
    If strFn <> "." And strFn <> ".." Then
        If (GetAttr(strPath & strFn) And vbDirectory) = vbDirectory Then
            lngArrayMax = lngArrayMax + 1
            ReDim Preserve strDirList(lngArrayMax)
            strDirList(lngArrayMax) = strPath & strFn & "\"
        Else
            ActiveCell.Value = strPath & strFn
            Worksheets(lngSheet).Cells(ActiveCell.Row + 1, 1).Activate
        End If
    End If
    strFn = Dir()
Wend
If lngArrayMax <> 0 Then
    For x = 1 To lngArrayMax
        Call listDir(strDirList(x), lngSheet)
    Next
End If
End Sub
作者: ui123    時間: 2014-3-12 22:24

各位大大,給您們回報目前狀況

暫時方案:
目前無法解決"Dir在各subfolder找到檔案就開起來(檔案只存在一個資料夾)"
所以現在暫時應應措施為:  先列出所有的檔案名,然後搜出要的檔案名+完整位置,然後打開它~
---------------------------------------------------------------------------------------------
永久對策:
如有人會"Dir各subfolder"然後打開找到的檔案的話,請不令指教,感謝~^^
PS:要找的檔案名會放在A1儲存格
作者: Hsieh    時間: 2014-3-12 23:43

回復 7# ui123
檔名放在A1
就稍改一下就可以了
執行list_and_link1
  1. Sub list_and_link1()
  2. Dim ary() As String, rw As Long
  3. rw = 1: i = 0
  4. path1 = "C:\temp\" '第一層資料夾
  5. file1 = Dir(path1 & "*.*", vbDirectory) '只處理資料夾
  6. Do While file1 <> ""
  7.   If file1 <> "." And file1 <> ".." And _
  8.      GetAttr(path1 & file1) = vbDirectory Then
  9.      i = i + 1
  10.      ReDim Preserve ary(i)
  11.      ary(i) = file1
  12.   End If
  13.   file1 = Dir
  14. Loop
  15. For i = 1 To UBound(ary)
  16.    GetSubs path1 & ary(i) & "\", rw, 1
  17. Next i
  18. End Sub

  19. Sub GetSubs(sPath As String, rw As Long, ilevel As Long)
  20. Dim ary1() As String
  21. ReDim ary1(1)
  22. sname = Dir(sPath, vbDirectory)
  23. Do While sname <> ""
  24.   If sname <> "." And sname <> ".." And _
  25.      GetAttr(sPath & sname) = vbDirectory Then
  26.      ary1(UBound(ary1)) = sname
  27.      ReDim Preserve ary1(UBound(ary1) + 1)
  28.   End If
  29.   sname = Dir
  30. Loop
  31. For i = 1 To UBound(ary1) - 1
  32.    rw = rw + 1
  33.    GetSubs sPath & ary1(i) & "\", rw, ilevel + 1
  34. Next i
  35. sname = Dir(sPath & "*.*")
  36. If Dir(sPath & [A1]) = [A1] Then
  37.    Workbooks.Open sPath & [A1] '開啟檔案
  38. End
  39. End If
  40. End Sub
複製代碼

作者: PKKO    時間: 2015-6-15 11:50

回復 8# Hsieh

大大您好,我想透過您的程式碼,自動找到[個人巨集活頁簿]的位置

但遇到2個問題
1.(權限問題),因個人巨集活頁簿應該不會放到權限的資料夾裡面,因此我寫一個ON ERROR RESUME NEXT 跳過
2.找不到[XLSTART]資料夾...WHY?
  1. Sub list_and_link1()
  2.     Dim ary() As String, rw As Long
  3.     rw = 1: i = 0
  4.     path1 = "C:\" '第一層資料夾
  5.     file1 = Dir(path1 & "*.*", vbDirectory) '只處理資料夾
  6.     Do While file1 <> ""
  7.       If file1 <> "." And file1 <> ".." And _
  8.          GetAttr(path1 & file1) = vbDirectory Then
  9.          i = i + 1
  10.          ReDim Preserve ary(i)
  11.          ary(i) = file1
  12.       End If
  13.       file1 = Dir
  14.     Loop
  15.     For i = 1 To UBound(ary)
  16.        GetSubs path1 & ary(i) & "\", rw, 1
  17.     Next i
  18. End Sub

  19. Sub GetSubs(sPath As String, rw As Long, ilevel As Long)
  20.     Dim ary1() As String
  21.     ReDim ary1(1)
  22.     On Error Resume Next
  23.     sname = ""
  24.     sname = Dir(sPath, vbDirectory)
  25.     On Error GoTo 0
  26.     Do While sname <> ""
  27.       If sname <> "." And sname <> ".." And _
  28.          GetAttr(sPath & sname) = vbDirectory Then
  29.          ary1(UBound(ary1)) = sname
  30.          ReDim Preserve ary1(UBound(ary1) + 1)
  31.       End If
  32.       sname = Dir
  33.     Loop
  34.     For i = 1 To UBound(ary1) - 1
  35.        rw = rw + 1
  36.        GetSubs sPath & ary1(i) & "\", rw, ilevel + 1
  37.       If ary1(i) = "XLSTART" Then
  38.             Sheets("LOG").[E1] = sPath & ary1(i)
  39.             End
  40.       End If
  41.     Next i
  42. End Sub
複製代碼

作者: GBKEE    時間: 2015-6-15 17:14

回復 9# PKKO
試試看
  1. Option Explicit
  2. 'FileSystemObject 物件" 提供對電腦檔案系統的存取。
  3. Sub Ex()
  4.     Dim Fs As Object, F As Object
  5.     Set Fs = CreateObject("Scripting.FileSystemObject").GetDRIVE("C:")
  6.     Set Fs = Fs.ROOTFOLDER.SubFolders '根目錄\資料夾物件集合
  7.     For Each F In Fs
  8.        副程式 F.Path
  9.     Next
  10. End Sub
  11. Private Sub 副程式(資料夾 As String)
  12.     Dim Fs As Object, F As Object
  13.     Set Fs = CreateObject("Scripting.FileSystemObject")
  14.     '*** 如資料夾下有子資料夾 再呼叫這副.程式 ***
  15.     '呼叫 程式的迴圈
  16.     On Error Resume Next  '有錯誤跳過
  17.     For Each F In Fs.GetFolder(資料夾).SubFolders
  18.         If Err = 0 Then  '沒有錯誤時
  19.             If InStr(F, "XLSTART") Then
  20.                 MsgBox F
  21.                 End
  22.             End If
  23.         End If
  24.         副程式 F.Path
  25.     Next
  26. End Sub
複製代碼

作者: PKKO    時間: 2015-6-15 21:11

回復 10# GBKEE


    超版大大,實在太神了

多學了一個InStr的用法,真好用耶

至於Set Fs = CreateObject("Scripting.FileSystemObject").GetDRIVE("C:")
    Set Fs = Fs.ROOTFOLDER.SubFolders '根目錄\資料夾物件集合
也是小弟第一次看到
好方便!

感激至極!!
作者: no3-taco    時間: 2015-6-16 04:33

本帖最後由 no3-taco 於 2015-6-16 04:36 編輯

玩玩看,簡化過的遞迴版
  1. Sub 這裡執行()
  2. Dim rw As Long, ilevel As Long: rw = 1: ilevel = 0
  3. GetSubs "C:\Users\Administrator\Desktop" & "\", rw, ilevel '呼叫副程式"#修改路徑#
  4. End Sub
  5. Sub GetSubs(sPath As String, rw As Long, ilevel As Long)
  6. Dim ary1() As String: ReDim ary1(0): Dim sName
  7. sName = Dir(sPath, vbDirectory)
  8. Do While sName <> ""
  9.     On Error Resume Next  '有錯誤跳過
  10.     If sName <> "." And sName <> ".." And (GetAttr(sPath & sName) And vbDirectory) = vbDirectory Then
  11.     'If Err = 0 Then  '沒有錯誤時
  12.         ReDim Preserve ary1(UBound(ary1) + 1)
  13.         ary1(UBound(ary1)) = sName
  14.     End If ': End If
  15.     sName = Dir
  16. Loop
  17. For i = 1 To UBound(ary1)
  18.     rw = rw + 1
  19.     GetSubs sPath & ary1(i) & "\", rw, ilevel + 1    '遞迴呼叫
  20. Next i
  21. sName = Dir(sPath)
  22. If Dir(sPath & [A1]) = [A1] Then
  23.    Workbooks.Open sPath & [A1]    '開啟檔案
  24. End
  25. End If
  26. End Sub
複製代碼

作者: ui123    時間: 2015-9-9 15:27

回復 8# Hsieh
大大最近使用這個程式碼時,發現常常搜個2~3層就不搜了(沒在搜下去,原始資料夾共有24個 2014/1..../12 &2015/1..../12),
很怪><,不過有的時候時成功的
作者: 准提部林    時間: 2015-9-9 17:25

本帖最後由 准提部林 於 2015-9-9 17:27 編輯

回復 13# ui123


2003以上沒了 FileSearch,對這多層搜檔實在頭痛,不是專行寫的,參考看看!
A1請先輸入〔檔案名稱.副檔名〕,僅搜索執行檔案同一層及以下子資料夾的檔案,
若與實際需求有不足點,請自行修改:
  1. Sub Get_File()
  2. Dim OBJ, xD, xFile$, Urr, U, G, GF, K, xB As Workbook
  3. Set OBJ = CreateObject("Scripting.FileSystemObject")
  4. Set xD = CreateObject("Scripting.Dictionary")
  5. Urr = Array(ThisWorkbook.Path)
  6.  
  7. RE_GET:
  8. For Each U In Urr
  9.   xFile = U & "\" & [A1].Value  '檔案夾路徑+A1檔名.副檔名
  10.   If Dir(xFile) <> "" Then Set xB = Workbooks.Open(xFile): Exit Sub  '找到檔案,開啟並跳出
  11.  
  12.   Set GF = OBJ.GetFolder(U).SubFolders   '取得本層子資夾
  13.   If GF.Count > 0 Then     
  14.     For Each G In GF: K = K + 1: xD(K) = G.Path: Next  '將子資料夾納入字典檔
  15.   End If
  16. Next
  17.  
  18. If K > 0 Then Urr = xD.items: xD.RemoveAll: K = 0: GoTo RE_GET '若字典檔有內容,再去找檔案
  19. MsgBox "找不到目標檔案! "
  20. End Sub
複製代碼
 
作者: Joforn    時間: 2015-9-10 13:24

回復 7# ui123
  1. '使用FSO搜索文件或是文件夹
  2. Public Function FSOFileSearch(Optional ByVal SearchPath As String, _
  3.          Optional ByVal objFolder As Object = Nothing, _
  4.          Optional ByVal SearchName As String = vbNullString, _
  5.          Optional ByVal SearchSub As Boolean = True, _
  6.          Optional ByVal SearchType As Long = 1) As Collection
  7.         Dim FSO       As Object
  8.         Dim Filter()  As String
  9.         Dim subSearch As Collection
  10.         Dim I As Long, J As Long
  11.         Dim objSub    As Object
  12.         
  13. 1       Set FSOFileSearch = New Collection
  14. 2       If objFolder Is Nothing Then
  15. 3         If Len(SearchPath) = 0 Then Exit Function
  16. 4         Set FSO = CreateObject("Scripting.FileSystemObject")
  17. 5         Set objFolder = FSO.GetFolder(SearchPath)
  18. 6         Set FSO = Nothing
  19. 7         If objFolder Is Nothing Then Exit Function
  20. 8       End If
  21.         
  22. 9       If Len(SearchName) < 1 Then SearchName = "*.*|*"
  23. 10      Filter = Split(Replace(SearchName, "|", vbNullChar), vbNullChar)
  24. 11      If Len(SearchPath) Then
  25. 12        For I = 0 To UBound(Filter)
  26. 13          Filter(I) = LCase$(Trim$(Filter(I)))
  27. 14          If Len(Filter(I)) = 0 Then
  28. 15            If I = UBound(Filter) Then Exit For
  29. 16            For J = I + 1 To UBound(Filter)
  30. 17              If Len(Filter(J)) Then
  31. 18                Filter(I) = Filter(J)
  32. 19                Filter(J) = vbNullString
  33. 20                I = J - 1
  34. 21                Exit For
  35. 22              End If
  36. 23            Next J
  37. 24            If J > UBound(Filter) Then Exit For
  38. 25          End If
  39. 26        Next I
  40. 27        ReDim Preserve Filter(I - 1)
  41. 28        SearchName = Join(Filter, vbNullChar)
  42. 29      End If
  43.         
  44. 30      If SearchType And 1& Then
  45. 31        For Each objSub In objFolder.Files
  46. 32          With objSub
  47. 33            For I = 0 To UBound(Filter)
  48. 34              If LCase(.Name) Like Filter(I) Then
  49. 35                FSOFileSearch.Add .Path
  50. 36                Exit For
  51. 37              End If
  52. 38            Next I
  53. 39          End With
  54. 40        Next objSub
  55. 41      End If
  56.         
  57. 42      If SearchType And 2& Then
  58. 43        For Each objSub In objFolder.SubFolders
  59. 44          With objSub
  60. 45            For I = 0 To UBound(Filter)
  61. 46              If LCase(.Name) Like Filter(I) Then
  62. 47                FSOFileSearch.Add .Path
  63. 48                Exit For
  64. 49              End If
  65. 50            Next I
  66. 51          End With
  67. 52        Next objSub
  68. 53      End If
  69.         
  70. 54      If SearchSub Then
  71. 55        For Each objSub In objFolder.SubFolders
  72. 56          DoEvents
  73. 57          Set subSearch = FSOFileSearch(, objSub, SearchName, SearchSub, SearchType)
  74. 58          With subSearch
  75. 59            For J = 1 To .Count
  76. 60              FSOFileSearch.Add .Item(J)
  77. 61            Next J
  78. 62          End With
  79. 63          Set subSearch = Nothing
  80. 64        Next objSub
  81. 65      End If
  82. End Function

  83. Sub TestSearch()
  84.   Dim I       As Long
  85.   Dim Search  As Collection

  86.   Set Search = FSOFileSearch(ThisWorkbook.Path, , [A1], True, 1)
  87.   For I = 1 To Search.Count
  88.     Workbooks.Open Search(I)
  89.   Next I
  90. End Sub
複製代碼
要注意的是如果A1单元格中的内容包含匹配字符,将会被如期使用,比如A1中输入*.*|*将会搜索出指定路径中的所有文件,*.XLS[XM]则表示搜索后缀为.XLSX及.XLSM文件(与*.XLSX|*.XLSM相同,|表示Or)。A1中的内容只能包含文件名,而最好不要包含目录名。
作者: ikboy    時間: 2015-9-10 15:21

其實幾天前已想請問, 查詢維一檔案的最簡單而快方法可能是 dos 的 dir/s , 但目前衹懂得先導入 txt 檔案, 如 先設定 findx ="cme.exe /c dir/s c:\file.txt > speciafyDrive:\reslt.txt", 然後引用 shell(finx), 再 open result.txt , 用instr 找"\" 確認檔案是否存在, 但這樣要先做一次寫入, 而我想問的是可否以直接將查詢資料寫入彈列中, 求知。
作者: no3-taco    時間: 2015-9-10 20:51

參考看看!簡單的FSO搜尋
  1. Sub 呼叫處() '呼叫處
  2. Dim FirstPath: FirstPath = "C:\Users\Administrator\Desktop\" '路徑....自行修改
  3.     SearchFile FirstPath
  4. End Sub

  5. Sub SearchFile(ByVal xPath As String)
  6. Dim objPath As Object, xFile As Object, xFolder As Object
  7. Set objPath = CreateObject("Scripting.FileSystemObject").getfolder(xPath)
  8. For Each xFile In objPath.Files         '該層檔案名稱集合
  9.     If xFile.Name = [a1] Then           '開啟的檔案名稱....自行修改
  10.         Workbooks.Open xFile.Path       '開啟檔案
  11.         End
  12.     End If
  13. Next
  14. For Each xFolder In objPath.SubFolders '某層子資料夾集合
  15.     SearchFile xFolder.Path
  16. Next
  17. End Sub
複製代碼

作者: 准提部林    時間: 2015-9-12 13:31

回復 16# ikboy

那個CMD的也不太懂, 試著寫, 參考看看:
http://forum.twbts.com/thread-15063-1-1.html
作者: ui123    時間: 2015-9-14 11:45

回復 8# Hsieh
今天試,各層都蒐的到了
我在研究一下....還沒發現其他問題,有問題再問您,謝謝~




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)