Существуют структурные, логические и предполагаемые проблемы с вашим кодом.
Проблема структуры заключается в том, что код для разделения расширения охватывает ваш рекурсивный вызов, поэтому ваша рекурсия никогда не произойдет, если имя файла не содержитрасширение. Если это преднамеренное решение, то лучше выйти из функции раньше, чем охватывать все остальное в конце if, если.
Ваша логическая ошибка в том, что вы не используете рекурсивный вызов функции правильно
Call CreateUniqueFileName(strPath, fileName, orderId + 1)
Должно быть
CreateUniqueFileName = CreateUniqueFileName(strPath, fileName, orderId + 1)
Вы предполагаете, что аргументы вашей функции являются значениями. Они не. По умолчанию VBA передает параметры по ссылке, поэтому в вашем коде «имя файла» является той же переменной каждый раз, когда вызывается функция, а не является новой копией.
Следовательно, эта строка
fileName = fileName & " (" & CStr(orderId) & ")." & extension
вызовет проблемы с именами файлов, так как вы выполняете рекурсию с именем файла, а не strFilename.
Я реструктурировал ваш код, чтобы сделать рекурсивнуюочиститель деталей (хотя, как отмечают другие, гораздо предпочтительнее цикл)
Function CreateUniqueFileName(ByVal StrPath As String, ByVal strFileName, ByRef orderId As Integer) As String
Dim FileNameArray As Variant
FileNameArray = Split(strFileName, ".")
If Len(FileNameArray(1)) = 0 Then
Debug.Print ("CreateUniqueFilename says strFilename has no extension")
CreateUniqueFileName = vbNullString
Exit Function
End If
If orderId = 0 Then
CreateUniqueFileName = FileNameArray(0) & Format(orderId, "0000") & FileNameArray(1)
Exit Function
End If
CreateUniqueFileName = GetUniqueName(StrPath, FileNameArray, orderId)
End Function
Public Function GetUniqueName(ByRef StrPath As String, ByRef FileNameArray As Variant, ByVal orderId As Integer) As String
' StrPath and FIlenamearray are passed by reference as they don't change during the recursion
' orderid is passed by value so that we don't change the value of orderid in the calling code.
' If this side effect is desired, change the ByVal to ByRef
Dim myFilename As String
myFilename = FileNameArray(0) & Format(orderId, "0000") & FileNameArray(1)
If (DoesFileExist(StrPath & myFilename)) Then
GetUniqueName = GetUniqueName(StrPath, FileNameArray, orderId + 1)
Else
GetUniqueName = myFilename
End If
End Function
Обратите внимание, что я не запускал приведенный выше код, но он прекрасно компилируется.