VBA:嵌套循环仅运行一次

VBA: Nested Loop Only Runs Once

提问人:mRminer 提问时间:10/25/2023 更新时间:10/25/2023 访问量:45

问:

    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 太精细了。

Excel VBA for 嵌套循环

评论

0赞 Tim Williams 10/25/2023
If Len(Dir("M:\UPLOAD\Feedback\" & currentFile) > 0将直接告诉您该文件是否在文件夹中。不需要嵌套循环。顺便说一句,您需要将第一行移动到循环中,以便您发布的工作方法。
0赞 mRminer 10/25/2023
太棒了,非常感谢。不过,我不完全确定为什么 Len() 在这种情况下可以进行文件比较。
0赞 Tim Williams 10/25/2023
Dir 返回一个 String - 所以 Len 只是检查返回值的长度
0赞 mRminer 10/25/2023
我就是这么想的。那么,如果所有文件名的字符数相同呢?
0赞 Tim Williams 10/25/2023
Len(myString)>0仅检查是否没有值(即,如果它是空字符串)。一旦> 0,实际字符数就没有任何区别。myString

答:

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
在上面做了一些编辑......