2013-06-12 69 views
0

我只想運行一個(大)範圍,並用給定的替換值替換某些值(如果它們高於給定的最大值或小於給定的最小值...也是一個特定的字符)。在某個範圍內有條件地更改值的最有效方法?

我首先想到的是簡單地遍歷每個單元格,並檢查/更換必要的時候。我有一種感覺,這個程序雖然會很慢,但我很好奇,如果有更好的方法來實現這一點的話。

任何時候,我寫的代碼,做類似於此的VBA我看每個小區有東西其價值通過細胞改變的細胞,它看起來必須有更好的辦法。提前致謝。

編輯:

我還沒有寫這個實現又因爲我知道什麼結果將是,我寧願做不同的事情,如果有可能,但這裏是它會是什麼樣子

For something 
    If(Range.Value == condition) 
    Range.Value = replacement_value 
    Range = Range.Offset(a, b) 
End For 
+0

我自己不是Excel或任何「編程」(或所謂的編程),你可以在其中做的任何大風扇。我會建議在訪問時導入它(雖然它不會好得多,但仍然可以),假設你可以編寫簡單的查詢並安裝訪問 –

+3

Put'Application。ScreenUpdating = false「,然後是」Application.ScreenUpdating = true「。這應該會給你帶來顯着的性能提升。 – Jack

+1

同時將'application.calculation'設置爲手動(完成時返回自動) –

回答

2

在單獨的列中製作公式,然後copy/paste special,values only

= if(A2 > givenvalue; replace; if(A2< anothergivenvalue; anotherreplace; if (A2 = "particularcharacterortext"; replaceonemore; A2))) 

將公式放入空列中的空單元格中,將其拖動或複製/粘貼到整個列中。之後,如果新值正常,copy/paste values only到原來的位置。

0

下面的VBA代碼提供了一個簡單的框架,您可以自定義以滿足您的需求。它包含了許多針對您的問題的評論中提到的優化,例如關閉屏幕更新並將比較從工作表移至數組。

你會注意到宏做了一個相當大的比較和替換。我使用的數據集是在A1:Y100000範圍內的1到1000之間的250萬個隨機數。如果一個數字大於250且小於500,我用0替換它。這需要替換數據集中所有數字的24.9%。

Sub ReplaceExample() 

    Dim arr() As Variant 
    Dim rng As Range 
    Dim i As Long, _ 
     j As Long 
    Dim floor as Long 
    Dim ceiling as Long 
    Dim replacement_value 

    'assign the worksheet range to a variable 
    Set rng = Worksheets("Sheet2").Range("A1:Y100000") 
    floor = 250 
    ceiling = 500 
    replacement_value = 0 

    ' copy the values in the worksheet range to the array 
    arr = rng 

    ' turn off time-consuming external operations 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    Application.EnableEvents = False 

    'loop through each element in the array 
    For i = LBound(arr, 1) To UBound(arr, 1) 
     For j = LBound(arr, 2) To UBound(arr, 2) 
      'do the comparison of the value in an array element 
      'with the criteria for replacing the value 
      If arr(i, j) > floor And arr(i, j) < ceiling Then 
       arr(i, j) = replacement 
      End If 
     Next j 
    Next i 

    'copy array back to worksheet range 
    rng = arr 

    'turn events back on 
    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
    Application.EnableEvents = True 

End Sub 

我做了不同的選擇一些性能測試編碼這個簡單的比較和替換,與我期望與他人VBA性能結果一致的結果。我每次運行10次,計算每次運行所用的時間,並平均計算10次。

vba performance results

結果揭示了大的影響,使用陣列可以具有,尤其是當數據集很大:相對於所測試的代碼和變化的工作表單元格值一個接一個,將前述數組運算 - 將數據集從工作表複製到數組中,比較和更改數組值,然後將數組結果寫回工作表 - 在這種情況下,平均運行時間從3.6分鐘減少到4分鐘到4秒。

雖然關閉外部事件的優化在工作表操作中產生了明顯的差異,運行時間減少了22%,但是當大多數計算工作是基於數組的時候,這些優化幾乎沒有影響。

相關問題