#excel #vba
#excel #vba
Вопрос:
Я настраиваю новое местоположение данных в VBA и хочу сохранить все мои результаты и все прогоны этих результатов.
Итак, например, я создаю папку с именем yesterday 20190403. однако теперь я хочу сохранить во вложенной папке с именем ‘v0001’, однако, если это уже есть, я хочу быть ‘v0002’ и так далее.
Моя проблема в том, что я не знаю, как создать папку с помощью этой итерации, и я также не знаю, как найти последнюю версию этой папки, чтобы сохранить файлы позже. Поскольку это будет отдельный процесс. Например, я запускаю позже в тот же день, у меня есть 2 вопроса:
1) Как я узнаю, создайте папку, которая будет повторяться с номером версии. т. е. с v0001 по v0016 было сделано, таким образом, я должен создать v0017. 2) Я хочу сохранить номер последней версии, откуда мне знать, что последняя версия — v0017, и я должен сохранить ее там
Ответ №1:
Следующая функция возвращает последнюю версию вложенной папки. Когда вы установите для 2-го параметра значение True
, он создаст новую папку со следующим свободным номером.
Function GetLatestFolder(BaseFolder As String, createNew As Boolean) As String
Dim dirName As String, i As Long
If Right(BaseFolder, 1) <> "" Then BaseFolder = BaseFolder amp; ""
For i = 1 To 9999
dirName = Format(i, "V0000")
If Dir(BaseFolder amp; dirName, vbDirectory) = "" Then
' This folder doesn't exist.
' If requested, created it
If createNew Then
MkDir BaseFolder amp; dirName
GetLatestFolder = dirName
Else
' Return the folder with last found number
GetLatestFolder = Format(i - 1, "V0000")
End If
Exit Function
End If
Next i
End Function
Обратите внимание, что в настоящее время обработка ошибок не выполняется, поэтому, если вложенная папка вообще не существует, она вернет недопустимый путь «v0000», и если количество папок достигнет 9999, она ничего не вернет.
Комментарии:
1. Оба ответа великолепны, но в итоге я реализовал последний, поскольку он обладает двойной функциональностью, спасибо обоим. Отличный ответ
Ответ №2:
Вот пример функции, которая найдет папку с максимальной версией в папке, которую вы отправляете в нее:
Function findLastVersion(versionFolder As String) As String
''Reference Windows Script Host Object Model in Tools>>References
Dim fso As New FileSystemObject
Dim folderRoot As Folder
Dim folderSub As Folder
Dim maxVersionFolder As String
Set folderRoot = fso.GetFolder(versionFolder)
For Each folderSub In folderRoot.SubFolders
If folderSub.Name Like "v*" And (folderSub.Name > maxVersionFolder Or maxVersionFolder = "") Then maxVersionFolder = folderSub.Name
Next
findLastVersion = maxVersionFolder
End Function
Вы можете назвать это как:
Dim maxVersion As String
maxVersion = findLastVersion("C:somefolder")
И предполагая, что это папка, в которой вы храните эти подкаталоги с номерами версий, в которой будет указана максимальная версия. Вы также можете использовать этот fso
объект для создания каталогов.