Board logo

標題: [發問] 存檔時,自動加入存檔時的日期 [打印本頁]

作者: downling    時間: 2011-11-3 14:17     標題: 存檔時,自動加入存檔時的日期

請教各位高手
之前小弟在舊論壇找到一篇資料
http://gb.twbts.com/index.php?topic=660.msg2935#msg2935
  1. Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  2. Cancel = True
  3. Me.Save
  4. Me.SaveCopyAs Me.Path & "\" Replace(Me.Name,".xls",Format(Date,"emmdd") & ".xls")
  5. End Sub
複製代碼
但是現在不能用了
出現必須是陳述結尾的錯誤
請問是replace的用法有改嗎?

小弟是用2007版
作者: Hsieh    時間: 2011-11-3 14:56

本帖最後由 Hsieh 於 2011-11-3 14:59 編輯

回復 1# downling
少了一個&
Me.SaveCopyAs Me.Path & "\" & Replace(Me.Name, ".xls", Format(Date, "emmdd") & ".xls")

用FULLNAME會清楚點
Me.SaveCopyAs Replace(Me.FullName, ".xls", Format(Date, "emmdd") & ".xls")
作者: downling    時間: 2011-11-4 11:06

感謝Hsieh版大
可以用了
作者: downling    時間: 2011-11-9 17:49

回復 2# Hsieh

我想再問一下
之前的vba必需為一帶巨集的xlsm檔才能使用

若是用一般的xls檔的vba要如何寫呢?
作者: Hsieh    時間: 2011-11-9 18:01

回復 4# downling
那只是版本問題
這語法2003版適用
作者: downling    時間: 2011-11-10 08:51

回復 5# Hsieh

Hsieh 版大您誤會了

上面的程式2007是可以使用的
但是檔案必需為一個帶巨集的檔案也就是副檔名為xlsm

現在小弟因工作的需要,必需常常更新不同的檔案,由於是不同人所給的,
所以想要做成一通用的巨集或VBA
讓無巨集的檔案(也就是一般的XLS檔)也能方便的加上日期

小弟有在網路上找到類似的
但是路徑是設好的
想說要怎麼修改成原來的檔案所在的資料夾
  1. Sub TD()
  2.   mypath = "C:\Documents and Settings\Administrator\桌面\"
  3.   myfile = "NN" & Format(Date, "emmdd") & ".xls"
  4.   Sheets(Array("Sheet2", "Sheet3")).Copy
  5.   ActiveWorkbook.SaveAs mypath & myfile
  6.   Workbooks(myfile).Close
  7. End Sub
複製代碼

作者: Hsieh    時間: 2011-11-10 10:01

回復 6# downling


    mypath = ThisWorkbook.Path & "\"
作者: downling    時間: 2011-11-10 11:19

剛又修改了一下
現在vba會把"你的檔名.xlsx"另存新檔為"你的檔名_yyyymmdd.xlsx"
請指教
  1. Sub TD()

  2.    myname = Application.ActiveWorkbook.FullName
  3.    Application.DisplayAlerts = False
  4.    ActiveWorkbook.SaveCopyAs Replace(myname, ".xls", "_" & Format(Date, "yyyymmdd") & ".xls")
  5.    Application.DisplayAlerts = True
  6.    
  7. End Sub
複製代碼

作者: Hsieh    時間: 2011-11-10 15:35

回復 8# downling

那你要的需求必須說明清楚阿
這只不過是字串替換問題
你的最終檔名字串要得到怎樣呢?
作者: downling    時間: 2011-11-10 16:54

回復 9# Hsieh

不好意思
讓您誤會了

小弟需要的是拿到檔案後
使用vba去修改檔名(加上或修改成今天日期)後另存新檔
ex:aaa.xlsx ---> aaa_20111110.xlsx or bbb_20111005.xlsx ---> bbb_20111110.xlsx

上面的程式應該只適用於沒有日期的檔名.....

至於上上面那個程式則是拿來參用一下他的思法而已囧
作者: oobird    時間: 2011-11-10 17:18

Sub 改名()
Name "c:\aaa.xlsx" As "c:\aaa" & "_" & Format(Date, "yyyymmdd") & ".xlsx"
End Sub
作者: downling    時間: 2011-11-11 08:34

本帖最後由 downling 於 2011-11-11 08:39 編輯

回復 11# oobird

謝謝您的回復
不過oobird 版大您這程式是只有把日期加上去而已喔

小弟拿到的檔名並沒有固定,所以還有檔案名稱跟路徑的要擷取,這部份上面小弟已經有寫出來了
加上小弟有時拿到的並非原始檔而是修改過已經加上日期的檔案
所以想問一下是不是有判斷副檔名前有沒有日期的寫法
如果沒有就加上今天日期
若有則修改成今天日期
作者: luhpro    時間: 2011-11-12 09:10

本帖最後由 luhpro 於 2011-11-12 09:12 編輯

回復 12# downling
這最好能有你實際產生出來的檔案名稱作基準才好寫程式,
在此假設你的檔案名稱不管有沒有日期檔名中都不會出現 201 這個數字(9 年後請再自己改成 202),
那麼就可以用 201 作為判斷是否檔名已有日期的依據,
有 201 就用今天日期取代 2 開始的 8 個數字,
沒有就加上日期.

當然, 如果檔名中有可能出現 201 ,
那麼寫法又會有所不同了,
這就是需要有你實際產生出來的檔案名稱作基準的原因.
作者: mike.lee    時間: 2011-11-12 22:25

回復 8# downling


   剛剛改了一下, 是這樣嗎?
  1. Sub TD()

  2.    Myname = Application.ActiveWorkbook.FullName
  3.    
  4.    Mypos = InStr(1, Myname, "_", 1)
  5.      
  6.    Application.DisplayAlerts = False
  7.      
  8.    If Mypos = 0 Then
  9.   
  10.        ActiveWorkbook.SaveCopyAs Replace(Myname, ".xls", "_" & Format(Date, "yyyymmdd") & ".xls")
  11.    
  12.    Else
  13.    
  14.      Newname = Mid(Myname, 1, Mypos - 1)
  15.      
  16.      ActiveWorkbook.SaveCopyAs Newname & "_" & Format(Date, "yyyymmdd") & ".xls"
  17.      
  18.    End If
  19.      
  20.    Application.DisplayAlerts = True
  21.    
  22. End Sub
複製代碼

作者: downling    時間: 2011-11-14 09:26

回復 13# luhpro

基本上檔名除了日期外是不會有其他的一連串數字
請問一下要用那種含數做201數字的判斷?

回復 14# mike.lee

請問mike.lee
InStr能從後面往前找嗎?
因為有些人喜觀用"_"做為空格
作者: GBKEE    時間: 2011-11-14 10:46

本帖最後由 GBKEE 於 2011-11-14 11:06 編輯

回復 15# downling
  1. Sub Ex()  'StrReverse函數 -> 傳回指定字串的字元順序是反向的。
  2.     Dim A, X
  3.     A = "A_120_78_9"
  4.     X = A Like "*120*"    '找到傳回 True 反之傳回 False
  5.     MsgBox X   
  6.    X = InStrRev(A, "_")    '由左右向左搜尋的字串運算式
  7.     MsgBox X
  8.    A = StrReverse(A)
  9.     X = InStr( A, "_")  '由左向右搜尋的字串運算式
  10.     MsgBox X
  11. End Sub
複製代碼
  1. Sub Ex()     ''InStr  ,    InStrRev  用法不同
  2.     Dim A, X, C
  3.     A = "A120_78_9"
  4.      'InStr([start, ]string1, string2[, compare])
  5.     '      start= C    string1= A     'string2="_"
  6.     C = 1                   '設定從第幾個字母開始尋找
  7.     'X = InStr(A, "_")      '沒指定C 預設為1
  8.     X = InStr(C, A, "_")  '由左向右搜尋的字串運算式
  9.     MsgBox X
  10.     'InstrRev(stringcheck, stringmatch[, start[, compare]])
  11.     '    stringcheck= A   'stringmatch="_"  Start= C
  12.     C = Len(A)                 '設定從第幾個字母開始尋找
  13.     'X = InStrRev(A, "_")      '沒指定C 預設為字串的長度 Len(A)  
  14.     X = InStrRev(A, "_", C)  '由右向左搜尋的字串運算式
  15.     MsgBox X
  16. End Sub
複製代碼

作者: luhpro    時間: 2011-11-14 19:40

回復  luhpro

基本上檔名除了日期外是不會有其他的一連串數字
請問一下要用那種含數做201數字的判斷?
...
downling 發表於 2011-11-14 09:26

把檔名放進字串變數裡,
然後參照上面的方式使用 Instr 找檔名(不含目錄)字串內有沒有 "201" 就可以了.
作者: mike.lee    時間: 2011-11-14 20:01

回復 15# downling


   感謝GBKEE 大大詳細的說明,

如果"_"非檔名內唯一字元,上面程式就無法使用,就必須如luhpro 大大所說的,
利用"201"字串,判斷是否存在?再做檔名的取捨.
作者: tsuneng    時間: 2012-8-9 11:39

謝謝各位大大的討論,是初學者的福音。




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