【问题标题】:VBA Do while Loop in For Loop executes only onceFor循环中的VBA Do while循环只执行一次
【发布时间】:2018-10-31 15:45:32
【问题描述】:

我有一个问题,我的 For 循环中的 Do While 循环只执行一次。我尝试实现以下目标:

我有一堆 excel 文件 (*.xlsm),位于同一文件夹中,其中包含一些员工的数据,我想遍历每个文件并获得一定的数字。到现在为止还挺好。当我想“更改”员工姓名时,问题就出现了。

给定以下代码:

Set FldrPicker = Application.FileDialog(msoFileDialogFolderPicker)

With FldrPicker
    .Title = "Select A Target Folder"
    .AllowMultiSelect = False
    If .Show <> -1 Then GoTo NextCode
    myPath = .SelectedItems(1) & "\"
End With

NextCode:
myPath = myPath
If myPath = "" Then GoTo ResetSettings

myExtension = "*.xlsm"
myFile = Dir(myPath & myExtension)        

For i = 1 To 3
    xCallsEin = 0
    xMa = wb.Sheets(2).Cells(i, 1)
    MsgBox xMa
    Do While myFile <> ""
        Set wb2 = Workbooks.Open(Filename:=myPath & myFile)
        DoEvents

        xCallsEinTemp = Application.WorksheetFunction.VLookup(xMa, wb2.Sheets(1).Range(Columns(2), Columns(6)), 4, 0)

        xCallsEin = xCallsEin + xCallsEinTemp

        wb2.Close SaveChanges:=False
        DoEvents
        myFile = Dir
        wb1.Sheets(1).Cells(i + 6, 2) = xCallsEin        
    Loop        
Next i

Do while 代码只执行一次,对于 For 循环中的第一个 i。 我发现是因为在第一个 do while 循环完成时,myFile 变量为空。 我需要有关如何将 myFile 变量重新设置为某个值的帮助,以便 do while 循环执行与 for 循环一样多的次数。

【问题讨论】:

  • 扭转局面:将For 放入Do 循环中。
  • 使用Option Explicit 并声明你的变量。并避免GoTo,这看起来很糟糕。
  • @IonuţSanda - 你试过按 F8,一步一步看看会发生什么吗?
  • @DougCoats On Error GoTo 不是 GoTo 声明,而是 On Error 声明
  • @DougCoats 我是……脖子上的迂腐疼痛;-)

标签: vba loops for-loop do-loops


【解决方案1】:

Do While...LoopmyFile 为空时退出。因此,在下一次 For...Next 循环迭代中,myFile 仍然为空,因此第二次 For 循环迭代不会进入 Do While 循环,因为它的退出条件立即得到满足.

考虑移动这条线:

myFile = Dir(myPath & myExtension)

For...Next 循环中的第一件事。

...然后修复循环逻辑,这样您就不需要重新处理每个文件 3 次。

【讨论】:

  • 嗨@Mathieu Guidon。我已经将myFile = Dir(myPath &amp; myExtension) 移到了 For 循环中,它运行良好。不幸的是,我需要多次重新处理每个文件,因为宏的目的是收集员工列表的信息。