Excel 如何使我的代码花更少的时间处理?
基本上,我有下面的vba代码,我应用于5000多行,这需要相当长的时间,我想知道是否有任何方法可以让它运行得更快一点。 我基本上是在尝试优化x和y的值,并在每一行上运行它们 提前谢谢Excel 如何使我的代码花更少的时间处理?,excel,vba,Excel,Vba,基本上,我有下面的vba代码,我应用于5000多行,这需要相当长的时间,我想知道是否有任何方法可以让它运行得更快一点。 我基本上是在尝试优化x和y的值,并在每一行上运行它们 提前谢谢 Sub maximise(ByRef x As Range, ByRef y As Range) Dim ypos1 As Double, ypos2 As Double, yneg1 As Double, yneg2 As Double Dim xpos As Double, xneg As D
Sub maximise(ByRef x As Range, ByRef y As Range)
Dim ypos1 As Double, ypos2 As Double, yneg1 As Double, yneg2 As Double
Dim xpos As Double, xneg As Double
x = 0.01
ypos1 = y.Value2
ypos2 = ypos1
ActiveSheet.Calculate
Do While ypos2 - ypos1 >= 0
ypos1 = y.Value2
xpos = x.Value2
x.Value2 = x.Value2 + 0.01
ActiveSheet.Calculate
ypos2 = y.Value2
Loop
ActiveSheet.Calculate
x = -0.01
yneg1 = y.Value2
yneg2 = yneg1
ActiveSheet.Calculate
Do While yneg2 - yneg1 >= 0
yneg1 = y.Value2
xneg = x.Value2
x.Value2 = x.Value2 - 0.01
ActiveSheet.Calculate
yneg2 = y.Value2
Loop
ActiveSheet.Calculate
If ypos1 > yneg1 Then
x.Value2 = xpos
Else
x.Value2 = xneg
End If
ActiveSheet.Calculate
End Sub
在不更改代码的情况下,您可以尝试关闭屏幕更新
Sub maximise(ByRef x As Range, ByRef y As Range)
Application.ScreenUpdating = False
Dim ypos1 As Double, ypos2 As Double, yneg1 As Double, yneg2 As Double
Dim xpos As Double, xneg As Double
x = 0.01
ypos1 = y.Value2
ypos2 = ypos1
ActiveSheet.Calculate
Do While ypos2 - ypos1 >= 0
ypos1 = y.Value2
xpos = x.Value2
x.Value2 = x.Value2 + 0.01
ActiveSheet.Calculate
ypos2 = y.Value2
Loop
ActiveSheet.Calculate
x = -0.01
yneg1 = y.Value2
yneg2 = yneg1
ActiveSheet.Calculate
Do While yneg2 - yneg1 >= 0
yneg1 = y.Value2
xneg = x.Value2
x.Value2 = x.Value2 - 0.01
ActiveSheet.Calculate
yneg2 = y.Value2
Loop
ActiveSheet.Calculate
If ypos1 > yneg1 Then
x.Value2 = xpos
Else
x.Value2 = xneg
End If
ActiveSheet.Calculate
Application.ScreenUpdating = True
End Sub
您是否尝试过通过对代码进行基准测试来找到热点?我打赌这都是工作表计算的结果。如果所有的计算都是用VBA而不是在工作表中完成的,代码可能会运行得更快。还有一种更好的方法可以找到您正在寻找的最佳值(如果不知道您的工作表正在计算什么,就不可能说),但最好在下面的时间询问,而且,您正在重新计算
ActiveSheet
,但是那张纸上没有写着x
和y
——所有这些重述实际上可能没有任何效果。通常不需要重新计算整个工作表。循环通常执行多少次迭代?您可以尝试增大初始步长,然后减小步长并重新访问临界点。劫持工作表的计算函数。因此,您可以控制正在发生/更新的内容。