2016-06-22 36 views
0

我想讓選中的一列所有的單元格都是正面的。我創建了這個宏,它正在工作....只需要一段時間。它現在已經運行了大概5分鐘。請注意,我有200k行數據供它搜索......任何人之前都有這個問題,或者想法下次更快?VBA絕對宏觀考慮forver

Sub Positive() 
Dim Cel As Range 
For Each Cel In Selection 
If IsNumeric(Cel.Value) Then 
Cel.Value = Abs(Cel.Value) 
End If 
Next Cel 
End Sub 
+0

'Application.ScreenUpdating =假 對於... 接下來 Application.ScreenUpdating = TRUE; 可能會加速它up up bit – Skaterhaz

+0

你的選擇是什麼?如果是整個工作表,請記住它是 1,048,576行16,384列(數十億操作)。限制您的選擇,並且速度會更快 –

+0

嘗試[代碼審查](http://codereview.stackexchange.com/) – findwindow

回答

4

試試這個,讓我知道該怎麼表現是:

Option Explicit 

Sub Positive() 

Dim varArray As Variant 
Dim lngRow As Long, lngColumn As Long 

varArray = Selection.Value2 
For lngRow = LBound(varArray, 1) To UBound(varArray, 1) 
    For lngColumn = LBound(varArray, 2) To UBound(varArray, 2) 
     If IsNumeric(varArray(lngRow, lngColumn)) Then 
      varArray(lngRow, lngColumn) = Abs(varArray(lngRow, lngColumn)) 
     End If 
    Next lngColumn 
Next lngRow 
Selection.Value2 = varArray 

End Sub 
1

我認爲你可以將範圍保存到一個數組,然後處理數組並將其寫回的範圍內,沒有測試,但應該接近。

Dim myArr() As Variant 
myArr = Range("A1:A10") 
Dim iCount As Long 
For iCount = LBound(myArr) To UBound(myArr) 
    myArr(iCount) = abs(myArr(iCount)) 
Next iCount 
Range("A1:A10") = myArr 
+0

看來我們有相同的想法。 – Ralph

+0

@Ralph我應該更快! – SlowLearner