提问人:mRminer 提问时间:10/25/2023 更新时间:10/25/2023 访问量:45
VBA:嵌套循环仅运行一次
VBA: Nested Loop Only Runs Once
问:
srcPath = Dir("M:\UPLOAD\Feedback\*.xlsx")
For Each File In myArray
currentFile = CStr(File)
'MsgBox File
Do While srcPath <> ""
compareFile = CStr(srcPath)
If currentFile = compareFile Then
MsgBox (currentFile & compareFile)
Else: End If
srcPath = Dir()
Loop
MsgBox compareFIle
Next File
我希望它遍历数组(这是一个文件名列表),然后将每个索引中的文件名与 srcPath 文件夹中的文件进行比较。如果存在匹配项,则应打印正在比较的两个文件。
它适用于一个文件匹配 - 数组列表中的第一个文件。然后 For 循环继续,但它永远不会在第一个结果之后进入 Do While 部分。
我尝试过其他循环,但它们不适用于循环浏览文件夹。
最终 - 我希望这个宏获取 Excel 中的文件列表,将文件名与文件夹进行比较,如果列表中的文件名与文件夹中的文件名匹配,那么我希望它将该文件夹中的文件复制到新位置。我以为这很容易,但 vba 太精细了。
答:
1赞
Tim Williams
10/25/2023
#1
需要移动第一行:
For Each File In myArray
currentFile = CStr(File)
srcPath = Dir("M:\UPLOAD\Feedback\*.xlsx")
Do While srcPath <> ""
compareFile = CStr(srcPath)
If currentFile = compareFile Then
MsgBox (currentFile & compareFile)
End If
srcPath = Dir()
Loop
MsgBox compareFIle
Next File
不过,这更直接:
Const FOLDER_PATH As String = "M:\UPLOAD\Feedback\"
For Each File In myArray
If Len(File) > 0 Then 'not an empty entry
If Len(Dir(FOLDER_PATH & File)) > 0 Then 'any matched file?
Debug.Print "Matched", File
Else
Debug.Print "### Not Matched", File
End If
End If
Next File
评论
0赞
mRminer
10/25/2023
感谢您使用我的逻辑和更优化的东西来回答,这很棒。但只有一个问题:当我使用您的 len() 方法时,它看起来可能会跳过数组的最后一个索引,因为读出显示倒数第二个行项目,然后最后一个输出为 null 或空格。
0赞
Tim Williams
10/25/2023
你们中有人是空的吗?如果是,那么在调用 Dir 之前,也许可以添加一行来检查这一点......myArray
0赞
mRminer
10/25/2023
没关系,我想通了。搜索文件夹中不存在最后一个文件名。当没有匹配项时,我将不得不建立某种条件。
0赞
mRminer
10/25/2023
非常感谢您的帮助。我一直在为此苦恼,因为我在最后期限前落后了,这解决了它。喜欢这个论坛。
0赞
Tim Williams
10/25/2023
在上面做了一些编辑......
上一个:VBA:无法获取单元格的值
评论
If Len(Dir("M:\UPLOAD\Feedback\" & currentFile) > 0
将直接告诉您该文件是否在文件夹中。不需要嵌套循环。顺便说一句,您需要将第一行移动到循环中,以便您发布的工作方法。Len(myString)>0
仅检查是否没有值(即,如果它是空字符串)。一旦> 0,实际字符数就没有任何区别。myString