我有一个嵌套的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岁不会在手动输入下出现两次。
关于何时出现此错误似乎没有任何模式,如果我重新运行代码,有时将没有错误,有时错误会出现在其他地方。这就是为什么我很难调试它的原因。
关于我可能错过了什么地方或者我弄乱了代码中的任何逻辑的任何建议或建议吗?
提前谢谢!
答案 0 :(得分:0)
我认为我也有同样的问题,您的问题是我发现的唯一一个似乎其答案可以帮助我的问题。太糟糕了,没有任何答案。
我最终对其进行了修复,因此希望可以对其他人有所帮助
我有一个工作簿,该工作簿根据4个变量(它们本身在不同的工作表和其他工作簿之间划分)来计算产品价格。变量a
有25种可能性,b
有52种,c
有3种,d
有6种。这给了我22,464种不同的价格可能性。我的代码有4个嵌套循环,可将每种可能性打印在不同的行中,因此我可以将输出导入到其他系统中。
我遇到的问题是,除了要花近30分钟的时间在高端计算机上运行外,我还会随机获得包含错误数据的行。
我(未经证实)的诊断是,因为在For
循环中,工作表中其他地方(实际上,在Excel中的任何地方)进行了大量计算,因此VBA有时会继续迭代并填写源有机会更新之前的下一行。
这就是为什么当我进行逐步调试时,错误不会显示出来的原因,并且即使在整体运行代码时,它也是断断续续的,而且似乎是随机的。
我首先使用With
简化了代码,并避免VBA在每一行代码中遍历整个Workbooks
和Worksheets
数组。我还为我的许多引用中的每一个创建了Excel.Workbook
,Excel.Worksheet
和Excel.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