Board logo

標題: [發問] 如何用按鈕複製檔案?(已解決) [打印本頁]

作者: iceandy6150    時間: 2012-3-4 21:37     標題: 如何用按鈕複製檔案?(已解決)

本帖最後由 iceandy6150 於 2012-3-5 22:51 編輯

各位大大好

我有一個檔案,麻辣家族1日.xls,裡面sheet1我放了一個按鈕

希望按下去後,能自動複製自己,並更名為 : 麻辣家族2日.xls

然後此新複製出來的檔案會和原本的檔案放在同一資料夾裡面

(假設原本的檔案在c:\test)


又.....如果此按鈕是放在同資料夾,但另外一個 A.xls裡面,寫法一樣嗎?

謝謝
作者: Hsieh    時間: 2012-3-4 22:55

回復 1# iceandy6150
複製檔案最重要是檔名問題
如果以第一例中文名稱+數值作為檔名
可計算同名稱檔案數量後加上號碼做為新檔案名稱
  1. Private Sub CommandButton1_Click()
  2. With ThisWorkbook
  3. f = Replace(Replace(.Name, StrReverse(Val(StrReverse(Replace(.Name, ".xls", "")))), ""), ".xls", "")
  4. fs = Dir(f & "*.xls")
  5. Do Until fs = ""
  6. fs = Dir
  7. i = i + 1
  8. Loop
  9. f = .Path & "\" & f & i + 1 & ".xls"
  10. .SaveCopyAs f
  11. End With
  12. End Sub
複製代碼
若執行巨集的檔名與另存的檔案名稱沒有任何規則,可能就要指定檔名再去計算同名不同編號的檔案數量
在另存新檔
作者: iceandy6150    時間: 2012-3-4 23:33

本帖最後由 iceandy6150 於 2012-3-4 23:38 編輯

回復 2# Hsieh


    Private Sub CommandButton1_Click()
With ThisWorkbook
f = Replace(Replace(.Name, StrReverse(Val(StrReverse(Replace(.Name, ".xls", "")))), ""), ".xls", "")
                                                '大大,上面這一步驟是??用好多層喔。發現抓到的是   f=麻辣1日
fs = Dir(f & "*.xls")
Do Until fs = ""
fs = Dir
i = i + 1
Loop
f = .Path & "\" & f & i + 1 & ".xls"           '這一步,f=麻辣1日1.xls
.SaveCopyAs f
End With
End Sub

我完整的功能是想要
每月會有一資料夾,資料夾裡面只有 [麻辣1日.xls] 本身
麻辣1日.xls是當範本,裡面東西改好,按下按鈕後
會複製自己,然後產生麻辣2日.xls,麻辣3日.xls......麻辣31日.xls
(我需要2~31日的內容、功能通通跟1日一樣,手動複製貼上要30次,所以想寫程式)

這邊想法如下
i=2 to 31
複製 麻辣1日.xls
更名為  "麻辣" & cstr(i) & "日.xls"
next i

另外是防呆
1日裡面的按鈕會產生2日~31日
2日~31日的檔案是複製1日的,所以任何一日不小心按到的話,會再產生一次2日~31日
若能偵測檔案(2日~31日)已存在就不再執行,那就很完美了


可是我不知道怎麼寫,或是怎麼利用大大的去改
再麻煩一下囉,謝謝
作者: Hsieh    時間: 2012-3-5 01:07

回復 3# iceandy6150
試試看
  1. Private Sub CommandButton1_Click()
  2. On Error Resume Next
  3. ph = ThisWorkbook.Path & "\"
  4. f = ThisWorkbook.Name
  5. i = 1
  6. Do Until i > Len(f) Or Not IsEmpty(n)
  7. n = Empty
  8.    n = CInt(Mid(f, i, 1))
  9.    If IsEmpty(n) Then k = k & Mid(f, i, 1)
  10.    Err.Clear
  11.    i = i + 1
  12. Loop
  13. fs = Dir(ph & k & "*.xls")
  14. Do Until fs = "" '計算同名檔案數量
  15. fs = Dir
  16. x = x + 1
  17. Loop
  18. fs = ph & k & x + 1 & "日.xls"
  19. ThisWorkbook.SaveCopyAs fs
  20. End Sub
複製代碼

作者: iceandy6150    時間: 2012-3-5 15:33

回復 4# Hsieh


    前輩你好
<問題一>
您的程式按下去後,原有麻辣1日.xls不動,會新增麻辣2日.xls
再按一次,會新增3日
可是我想要按下去後會直接新增  麻辣2日.xls~麻辣31日.xls

於是我做了小測試,在您程式最前加了 for j =2 to 5  最後加 Next j  (先用5次試試看)
結果跑出來是 1日(原有的)  2日  4日  7日  11日
請問該怎麼改呢?

<問題二>
防呆
1日裡面的按鈕會產生2日~31日
2日~31日的檔案是複製1日的,所以任何一日不小心按到的話,會再產生一次2日~31日
若能偵測檔案(2日~31日)已存在就不再執行
請問該怎麼做呢?

謝謝
作者: Hsieh    時間: 2012-3-5 17:45

回復 5# iceandy6150
  1. Private Sub CommandButton1_Click()
  2. On Error Resume Next
  3. ph = ThisWorkbook.Path & "\"
  4. f = ThisWorkbook.Name
  5. i = 1
  6. Do Until i > Len(f) Or Not IsEmpty(n)
  7. n = Empty
  8.    n = CInt(Mid(f, i, 1))
  9.    If IsEmpty(n) Then k = k & Mid(f, i, 1)
  10.    Err.Clear
  11.    i = i + 1
  12. Loop
  13. p = Day(DateAdd("M", 1, Format(Date, "yyyy/m/1")) - 1)
  14. For j = 2 To p
  15. fs = ph & k & j & "日.xls"
  16. If Dir(fs) = "" Then ThisWorkbook.SaveCopyAs fs
  17. Next
  18. End Sub
複製代碼

作者: iceandy6150    時間: 2012-3-5 18:19

回復 6# Hsieh


   感謝超級版主~~可以用了
以下是我對這個程式的瞭解
有不對或不懂的地方,可以請超級版主講解一下,感謝你!

Private Sub CommandButton1_Click()
On Error Resume Next
ph = ThisWorkbook.Path & "\"                  '是抽取檔案的路徑 + \
f = ThisWorkbook.Name                             '是抽取檔案的名稱

i = 1
Do Until i > Len(f) Or Not IsEmpty(n)
n = Empty
   n = CInt(Mid(f, i, 1))
   If IsEmpty(n) Then k = k & Mid(f, i, 1)
   Err.Clear
   i = i + 1
Loop                                                                '這個loop是針對檔名做處理

p = Day(DateAdd("M", 1, Format(Date, "yyyy/m/1")) - 1)
                                                                          '這個P是?????
For j = 2 To p                                               '菜鳥如我,只會用 j = 2 to 31    為什麼用P呢
fs = ph & k & j & "日.xls"                           '設定檔名
If Dir(fs) = "" Then ThisWorkbook.SaveCopyAs fs            '做防呆,沒有同檔名的話就新增,有同檔名就不新增以免覆蓋
Next
End Sub
作者: Hsieh    時間: 2012-3-5 19:03

回復 7# iceandy6150
Day(DateAdd("M", 1, Format(Date, "yyyy/m/1")) - 1)
這可取得這個月的日數
DateAdd("M", 1, Format(Date, "yyyy/m/1")) 得到下個月第一天日期
所以減1就是本月最後一天
作者: iceandy6150    時間: 2012-3-5 22:50

回復 8# Hsieh


    感謝超級版主的講解,又讓小弟學習了不少

    感謝再感謝!




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