【问题标题】:VBA Exit inner loop but returns to inner loopVBA退出内循环但返回内循环
【发布时间】:2017-02-27 22:57:15
【问题描述】:

我只是使用一个循环遍历目录中的子文件夹的外部循环,并在每个子文件夹中创建一个反映该子文件夹中文件的主文件;文件结构都是相同的,所以我只需要一个文件作为主文件的模板,它将保存每个子文件夹中所有文件的所有累积数据。其他文件夹中的文件结构不同,这就是我需要每个子文件夹中的主文件的原因。

因为我只想使用内部循环子文件夹中的一个文件来复制文件的标题和名称(名称和“主”来重命名文件)但是在使用“退出”时循环返回到内部循环并遍历所有其他文件,这是我不想要的。

可能有更好的方法来做到这一点,但这就是我所得到的,想知道是否有人可以建议为什么内部循环在退出 for 语句时没有返回到外部循环以转到下一个子文件夹内循环?

我只是使用外部循环来初始化每个文件夹,除了调用内部循环之外,我在这个循环中没有做任何其他事情。

Sub DoFolder(Folder)
Dim SubFolder
For Each SubFolder In Folder.SubFolders

    Dim IsExecuted As Boolean
    Dim Item
    Dim filename
    Dim lastcol As Integer
    For Each Item In SubFolder.Files  **<<<< returns here**
        If Not IsExecuted Then
            Exit For
        Else
            filename = Item.Name
            Call CreateMasterCopy(removename(filename), strStartDir, SubFolder.Name)


             Call findcolumncount(Item)
             IsExecuted = True
        End If
    Next
Next  **<<<< returns to inner loop from here**


End sub

感谢任何建设性的反馈

安德鲁

编辑:下面的代码现在完全符合我的要求,内循环消失了。

Sub DoFolder(Folder)
Dim SubFolder
Dim filename As String
For Each SubFolder In Folder.SubFolders

    'search for file with Pattern at end to load this file into the filename variable
    filename = Dir(SubFolder & "\* - MyPattern.csv")

            Call CreateMasterCopy(removename(filename), strStartDir, SubFolder.Name)


Next
End Sub

【问题讨论】:

  • 要澄清当Exit For 被击中时,宏会转到下一个Item,而不是SubFolder,正如您所期望的那样?
  • 它返回到内部循环,但SubFolder 是下一个循环。你期待它做什么?
  • @mats-mug 我希望它返回子文件夹外循环并在下一个子文件夹中打开文件。
  • @brucewayne 是的,它返回当前子文件夹中的下一个项目,但希望它返回到外循环中的下一个文件夹

标签: excel vba for-loop nested


【解决方案1】:

Exit For 退出当前循环。现在当前循环在另一个循环里面,所以你需要一个完全跳出来的方法。

如果您想退出过程(似乎在该循环之外没有任何可执行的东西),那么请改用Exit Sub

否则(例如,如果您在该外循环之后还有更多代码),您还需要在外循环上设置一个单独的退出机制,例如另一个 If IsExecuted Then Exit For

但你的代码比这更糟糕。

IsExecuted 被初始化为False,因为它被声明为Boolean。这意味着你的所有循环都是进入然后立即退出,因为Not IsExecuted 已经计算为True

除非您删除了代码的某些关键部分,否则整个代码只会迭代Folder.Subfolders 中的每个项目。

请注意,Dim 语句也不能执行,并且在 VBA 中,可能的最小范围是 过程级 - 这些变量:

Dim IsExecuted As Boolean
Dim Item
Dim filename
Dim lastcol As Integer

不要在每次迭代时重新初始化,它们与 SubFolder 处于完全相同的范围内。

【讨论】:

  • 如果我取出内部循环,它会很好地遍历文件夹,尽管调试器实际上并没有返回到 for 部分,它只是在之后点击以下语句,在这种情况下,一个显示子文件夹的 msgbox .现在我知道代码正在返回到外部循环,但它只是转到下面的语句,这是带有其他项目(文件)的内部循环并继续循环它们。理想情况下,我希望将内部循环修改为仅从文件夹中选择一个文件的语句,这就是我所需要的,然后它可以循环到下一个子文件夹。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 2017-02-02
相关资源
最近更新 更多