【发布时间】:2019-11-03 07:59:50
【问题描述】:
我有以下调用自身(递归)的函数。目标是返回一个唯一的文件名,格式为文件名 (1).ext、文件名 (2).ext 等。
Function CreateUniqueFileName(strPath As String, strFileName, orderId As Integer) As String
Dim extPos As Integer
Dim extension As String
Dim fileName As String
fileName = ""
extPos = InStrRev(strFileName, ".")
If (extPos > 0) Then
fileName = Left(strFileName, extPos - 1)
extension = Right(strFileName, Len(strFileName) - extPos)
If (orderId = 0) Then
fileName = strFileName
CreateUniqueFileName = fileName
Else
fileName = fileName & " (" & CStr(orderId) & ")." & extension
End If
If (DoesFileExist(strPath & fileName)) Then
Call CreateUniqueFileName(strPath, fileName, orderId + 1)
Else
CreateUniqueFileName = fileName
Exit Function
End If
End If
End Function
如果第一次调用它并且 orderId 值为 0,则它始终是第一个,因此是唯一的。所以在这种情况下,该函数只被调用一次。但是当执行递归并且 DoesFileExists 返回 false 时,返回值应该返回生成的文件名并退出。但是,当我调试该函数时,该函数执行没有错误,但它始终返回原始值而不是原始迭代的结果。
例如,如果我这样调用这个函数: CreateUniqueFileName("C:\Temp\",""1010-40-800.jpg",1) 如果已经有一个名为 1010-40-800 (1).jpg 的文件,它会检查 C:\temp,如果是,则调用相同的函数并且 orderId 在这种情况下更新为 1 CreateUniqueFileName ("C:\Temp\",""1010-40-800.jpg",2). 重复相同的过程 (Recusive). 现在假设 1010-40-800 (2).jpg 是唯一的(找不到文件)。我希望函数返回 1010-40-800 (2).jpg 作为字符串结果。但它会返回值 1010-40-800(1).jpg。其实是函数第一次调用的值。
我在这里错过了什么?
【问题讨论】:
-
@braX,我确实使用 Dir 函数来检查文件是否存在,这个假设是正确的。所以你说我必须使用 FSO 来检查文件是否存在才能解决这个问题?
标签: excel vba recursion filesystemobject