Board logo

標題: [發問] 複製檔案至糢糊路徑 [打印本頁]

作者: PJChen    時間: 2019-5-22 18:07     標題: 複製檔案至糢糊路徑

請問先進:

我要從來源路徑W:\私\範例\理貨單\
複製裡面的所有含有檔名"5月"的excel檔
到目的路徑含有今天日期例:20190522,但資料夾的檔名沒有一定,只有當天日期是固定的
當我把檔名/路徑寫死,沒有*時可以複製,但因為檔名及最後一層目的資料夾名稱,不是固定的,請問要如何修改以下程式?
  1. Sub autocopy()

  2. Dim fso As Object, souf$, desf$
  3. Set fso = CreateObject("Scripting.FilesyStemObject") '定義fso為物件
  4. souf = "W:\私\範例\理貨單\*5月*.xlsx"
  5. desf = "R:\Downloads.4T.Films\暫存\"  & "*" & Format(Date, "YYYYMMDD") & "*\" '目的資料夾
  6. fso.CopyFile souf, desf
  7. Set fso = Nothing
  8. End Sub
複製代碼

作者: GBKEE    時間: 2019-5-23 10:30

回復 1# PJChen

試試看
  1. Option Explicit
  2. Dim sf As Object
  3. Sub Ex()
  4.     Set sf = CreateObject("Scripting.FileSystemObject")
  5.     Ex_SubFolder "W:\私\範例\理貨單\"   '**呼叫程式 參數為 指定的資料夾"
  6. End Sub
  7. Sub Ex_SubFolder(xFolder As String)    '**參數為文字
  8.    Dim xSub As Object, E As Variant
  9.     Set xSub = sf.GetFolder(xFolder).SubFolders
  10.     '**SubFolders : 傳回包含所有資料夾的一個 Folders 集合物件
  11.     For Each E In xSub
  12.         Ex_xFiles E     '**呼叫程式 傳遞參數 Folder 物件
  13.         '**傳遞下一層的資料夾***
  14.         Ex_SubFolder E.Path       '**呼叫程式 傳遞參數 SubFolders 集合物件
  15.     Next
  16. End Sub
  17. Sub Ex_xFiles(xF As Variant)       '**參數為文字
  18.     Dim E As Variant
  19.     For Each E In xF.FILES         '**Files 集合物件 : 資料夾內的所有 File 物件的集合物件
  20.         Debug.Print E.SHORTPATH       '** E.SHORTPATH : 檔案的完整路徑名稱
  21.         '**在這裡套入你所需的程式碼
  22.         
  23.         '************
  24.     Next
  25. End Sub
複製代碼

作者: PJChen    時間: 2019-5-26 21:29

回復 2# GBKEE

G大好,
我在測試時,加入了我需要的路徑,但一直無法執行,出現"引數不為選擇性",我無法理解是什麼樣的錯誤,可否指導?
另外我在複製到指定資料夾後"W:\0_自訂表單\Backup\倉儲共用" & "*" & Format(Date, "YYYYMMDD") & "*\" '目的資料夾
想使原檔名加上當月月份,但因為每月月份都會變動,請問要怎麼寫,它才會在原檔後面加上會變動的月份?
  1. Option Explicit
  2. Dim sf As Object
  3. Sub 群組copy()
  4.     Set sf = CreateObject("Scripting.FileSystemObject")
  5.     群組copy_SubFolder = "W:\蘆竹共用\倉儲共用\1_理貨.庫存\1.日班理貨換算表\*5月.xlsx"   '**呼叫程式 參數為 指定的資料夾"
  6. End Sub
  7. Sub 群組copy_SubFolder(xFolder As String)    '**參數為文字
  8.    Dim xSub As Object, E As Variant
  9.     Set xSub = sf.GetFolder(xFolder).SubFolders
  10.     '**SubFolders : 傳回包含所有資料夾的一個 Folders 集合物件
  11.     For Each E In xSub
  12.         群組copy_xFiles E     '**呼叫程式 傳遞參數 Folder 物件
  13.         '**傳遞下一層的資料夾***
  14.         群組copy_SubFolder E.Path       '**呼叫程式 傳遞參數 SubFolders 集合物件
  15.     Next
  16. End Sub
  17. Sub 群組copy_xFiles(xF As Variant)       '**參數為文字
  18.     Dim E As Variant
  19.     For Each E In xF.Files         '**Files 集合物件 : 資料夾內的所有 File 物件的集合物件
  20.         Debug.Print E.SHORTPATH = "W:\0_自訂表單\Backup\倉儲共用" & "*" & Format(Date, "YYYYMMDD") & "*\" '目的資料夾       '** E.SHORTPATH : 檔案的完整路徑名稱
  21.         '**在這裡套入你所需的程式碼
  22.         
  23.         '************
  24.     Next
  25. End Sub
複製代碼

作者: GBKEE    時間: 2019-5-27 09:08

本帖最後由 GBKEE 於 2019-5-28 07:24 編輯

回復 3# PJChen
  1. Option Explicit
  2. Dim sf As Object
  3. Sub Ex()
  4.     Set sf = CreateObject("Scripting.FileSystemObject")
  5.     ' ***  為 指定檔案的資料夾目錄 , 不要包含檔案名稱  ****
  6.     Ex_SubFolder "e:\excel"
  7.     ' ***  為 指定檔案的資料夾目錄 , 不要包含檔案名稱  ****
  8. End Sub
  9. Sub Ex_SubFolder(xFolder As String)    '**參數為文字 為 指定檔案的資料夾目錄
  10.    Dim xSub As Object, E As Variant
  11.     Set xSub = sf.GetFolder(xFolder)
  12.     Ex_xFiles xSub.Files
  13.     For Each E In xSub.SubFolders
  14.         Ex_xFiles E.Files      '**呼叫程式 傳遞參數 Files 物件
  15.         '**傳遞下一層的資料夾***
  16.         Ex_SubFolder E.Path       '**呼叫程式 傳遞參數 SubFolders 集合物件
  17.     Next
  18. End Sub
  19. Sub Ex_xFiles(xF As Variant)       '**參數為文字
  20.     Dim E As Variant
  21.     For Each E In xF '.Files         '**Files 集合物件 : 資料夾內的所有 File 物件的集合物件
  22.         Debug.Print E.SHORTPATH      '** E.SHORTPATH : 檔案的完整路徑名稱
  23.     Next
  24. End Sub[code]Option Explicit
  25. Sub Ex()
  26.     Dim a
  27.     a = Format(Date, "mmdd")  '本月
  28.     Debug.Print a
  29.     a = Format(DateAdd("m", -1, Date), "mmdd")  '上一個月
  30.     Debug.Print a

  31. End Sub
複製代碼

作者: PJChen    時間: 2019-5-27 17:50

回復 4# GBKEE

G大,
不好意思,因為我看過的程式碼實在不多,也第一次看到這種寫法,讓我不知如何套入我需要的程式,已經多次嘗試各種組合,但沒有一次可以run完這個程式,它使終都卡在路徑這一關,就無法執行了,可以勞煩G幫忙看下嗎?
  1. Option Explicit
  2. Dim sf As Object
  3. Sub Ex()
  4.     Set sf = CreateObject("Scripting.FileSystemObject")
  5.     Ex_SubFolder "W:\蘆竹共用\倉儲共用\1_理貨.庫存\1.日班理貨換算表\*5月*.xlsx"   '**呼叫程式 參數為 指定的資料夾
  6. End Sub
  7. Sub Ex_SubFolder(xFolder As String)    '**參數為文字
  8.    Dim xSub As Object, E As Variant
  9.     Set xSub = sf.GetFolder(xFolder).SubFolders
  10.    xSub "W:\蘆竹共用\倉儲共用\1_理貨.庫存\1.日班理貨換算表\*5月*.xlsx"
  11.     '**SubFolders : 傳回包含所有資料夾的一個 Folders 集合物件
  12.     For Each E In xSub
  13.         Ex_xFiles E     '**呼叫程式 傳遞參數 Folder 物件
  14.         '**傳遞下一層的資料夾***
  15.         Ex_SubFolder E.Path       '**呼叫程式 傳遞參數 SubFolders 集合物件
  16.     Next
  17. End Sub
  18. Sub Ex_xFiles(xF As Variant)       '**參數為文字
  19.     Dim E As Variant
  20.     Dim a

  21.     a = Format(Date, "yyyymmdd")  '當日
  22.     Debug.Print a
  23.     For Each E In xF.Files         '**Files 集合物件 : 資料夾內的所有 File 物件的集合物件
  24.         Debug.Print E.SHORTPATH = "W:\0_自訂表單\Backup\" & "*" & a & "*\"    '** E.SHORTPATH : 檔案的完整路徑名稱
  25.         '**在這裡套入你所需的程式碼
  26. sf.CopyFile SubFolders, xFiles
  27. Set sf = Nothing

  28.         '************
  29.     Next
  30. End Sub
複製代碼
另外原先的這個程式,對我來說其實是比較淺顯易懂的,可否也同時請教:
1. 這個程式的路徑用固定式的寫法,可以非常快速的copy檔案到指定路徑
2. 當目的路徑為年月日為變動資料夾時,卻無法copy
3. 請問這個寫法還有救嗎?可以稍加修改目的資料夾為年月日變動式的嗎?
4. 我一次想備份多個來源不同的資料夾,到多個不同目的資料夾,是否可以共用Dim fso As Object, souf$, desf$, P$, a的宣告?這樣程式會混淆而無法複製資料嗎?
  1. Sub autocopy()
  2. Dim fso As Object, souf$, desf$, P$, a
  3.     a = Format(Date, "yyyymmdd")  '本月當日
  4.     Debug.Print a
  5.     Path = "W:\0_自訂表單\Backup\"
  6.     P = Path & "*" & a & "*" & "\" '目的路徑為年月日為變動資料夾時,無法copy
  7.     Set fso = CreateObject("Scripting.FilesyStemObject") '定義fso為物件
  8.     souf = "W:\蘆竹共用\倉儲共用\1_理貨.庫存\1.日班理貨換算表\*5月*.xlsx"
  9.     desf = P '目的路徑為年月日為變動資料夾時,無法copy
  10. fso.CopyFile souf, desf
  11. Set fso = Nothing
  12. End Sub
複製代碼

作者: GBKEE    時間: 2019-5-28 12:11

回復 5# PJChen
是這樣嗎.
  1. Option Explicit
  2. Dim sf As Object, a As String, souf As String
  3. Sub Ex()
  4.     souf = "W:\蘆竹共用\倉儲共用\1_理貨.庫存\1.日班理貨換算表\*5月*.xlsx"  '**指定的*檔案
  5.     a = "*" & Format(Date, "yyyymmdd") & "*"          '本月當日
  6.     Set sf = CreateObject("Scripting.FileSystemObject")
  7.     Ex_SubFolder "W:\0_自訂表單\Backup\"
  8.     ' ***  W:\0_自訂表單\Backup資料夾目錄 ,下搜尋所有的子目錄 ****
  9. End Sub
  10. Sub Ex_SubFolder(xFolder As String)    '**參數為文字 為 指定檔案的資料夾目錄
  11.    Dim xSub As Object, E As Variant
  12.     Set xSub = sf.GetFolder(xFolder)   'xSub 傳回一個資料夾物件
  13.     For Each E In xSub.SubFolders   '** E 一一傳回 xSub.下的子資料夾目錄
  14.          Debug.Print E.Path
  15.          If E.Path Like a Then           '**子資料夾 包含本月當日
  16.             '**複製souf的指定檔案到, E.Path資料夾.   對嗎!  對嗎! ****"
  17.             sf.copyFile souf, E.Path
  18.             '*********************************************************
  19.         End If
  20.         '**傳遞下一層的資料夾***
  21.         Ex_SubFolder E.Path       '**呼叫程式 傳遞參數  下一個資料夾目錄
  22.     Next
  23. End Sub
複製代碼

作者: PJChen    時間: 2019-5-28 15:41

回復 6# GBKEE

G大好,

單一資料夾的複製檔案已經沒問題了,想請問複製多對多路徑時,
例如以下的路徑對應,我該如何把以下對應的路徑套到程式中?
目的路徑,有日期的那一個資料夾,只有當天日期是已知的,其餘的字會變動,只能用"*"    [attach]30699[/attach]

來源路徑.....所有包含"*5月*.xlsx"...的檔案        目的路徑
W:\蘆竹共用\倉儲共用\1_理貨.庫存\佳乳        D:\0_自訂表單\Backup\倉儲共用 20190528\佳乳
W:\蘆竹共用\倉儲共用\1_理貨.庫存\1.日班理貨換算表        D:\0_自訂表單\Backup\倉儲共用 20190528\1.日班理貨換算表
W:\蘆竹共用\倉儲共用\1_理貨.庫存\2.全台理貨換算表        D:\0_自訂表單\Backup\倉儲共用 20190528\2.全台理貨換算表
W:\蘆竹共用\倉儲共用\1_理貨.庫存\比菲多        D:\0_自訂表單\Backup\倉儲共用 20190528\比菲多
W:\蘆竹共用\倉儲共用\倉儲共用\1_理貨.庫存\比菲多\108年比菲多\過允收蘆竹所轉經銷        D:\0_自訂表單\Backup\倉儲共用 20190528\比菲多\過允收蘆竹所轉經銷
作者: GBKEE    時間: 2019-5-29 14:10

回復 7# PJChen

多個來源路徑.....所有包含"*5月*.xlsx"...的檔案到複製多個目的路徑
,多個目的路徑有包含1.日班理貨換算表 一樣要複製到嗎?

B6為指定資料夾 (1.日班理貨換算表) ,裡面有很多檔案,我只放2個測試,每個檔案都做相同的動作
這相同的動作 也包含這複製後的*5月*.xlsx"...檔案 嗎?
只放2個測試 : 特定的檔案或是所有檔案
作者: PJChen    時間: 2019-5-29 20:10

回復 8# GBKEE

1. 每個來源路徑 及 目的路徑的資料夾,都只對應各自的檔案,不能有下搜功能,否則所有備份的檔案會整個大亂
2. 每個來源及目的各有各的對應,複製的檔案也都不相同,無法一一列舉
3. 目的路徑有年月日資料夾內的名稱,不能寫死,因為每天都會變動
4. 複製的檔案,可以自行修改需要的名稱,如: "*5月*.xlsx"  和 "*.xlsx",這樣就完美了.

來源路徑                                                                                           目的路徑
W:\蘆竹共用\倉儲共用\1_理貨.庫存\佳乳                                D:\0_自訂表單\Backup\倉儲共用 20190528\佳乳..........來源檔案名稱沒有共通性,只能用"*.xlsx"
W:\蘆竹共用\倉儲共用\1_理貨.庫存\1.日班理貨換算表        D:\0_自訂表單\Backup\倉儲共用 20190528\1.日班理貨換算表..........來源檔案名稱"*5月*.xlsx"
W:\蘆竹共用\倉儲共用\1_理貨.庫存\2.全台理貨換算表        D:\0_自訂表單\Backup\倉儲共用 20190528\2.全台理貨換算表..........來源檔案名稱"*5月*.xlsx"
W:\蘆竹共用\倉儲共用\1_理貨.庫存\比菲多                            D:\0_自訂表單\Backup\倉儲共用 20190528\比菲多..........來源檔案名稱沒有共通性,只能用"*.xlsx"
W:\蘆竹共用\倉儲共用\倉儲共用\1_理貨.庫存\比菲多\108年比菲多\過允收蘆竹所轉經銷        D:\0_自訂表單\Backup\倉儲共用 20190528\比菲多\過允收蘆竹所轉經銷..........來源檔案名稱"*5月*.xlsx"
作者: GBKEE    時間: 2019-5-30 09:19

本帖最後由 GBKEE 於 2019-5-30 09:20 編輯

回復 9# PJChen

W:\蘆竹共用\倉儲共用\倉儲共用\1_理貨.庫存\比菲多\108年比菲多\過允收蘆竹所轉經銷        D:\0_自訂表單\Backup\倉儲共用 20190528\比菲多\過允收蘆竹所轉經銷..........來源檔案名稱"*5月*.xlsx"
沒有 \儲共用 20190528 這共通性須單獨處理

來源路徑    W:\蘆竹共用\倉儲共用\1_理貨.庫存\  只搜尋 這目錄的下一層子目錄
然後比對 目的路徑 D:\0_自訂表單\Backup\倉儲共用 20190528\  這有倉儲共用且有當日日期的資料夾
來源路徑 如 子目錄 \.日班理貨換算表 含(理貨換算表)  複製"*5月*.xlsx"    到 D:\0_自訂表單\Backup\倉儲共用 20190528\日班理貨換算表
來源路徑 如 子目錄 \.佳乳                  不含(理貨換算表)  複製"*.*.xlsx"        到 D:\0_自訂表單\Backup\倉儲共用 20190528\.佳乳

是這樣嗎?
作者: PJChen    時間: 2019-5-30 19:18

回復 10# GBKEE

G大,

您說的沒錯,我也把它表格化了,不知這樣是否能看得更明瞭... [attach]30731[/attach]
作者: GBKEE    時間: 2019-5-31 05:25

本帖最後由 GBKEE 於 2019-5-31 05:26 編輯

回復 11# PJChen
試試看
  1. Option Explicit
  2. Sub EX()
  3.     Dim SF As Object, Source_Folder As String, Target_Folder As String
  4.     Dim Source_File As String, E As Variant, E1 As Variant
  5.     Source_Folder = "W:\蘆竹共用\倉儲共用"
  6.     Target_Folder = "D:\0_自訂表單\Backup\倉儲共用 " & Format(Date, "YYYYMMDD")
  7.     If Dir(Target_Folder, vbDirectory) <> "" Then      '傳回這資料夾目錄
  8.         Set SF = CreateObject("Scripting.FileSystemObject")
  9.         For Each E In SF.GetFolder(Source_Folder)
  10.             For Each E1 In SF.GetFolder(Target_Folder)
  11.                 Source_File = E.Path & "\*.xlsx"
  12.                 If E.Path Like "*班理貨換算表" And E1.Path Like "*班理貨換算表" Then
  13.                     Source_File = E1.Path & "\*" & Format(Date, "M") & "月*.xlsx"
  14.                 End If
  15.                 SF.CopyFile Source_File, E1.Path
  16.             Next
  17.         Next
  18.     Else
  19.         MsgBox "找步到 " & vbLf & Target_Folder
  20.     End If
  21. End Sub
複製代碼





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