Excel VBA嵌套的for循环输出复制/错误结果

时间:2019-04-24 22:49:40

标签: excel vba loops for-loop

我有一个嵌套的for循环,迭代两个不同人的生日(1919年至2001年)。

目的是找到两个人的每种年龄组合(基于出生日期)。

我遇到的问题是,嵌套循环(变量j的循环)中人的年龄似乎有时随机重复,没有规律。

例如,当N人的年龄为100-20岁时,每个组合都可以正常工作,而J人的年龄值没有重复。然后突然,当N人的年龄为19岁时,J人的年龄将从100-50岁开始, 49岁两次,然后达到47岁。

以下是我的代码:

Sub ChangeDOB()
Application.ScreenUpdating = False
Dim n As Long
Dim i As Long
Dim j As Long
i = 2

For n = 1919 To 2001
    Sheets("Inputs").Range("E6").FormulaR1C1 = "1/15/" & n
    'j = 1919

    For j = 1919 To 2001
        Sheets("FF Tool Rates").Range("B" & i).Value = Sheets("Inputs").Range("E7").Value
        Sheets("Inputs").Range("E10").FormulaR1C1 = "1/15/" & j

        Sheets("FF Tool Rates").Range("C" & i).Value = Sheets("Inputs").Range("E11").Value
        Sheets("FF Tool Rates").Range("D" & i).Value = Sheets("Inputs").Range("S8").Value
        i = i + 1
    Next j
Next n
Application.ScreenUpdating = True

End Sub

Inputs!E7中的公式计算N人的年龄。输入中的公式!E11计算人J的年龄。 Inputs!S8中的公式基于两个人的年龄来计算值。我希望这可以增加清晰度。

以下是预期结果的示例:

Person N Age   Person J Age
90             90
90             89
90             88
90             87
90             86
90             85
90             84
90             83
90             82
90             81

以下是错误结果的示例(请参阅年龄85出现两次的方式):

Person N Age   Person J Age
33             90
33             89
33             88
33             87
33             85 <-should've been 86
33             85 
33             84
33             83
33             82
33             81

最初,我认为这是我设置Excel的方法,该方法可以根据出生日期计算年龄。但是,如果我在单元格中手动输入年份,则Excel会产生非重复的结果。因此85岁不会在手动输入下出现两次。

关于何时出现此错误似乎没有任何模式,如果我重新运行代码,有时将没有错误,有时错误会出现在其他地方。这就是为什么我很难调试它的原因。

关于我可能错过了什么地方或者我弄乱了代码中的任何逻辑的任何建议或建议吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我认为我也有同样的问题,您的问题是我发现的唯一一个似乎其答案可以帮助我的问题。太糟糕了,没有任何答案。

我最终对其进行了修复,因此希望可以对其他人有所帮助

我有一个工作簿,该工作簿根据4个变量(它们本身在不同的工作表和其他工作簿之间划分)来计算产品价格。变量a有25种可能性,b有52种,c有3种,d有6种。这给了我22,464种不同的价格可能性。我的代码有4个嵌套循环,可将每种可能性打印在不同的行中,因此我可以将输出导入到其他系统中。
我遇到的问题是,除了要花近30分钟的时间在高端计算机上运行外,我还会随机获得包含错误数据的行。

我(未经证实)的诊断是,因为在For循环中,工作表中其他地方(实际上,在Excel中的任何地方)进行了大量计算,因此VBA有时会继续迭代并填写源有机会更新之前的下一行。
这就是为什么当我进行逐步调试时,错误不会显示出来的原因,并且即使在整体运行代码时,它也是断断续续的,而且似乎是随机的。

我首先使用With简化了代码,并避免VBA在每一行代码中遍历整个WorkbooksWorksheets数组。我还为我的许多引用中的每一个创建了Excel.WorkbookExcel.WorksheetExcel.Range变量。

不过,最终似乎已解决的问题是在子循环的开头添加了Application.Calculation = xlCalculationManual,并在嵌套循环的适当位置添加了Application.Calculate。我先添加了Application.CalculationState的支票,然后添加了DoEvents的支票,但我什至不知道如何测试该支票是否有效。

这是代码的相关部分:

Sub test()
    '
    ' (Variable declarations suppressed)
    '
    
    Application.ScreenUpdating = False
        
    'Set to manual
    Application.Calculation = xlCalculationManual
        
    For a = 0 To 22464
        rngTabCusto.Value = wksCalculos.Cells(a / 936 + 23, 28).Value
        For b = 0 To 918
            rngFrete.Value = wksFrete.Cells(b / 18 + 4, 1).Value
            For c = 0 To 12
                rngTipoFat.Value = wksCalculos.Cells(c / 6 + 3, 3).Value

                '
                ' Calculate sheets after changing variables
                '
                Application.Calculate
                
                '
                ' Waits until calculations are done
                '
                If Not Application.CalculationState = xlDone Then
                    DoEvents
                End If
                
                '
                ' Prints calculation results
                '
                With wksDescontos
                    For d = 0 To 5
                        .Cells(a + b + c + d + 2, 1).Value = rngEstab.Value
                        .Cells(a + b + c + d + 2, 2).Value = wksOrcamento.Cells(2, d + 2).Value
                        .Cells(a + b + c + d + 2, 3).Value = rngContrib.Value
                        .Cells(a + b + c + d + 2, 4).Value = wksRegiao.Cells(b / 18 + 2, 1).Value
                        .Cells(a + b + c + d + 2, 5).Value = wksRegiao.Cells(b / 18 + 2, 2).Value
                        .Cells(a + b + c + d + 2, 6).Value = wksOrcamento.Cells(4, d + 2).Value
                        .Cells(a + b + c + d + 2, 7).Value = rngTabOrc.Value
                        .Cells(a + b + c + d + 2, 8).Value = data
                        .Cells(a + b + c + d + 2, 11).Value = rngFat.Value
                    Next d
                End With
            c = c + 5
            Next c
        b = b + 17
        Next b
    a = a + 935
    Next a
    
    'Reset
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
    
End Sub