2012-12-21 54 views
0

我正在努力使代碼運行得更快。我相信適當的技術將是使用一個變種陣列。你能否提供一個關於如何將下面的代碼轉換成更高效的Variant數組的示例?謝謝!將For/Next循環更改爲Variant數組

Dim i As Long 
LastRow = Range("A" & Rows.Count).End(xlUp).Row 

For i = 2 To LastRow 


    If Range("S" & i) > 0.0014 Then 
     Range("Z" & i, "AA" & i).Copy 
     Range("AC" & i, "AD" & i).PasteSpecial xlPasteValues 
    End If 



Application.ScreenUpdating = False 
Next i 

回答

2

下面是一個例子:

Dim i As Long 
Dim checkedValues 'Declare a variant 
Application.ScreenUpdating = False 
lastrow = Range("S" & Rows.Count).End(xlUp).Row 
'Get range you're checking into the array 
checkedValues = Range("S2:S" & lastrow) 
For i = 1 To UBound(checkedValues) 
    If checkedValues(i, 1) > 0.0014 Then 
     'Transfer values directly instead of copy paste 
     Range("AC" & i + 1, "AD" & i + 1).value = Range("Z" & i + 1, "AA" & i + 1).value 
    End If 
Next i 
Application.ScreenUpdating = True 

如果你想做更多的陣列的工作,你需要做的是什麼,你實際上是在更新和你從什麼更新的陣列,然後將更新數組的值傳回單元格。如果速度是一個問題,你可能需要進行調查,看看是否會改善它。

+0

我嘗試這個代碼,並與行數我有它似乎並沒有加快速度向上。有趣的是,我在IF語句中包含的參數越多,運行所需的時間就越少。 – Chris2015

+0

我知道有一種方法可以創建到.Formula的轉移,然後添加回到我的工作表中,但我不清楚如何去做這件事。 – Chris2015

+0

對,除非你有很多數據,否則你不會注意到速度上的很大差異。這應該是相當快的。我只是將其更改爲檢查S列,因爲檢查完畢後,因爲在代碼中沒有使用列A,所以更有意義。 –

2

下面是剛剛粘貼公式在規定範圍內,然後再拷貝了他們作爲值替代:

Sub FastPaste() 
Dim LastRow As Long 

LastRow = Range("A" & Rows.Count).End(xlUp).Row 
With Range("AC2" & ":AD" & LastRow) 
    .FormulaR1C1 = "=IF(RC19>0.0014,RC[-3],"""")" 
    .Copy 
    .PasteSpecial (xlPasteValues) 
End With 
End Sub 
+0

如果它符合OP的要求,那將是更可取的......但是,對於S <0.0014'的任何行,該方法將在「AC」和「AD」列中產生空白單元格。我能想到糾正這種問題的唯一方法仍然需要循環。 –

+0

最終,我只是使用AC和AD的Countifs聲明,因此對於我的目的而言,S <.0014時是否存在空白單元格並不重要。我想我可以在我的countifs中加入<.0014,但我更喜歡將列中的信息隔離到一邊。 – Chris2015

+1

除非出於某種原因,您需要在代碼中執行此操作,爲何不在表單本身中添加「> 0.0014」?我顯然不太瞭解你在做什麼,但我的直覺是你可以用表格中的公式來處理它。 –