Board logo

標題: [發問] FileCopy 同名檔案不覆蓋 [打印本頁]

作者: li_hsien    時間: 2014-9-11 12:02     標題: FileCopy 同名檔案不覆蓋

我要抓某個資料夾(A)底下所有資料夾(b、c、d、、、)裡面的excel檔

下方程式碼是在GOOGLE搜尋而得的

好像是版大早期的解說XDD

因為很實用就拿來應用了


但是我發現碰到檔名一樣的excel檔

COPY過去會覆蓋掉  造成檔案有缺漏

能否修改即使檔名一樣  都存在 而不要附蓋過去
  1. 'Option Explicit

  2. Sub SF_collection_Click()

  3.     t = Time
  4.    
  5.     Set fs = CreateObject("Scripting.FileSystemObject")
  6.     Set sf = fs.GetFolder("路徑*****").SubFolders
  7.    
  8.     For Each f In sf
  9.   
  10.         With Application.FileSearch
  11.         .FileType = msoFileTypeExcelWorkbooks
  12.         .LookIn = f
  13.         .Execute
  14.         
  15.         For i = 1 To .FoundFiles.Count
  16.             myfile = Replace(.FoundFiles(i), .LookIn, "")
  17.             FileCopy .FoundFiles(i), "路徑*****" & myfile
  18.         Next
  19.    
  20.         End With
  21.    
  22.     Next
  23.    
  24.     Debug.Print "經過時間: " & DateDiff("n", t, Time) & "分"
  25.   
  26. End Sub
複製代碼
謝謝~~~
作者: bobomi    時間: 2014-9-11 15:25

if FileLen( "路徑*****" & myfile ) = 0 then
FileCopy.FoundFiles(i), "路徑*****" & myfile
end if
作者: li_hsien    時間: 2014-9-11 15:58

回復 2# bobomi

謝謝bobomi回覆

請問這個寫法是指如果檔案不存在才執行FileCopy的動作嗎???
作者: GBKEE    時間: 2014-9-11 16:28

回復 1# li_hsien
試試看
  1. Option Explicit
  2. Sub SF_collection_Click()
  3.     Dim 目的目錄  As String, 搜尋目錄 As String, T As Date, Fs As Object, Sf As Object, f As Object
  4.     Dim i As Integer, 檔名 As String, 副檔名 As String, 檔名_計數 As Integer, MyDir As String
  5.     目的目錄 = "D:\"
  6.     搜尋目錄 = "C:\test"
  7.     T = Time
  8.     Set Fs = CreateObject("Scripting.FileSystemObject")
  9.     Set Sf = Fs.GetFolder(搜尋目錄).SubFolders
  10.     For Each f In Sf
  11.         With Application.FileSearch
  12.             .FileType = msoFileTypeExcelWorkbooks
  13.             .LookIn = f             '傳回大寫的資料夾名稱
  14.             .Filename = "*.*"
  15.             .Execute
  16.             For i = 1 To .FoundFiles.Count
  17.                 檔名 = Fs.GetBaseName(.FoundFiles(i))
  18.                 副檔名 = Fs.GetExtensionName(.FoundFiles(i))
  19.                 檔名_計數 = 0
  20.                 MyDir = Dir(目的目錄 & 檔名 & "*." & 副檔名, vbDirectory)
  21.                 Do While MyDir <> ""
  22.                     檔名_計數 = 檔名_計數 + 1
  23.                     MyDir = Dir
  24.                 Loop
  25.                 If 檔名_計數 > 0 Then
  26.                     檔名 = 目的目錄 & 檔名 & "(" & 檔名_計數 & ")." & 副檔名
  27.                 Else
  28.                     檔名 = 目的目錄 & 檔名 & "." & 副檔名
  29.                 End If
  30.                 FileCopy .FoundFiles(i), 檔名
  31.             Next
  32.         End With
  33.     Next
  34.     Debug.Print "經過時間: " & DateDiff("n", T, Time) & "分"
  35. End Sub
複製代碼

作者: bobomi    時間: 2014-9-11 17:24

回復  bobomi

謝謝bobomi回覆

請問這個寫法是指如果檔案不存在才執行FileCopy的動作嗎???
li_hsien 發表於 2014-9-11 15:58



這樣就可以了

On Error Resume Next
If FileLen("路徑*****" & myfile) = 0 Then
On Error GoTo 0
FileCopy.FoundFiles (i), "路徑*****" & myfile
End If
作者: bobomi    時間: 2014-9-11 17:30

or

If Dir("路徑*****" & myfile) = "" Then
FileCopy.FoundFiles (i), "路徑*****" & myfile
End If
作者: li_hsien    時間: 2014-9-12 08:29

回復 6# bobomi
     
     謝謝bobomi的回覆!!!


     測試起來檔案還是不能併存
   
     我用了10個檔案測試,其中有2個同檔名

     彙整起來所要的結果應該是10個都有

     但結果只有9個

  
     我不是很清楚FileLen的用法

     但是就我目前理解,看bobomi您的寫法應該是如果檔案不存在才執行吧???


     TKS~
作者: bobomi    時間: 2014-9-12 09:48

那你就用 Dir

我猜到你用 FileLen 為何不行了
你的 EXCEL 檔是 csv 對嗎
我一直幻想著是你的是 xls 檔
xls 檔用FileLen 就可以
csv 檔用FileLen 就有機會出錯 ( 例如 空的 csv 檔)
作者: li_hsien    時間: 2014-9-12 18:29

回復 8# bobomi

謝謝bobomi協助

不過我的確實是.xls檔

而且我兩個方法都試過了@@

還是不能將同名的檔案保留下來
作者: li_hsien    時間: 2014-9-12 18:30

回復 4# GBKEE

謝謝GBKEE版大

確實可行!!!

太神了!!!

感謝




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