以下宏在MS Excel for Mac(Office 2011)中运行速度非常慢。对于for-next循环中的100个数据点,需要10秒。在Office 2004的早期版本中,行" Application.EnableEvents = False"修复了问题但在Office 2011中不再修复。代码如下所示。任何提示都表示赞赏。
Sub findfirstnonzero3()
Application.Volatile
Application.EnableEvents = False
Application.ScreenUpdating = False
Dim student, studenter, first, tentor, utdata, yr, startcol, startrow, temp As Integer
Dim resultatet As Integer
Dim ignore, resstr As String
Dim tenta, outp, temprange As Range
yr = Cells(4, 2).Value
studenter = Cells(1, 2).Value
tentor = Cells(2, 2).Value
utdata = 3
startrow = 2
startcol = 5
Cells(1, utdata).Offset(startrow - 2, 0).Value = "Första tenta"
For student = 1 To studenter
temp = 0
Cells(1, utdata).Offset(startrow + student - 2, 0).Value = 0
For first = 1 To tentor
resstr = Cells(startrow + student - 1, startcol).Offset(0, first - 1).Value
resultatet = Val(resstr)
temp = first
If resultatet > 0 Then
Cells(1, utdata).Offset(startrow + student - 2, 0).Value = temp
Exit For
End If
Next
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
答案 0 :(得分:1)
有一种避免计算延迟的好方法。我用这个得到了很棒的结果,现在我一直在使用它。
简而言之,Excel需要很长时间才能在" VBA世界"之间来回复制数据。和电子表格世界"。
如果你做了所有"读取"立刻,处理,然后做所有"写"马上,你获得惊人的表现。这是使用变体数组完成的,如下所示:
http://msdn.microsoft.com/en-us/library/ff726673.aspx#xlFasterVBA
标记为:在单个操作中读取和写入大块数据
我能够重构一些我用了5分钟运行的代码并将其降低到1.5分钟。重构本身只花了我10分钟,这是惊人的,因为它是相当复杂的代码。
答案 1 :(得分:0)
总结这里发表的评论,这是对我有用的答案:
Application.Calculation = xlManual
或
Application.Calculation = xlCalculationManual
Application.Calculation = xlAutomatic
或
Application.Calculation = xlCalculationAutomatic
谢谢大家。
d