2015-02-22 2 views
2

Я ищу, чтобы написать макрос, чтобы сохранить текущую версию имени файла +1 экземпляр версии. Для каждого нового дня версия будет сброшена на v01. Ex. Current = DailySheet_20150221v01; Сохранить как = DailySheet_20150221v02; Следующий день = DailySheet_20150222v01VBA Сохранить как текущее имя файла +01

Увеличивая номер версии, я надеюсь, что версия не должна содержать v0, как только достигнут v10 +.

Я был в состоянии тренировки, как сохранить файл с текущей датой:

Sub CopyDailySheet() 

Dim datestr As String 

datestr = Format(Now, "yyyymmdd") 

ActiveWorkbook.SaveAs "D:\Projects\Daily Sheet\DailySheet_" & datestr & ".xlsx" 

End Sub 

но нуждаюсь в дополнительной помощи в поиске версии дополнения. Могу ли я установить SaveAs на строку, а затем запустить ее с помощью параметра For/If - Then?

+0

Является ли дата независимой от номера версии, или вы возвращаете номер версии до «1» каждый день? – Porcupine911

+0

@ Porcupine911 Да, я каждый день меняю номер версии на «1» – PlainsWind

+0

. Тогда нам нужно будет что-то вроде ответа Bukali's powershell. – Porcupine911

ответ

0

Положите это к паре моих друзей и ниже - их решение:

Sub Copy_DailySheet() 

Dim datestr As String, f As String, CurrentFileDate As String, _ 
    CurrentVersion As String, SaveAsDate As String, SaveAsVersion As String 


    f = ThisWorkbook.FullName 
    SaveAsDate = Format(Now, "yyyymmdd") 
    ary = Split(f, "_") 
    bry = Split(ary(UBound(ary)), "v") 
    cry = Split(bry(UBound(bry)), ".") 
    CurrentFileDate = bry(0) 
    CurrentVersion = cry(0) 
    SaveAsDate = Format(Now, "yyyymmdd") 

    If SaveAsDate = CurrentFileDate Then 
     SaveAsVersion = CurrentVersion + 1 
    Else 
     SaveAsVersion = 1 
    End If 

    If SaveAsVersion < 10 Then 
     ThisWorkbook.SaveAs "D:\Projects\Daily Sheet\DailySheet_" & SaveAsDate & "v0" & SaveAsVersion & ".xlsm" 
    Else 
     ThisWorkbook.SaveAs "D:\Projects\Daily Sheet\Daily Sheet_" & SaveAsDate & "v" & SaveAsVersion & ".xlsm" 
    End If 

End Sub 

Спасибо всем, кто внес вклад.

0

Если у вас есть имя текущего файла я хотел бы использовать что-то вроде:

Public Function GetNewFileName(s As String) As String 
    ary = Split(s, "v") 
    n = "0" & CStr(CLng(ary(1)) + 1) 
    GetNewFileName = ary(0) & "v" & ary(1) 
End Function 

Испытано с:

Sub MAIN() 
    strng = GetNewFileName("DailySheet_20150221v02") 
    MsgBox strng 
End Sub 
+0

Так что всегда колодки с нулем. "V010"? – shawnt00

+0

@ Студент Гэри, я хотел бы понять вашу функцию и Sub, но не понимаю, как проходит информация. Когда я запускаю это, я получаю 'MsgBox' с' DailySheet_20150221v02'. Правильно ли я размещать их в одном модуле? – PlainsWind

1

Попробуйте это:

Sub CopyDailySheet() 

'Variables declaration 
Dim path As String 
Dim sht_nm As String 
Dim datestr As String 
Dim rev As Integer 
Dim chk_fil As Boolean 
Dim ws As Object 

'Variables initialization 
path = "D:\Projects\Daily_Sheet" 
sht_nm = "DailySheet" 
datestr = Format(Now, "yyyymmdd") 
rev = 0 

'Create new Windows Shell object 
Set ws = CreateObject("Wscript.Shell") 

'Check the latest existing revision number 
Do 
rev = rev + 1 
chk_fil = ws.Exec("powershell test-path " & path & "\" & sht_nm & "_" & datestr & "v" & Format(rev, "00") & ".*").StdOut.ReadLine 
Loop While chk_fil = True 

'Save File with new revision number 
ActiveWorkbook.SaveAs path & "\" & sht_nm & "_" & datestr & "v" & Format(rev, "00") & ".xlsm" 

End Sub 
+0

Есть ли что-то особенное, что мне нужно сделать для 'WshShell'? Я получаю ошибку _Compile: определяемый пользователем тип not defined_ на 'Dim ws As WshShell'. – PlainsWind

+0

Ой, извините, забыли упомянуть, что вы должны включить соответствующую ссылку. Вы можете сделать это следующим образом: 1- Открыть MS VBA в Excel 2- Нажмите на кнопку ** Инструменты ** на панели инструментов 3- Выберите ** Ссылки ** 4- Искать ** Windows Script Host Object Model * * ссылку и добавьте его, установив флажок рядом с ним. 5- Нажмите ** OK ** 6- Скомпилируйте сценарий снова –

+0

Или вы можете просто заменить следующее: 'Dim ws As WshShell' с' Dim ws As Object' И 'Set ws = New WshShell' с' Set ws = CreateObject («Wscript.Shell») ' –

Смежные вопросы