2016-02-19 97 views
0

我在寻找帮助使代码片段运行得更快。我已经尝试了一些技巧,比如保存数组中的值,然后评估它们并关闭屏幕更新&代码运行时的计算,但仍需要非常多的时间。在Excel中缓慢运行vba脚本时遇到困难

我认识到有一吨的记录可以贯穿,但我希望有更多的资深程序员能够给我提供一些明智的建议。

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 

Dim w As Long 
Dim x As Long 
Dim y As Long 
Dim z As Long 
Dim srch() As Variant 
Dim ent() As Variant 
Dim rng1 As Range 
Dim rng As Range 
Set rng = ActiveSheet.Range("C2:C134743") 
ReDim srch(1 To 134742) 
Set rng1 = Sheets("ExampleSheet").Range("F2:F63078") 
ReDim ent(1 To 63077) 

For x = 1 To 134742 
    srch(x) = rng.Cells(x, 1).Value 
Next x 

For w = 1 To 63077 
    ent(w) = rng1.Cells(w, 1).Value 
Next w 

For z = 1 To 134742 

    For y = 1 To 63077 

     If CStr(srch(z)) = ent(y) Then 
      ActiveSheet.Range("AA2:AA134743").Cells(z, 1) = "Example_True" 
      GoTo jmp 
     Else 
      ActiveSheet.Range("AA2:AA134743").Cells(z, 1) = "Example_False" 
     End If 

    Next y 

jmp: 

Next z 

Application.Calculation = xlCalculationAutomatic 
Application.ScreenUpdating = True 

在此先感谢

+0

使用查找命令来查找细胞符合所需的数据。 –

+0

@ Grade'Eh'Bacon是正确的。如果您仍然需要使用阵列,则可以直接从范围加载它们。 'ent = rng1'(注意那是n,1个数组)。 –

+0

这应该被移植到[代码评论](http://codereview.stackexchange.com/) - 我已经标记它,所以希望它会被移动。 –

回答

0

应该会更快:

Sub TT() 

    Dim z As Long, y As Long 
    Dim srch As Variant, ent As Variant, v 
    Dim rng1 As Range, rng As Range, c As Range 

    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 

    Set rng = ActiveSheet.Range("C2:C134743") 
    srch = rng.Value 

    Set rng1 = Sheets("ExampleSheet").Range("F2:F63078") 
    ent = rng1.Value 

    For z = 1 To UBound(srch, 1) 
     Set c = rng.Cells(z).EntireRow.Cells(1, "AA") 
     v = CStr(srch(z, 1)) 
     For y = 1 To UBound(ent, 1) 
      If v = ent(y, 1) Then 
       c.Value = "Example_True" 
       GoTo jmp 
      End If 
     Next y 
     c.Value = "Example_False" 'only do this once! 
jmp: 

    Next z 

    Application.Calculation = xlCalculationAutomatic 
    Application.ScreenUpdating = True 

End Sub 
0

尝试关闭自动计算

你也不需要activesheet这么多。搭配:

Set rng = ActiveSheet.Range("C2:C134743") 

你可以只告诉它这是什么片即sheetx.range等

而且你似乎通过一组变量周围不必要。它看起来很像你可以重新设计这个以更简单的方式做到这一点。你只是使用index/match来过滤true/false?