这是因为这不是编写这段代码的有效方法,或者只是这样在excel上工作的速度很慢吗?我在Windows 8 64位中使用excel 2007。我的办公室笔记本是一个非常新的笔记本电脑,里面有最新的I5 cpu。这是代码:
Private Sub CommandButton1_Click()
Sheets("data").Select
For rcounter = 2 To 45752
For xcounter = 26 To 50
For ycounter = 2 To 414
If (Cells(1, xcounter) = Cells(rcounter, 4)) Then
If (CInt(Cells(ycounter, 25)) = CInt(Cells(rcounter, 10))) Then
Cells(ycounter, xcounter).Value = Cells(ycounter, xcounter).Value + 1
End If
End If
Next ycounter
Next xcounter
Next rcounter
End Sub
答案 0 :(得分:2)
问题是你的嵌套循环,这可以分解:
你的第一个循环运行45,751次。
每次第一次循环运行时,它将运行第二次循环25次,导致第二次循环运行1,143,775次。
每次第二次循环运行时,它将运行第三次循环413次。你的第三个循环总计将达到472,379,075次。
我不知道你用这个脚本想要实现什么,但效率不高。
答案 1 :(得分:2)
正如here中所解释的,提高excel-vba计算性能的最重要步骤是使用范围数组复制而不是逐个单元浏览。
以下是您如何为您的示例执行此操作:
Private Sub CommandButton1_Click()
Sheets("data").Select
Dim cels() as Variant
cels = Range("A1", "AA45752")
For rcounter = 2 To 45752
For xcounter = 26 To 50
For ycounter = 2 To 414
If (cels(1, xcounter) = cels(rcounter, 4)) Then
If (CInt(cels(ycounter, 25)) = CInt(cels(rcounter, 10))) Then
cels(ycounter, xcounter).Value = cels(ycounter, xcounter).Value + 1
End If
End If
Next ycounter
Next xcounter
Next rcounter
Range("A1", "AA45752") = cels
End Sub
这应该快得多。当然,虽然你仍在循环(45752-1)*(50-25)*(414-1)
或472,379,075次,所以它可能还需要一段时间。您可能想要考虑是否确实需要多次检查所有这些单元格。
答案 2 :(得分:1)
不知道这是否有助于改善这种情况。您可以尝试移动以下行
If (Cells(1, xcounter) = Cells(rcounter, 4)) Then
之前
For ycounter = 2 To 414
减少不必要的比较