Я считаю, что функция NextFileName()
делает то, что вы хотите.
У меня почти всегда есть номера версий в моих файлах, поэтому мне регулярно приходится искать новое имя «AAA V28.xxx», когда я заканчиваю обновление файл «AAA V27.xxx». Я сохраняю функцию NextFileName()
в файле PERSONAL.XLSB, чтобы ее можно было вызывать из любой из моих книг.
Версия NextFileName()
здесь не является моей последней версией. Год go Я столкнулся с необходимостью обрабатывать версии файлов на основе дат и создал новую версию NextFileName()
, которая обрабатывает такие имена файлов. Я нашел свою старую версию и усовершенствовал ее, добавив «V2», если номер версии не был найден.
Вы можете запустить TestNextFileName()
, чтобы проверить, как моя процедура работает так же, как и sh.
Option Explicit
Sub TestNextFileName()
Debug.Print ("AAA 5.abc -> " & NextFileName("AAA 5.abc"))
Debug.Print ("BBB V9.abc -> " & NextFileName("BBB V9.abc"))
Debug.Print ("CCC V05.abc -> " & NextFileName("CCC V05.abc"))
Debug.Print ("DDD V1.99.abc -> " & NextFileName("DDD V1.99.abc"))
Debug.Print ("EEE.abc -> " & NextFileName("EEE.abc"))
End Sub
Public Function NextFileName(ByVal CrntFileName As String) As String
' * CrntFileName should be of the format "zzzzyy.xxx" where
' yy represents a string of one or more decimal digits
' the final z is anything but a decimal digit.
' xxx represents the extension
' * If CrntFileName is of this format, the routine returns "zzzzww.xxx" where
' ww is one more than yy.
' * If CrntFileName is not of this format. the routine returns "zzzz V2.xxx".
' * Examples:
' AAA 5.abc -> AAA 6.abc
' BBB V9.abc -> BBB V10.abc
' CCC V05.abc -> CCC V06.abc
' DDD V1.99.abc -> DDD V1.100.abc
' EEE.abc -> EEE V2.abc
' 26Jul11 Coded and tested under VB 2010.
' 22Nov11 Amended for VBA
' 14Jan19 Became obsolete when version that allowed for other options coded.
' 16Apr20 Resurrected in response to SO question. Amended to add V2 if no
' version number found
Dim Extn As String
Dim Name As String
Dim Pos As Integer
Dim Version As String
' Split CrntFileName into name and extension
Pos = InStrRev(CrntFileName, ".")
If Pos = 0 Then
Name = CrntFileName
Extn = ""
Else
Name = Mid(CrntFileName, 1, Pos - 1)
Extn = Mid(CrntFileName, Pos) ' Includes dot
End If
Pos = Len(Name)
Do While True
If IsNumeric(Mid(Name, Pos, 1)) Then
Pos = Pos - 1
Else
Pos = Pos + 1
Exit Do
End If
Loop
' If Pos > Len(Name), there are no trailing digits
' if Pos <=Len(Name), Pos identifies the first or only trailing digit.
If Pos > Len(Name) Then
NextFileName = Name & " V2" & Extn
Else
Version = Mid(Name, Pos) + 1 ' Next version number
' Add leading zeros if necessary to pad to original length
Do While Len(Version) < Len(Mid(Name, Pos))
Version = "0" & Version
Loop
NextFileName = Mid(Name, 1, Pos - 1) & Version & Extn
End If
End Function