【问题标题】:How to reset variable in For .. Do loop?如何在 For .. Do 循环中重置变量?
【发布时间】:2020-02-14 17:14:07
【问题描述】:

如何在 do 循环中将保留变量重置为 0?我要重置的是idx。

idx 表示正在搜索的子文件夹的编号。

例如,总共有 100 个子文件夹,因此 idx max=100。当宏找到匹配文件夹时,例如。 50.它保留了idx=50。所以对于新的搜索,idx 不会从头开始,而是从 51、52、53...100 继续新的搜索。所以如果匹配的子文件夹 idx 为 20,由于宏没有经过 0-50,它会将其视为未找到并退出循环。

我可以在哪里重置这个变量?

    Dim idx As Integer
    For idx = 0 To UBound(Array_SubFolders)
        Dim fileName As String
        fileName = Dir(Array_SubFolders(idx) & "/*.xlsb")
        On Error Resume Next
        Do While fileName <> ""
            FullPathFileName = Array_SubFolders(idx) & "\" & fileName
            If (Left(fileName, 12) = "Ass_Sheet_") Then
                Dim prodName As String
                prodName = ThisWorkbook.Sheets("Master").Cells(MasterRow, 1).Value
                If (InStr(fileName, prodName) > 0) Then
                    Call prc_Import_Values(fileName)
                    MasterRow = MasterRow + 1
                End If
            End If
            fileName = Dir()
        Loop

    Next

    MsgBox "--- finished ---"

【问题讨论】:

  • 1) 您似乎遗漏了一些代码,next idx(可能还有其他东西)遗漏了 2) “休息”是指“重置”吗? 3) prc_Import_Values 是递归函数吗?上面是它的代码吗?
  • 这是一个函数吗? Array_SubFolders来自哪里?
  • @cybernetic.nomad 你是对的,1)“休息”=重置。 @)prc_Import_Values 是在宏找到正确的文件夹和文件后导入值的另一个函数。那部分工作得很好,我没有把代码放在这里。这里唯一的问题是重置 idx,所以当新的搜索开始时,它将从第一个子文件夹开始搜索,该数组存储所有检测到的子文件夹。
  • @mdelapena array_Subfolders 是存储所有子文件夹的另一个函数,我发布的代码是为了找到匹配文件夹。
  • 旁注 - 我认为您应该为此 "/*.xlsb") 使用反斜杠

标签: excel vba loops for-loop directory


【解决方案1】:

首先,我强烈建议删除On Error Resume Next,因为将它留在里面只会在出现问题并且您没有收到任何错误消息时导致痛苦和心痛。如果您在删除后收到错误消息,您应该追踪错误的来源并修复它或使用适当的保护子句或错误处理来处理它。

其次,我认为您想重复搜索整个Array_SubFolders 以查找名称中包含prodName 的每个子文件夹中的任何文件。如果是这样的话,我会建议这样的事情:

Dim index As Integer
index= 0
Do While index < UBound(Array_SubFolders) 
    Dim fileName As String
    fileName = Dir(Array_SubFolders(index) & "\*.xlsb")
    Do While fileName <> ""
        FullPathFileName = Array_SubFolders(index) & "\" & fileName
        If (Left(fileName, 12) = "Ass_Sheet_") Then
            Dim prodName As String
            prodName = ThisWorkbook.Sheets("Master").Cells(MasterRow, 1).Value
            If (InStr(fileName, prodName) > 0) Then
                Call prc_Import_Values(fileName)
                MasterRow = MasterRow + 1
                index = 0
            End If
        End If
        fileName = Dir()
    Loop
    index = index+ 1
Loop

不是使用For...Next 循环并尝试重置索引(通常建议不要这样做),而是使用Do While...Loop 并在找到If (InStr(fileName, prodName) &gt; 0) Then 行上的匹配项时重置索引。如果那是错误的位置,那么您可以将index = 0 移动到实际匹配发生的位置。

另外,请注意我将idx 更改为index。元音很便宜,我相信不去除元音会使它们更具可读性。此外,借助 VBIDE 的自动完成功能,键入 in&lt;ctrl-space&gt; 可能会以相同的击键次数获得相同的结果。

【讨论】:

  • 感谢@FreeMan 的建设性建议。在阅读您的评论之前,我也将其更改为 while..loop。然后我尝试根据您上面的更改修改我的代码。索引重置问题解决了,但是循环现在没有退出。例如:我只想搜索2个产品名称,但是在2个产品名称之后,宏仍然不断导入数据(下一个索引的文件)
  • 很高兴您发现这很有帮助。如果您需要另一种跳出循环的方法,您可以在达到“跳出”条件时执行index = UBount(Array_SubFolder) + 1,或者您可以将Do While index &lt; UBound() 更改为Do While index &lt; UBound() and OtherCondition = True
  • 我这里有点迷糊。也许我之前的问题只是问如何重置索引,然后我没有解释我的场景。实际上,我的索引是指数组保留的特定子文件夹。所以第一个目标是从产品名称列表中搜索我需要的子文件夹,然后在下一个循环中找到符合我条件的文件。在阅读您的建议之前,我的想法很简单,即在产品名称列表结束时退出循环。我尝试将此条件添加到我的循环中,但尚未成功。
  • 终于,它工作了。感谢您的帮助弗里曼。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多