Создайте папку с неограниченным количеством редакций

#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 объект для создания каталогов.