我已經實作了這種方法,將每個陣列元素乘以變數中的一個數字,它有效,但我相信它非常慢。是否有一種公認的“最快”方法將范圍內的每個元素乘以一個常數?或者至少一個不那么慢?我必須這樣做 10 次,這需要幾分鐘。這是我的緩慢解決方案:
MultFactor = 10
For Each cell In Sheet1.Range("B3:B902")
cell.Value = cell.Value * MultFactor
Next cell
這里參考的解決方案(有 14 個贊):
將整個范圍乘以值?
乘以一個常數(不是變數),但即使我按原樣使用此代碼(除了將范圍從“A1:B10”更改為“B3:B902”),
Dim rngData As Range
Set rngData = Sheet12.Range("B3:B902")
rngData = Evaluate(rngData.Address & "*2")
我得到一個無意義的答案。我在 B3:B902 中的原始值對于前 100 個元素左右為零,然后增加一點,最后減少并再次出現零,但最終在我的范圍內是一系列數字,破壞了我范圍內的所有內容。它從 -224.5 開始,一直減少 0.5 到最后一個單元格。
-224.5
-224.0
-223.5
etc
即使這樣有效,我將如何修改它以使用變數 MultFactor?我一定在這里做錯了什么,但不知道是什么。如果有人能發現我做錯了什么,我將不勝感激。
uj5u.com熱心網友回復:
這將快數百到數千倍。不同之處在于,所有的計算都是針對 VBA 陣列而不是直接針對作業表單元格的,一一進行。更新陣列后,它會一次性寫回作業表。這將作業表互動減少到只有兩個實體,讀取和寫入陣列。減少 VBA 代碼接觸作業表端任何內容的實體數量對于執行速度至關重要。
Sub Mozdzen()
Const FACTOR = 10
Const SOURCE = "B3:B902"
Dim i&, v
v = Sheet1.Range(SOURCE)
For i = 1 To UBound(v)
v(i, 1) = v(i, 1) * FACTOR
Next
Sheet1.Range(SOURCE) = v
End Sub
基于上述思想,管理代碼的更好方法是使用專用函式封裝陣列乘法:
Sub Mozdzen()
Const FACTOR = 10
Const SOURCE = "B3:B902"
With Sheet2.Range(SOURCE)
.Value2 = ArrayMultiply(.Value2, FACTOR)
End With
End Sub
Function ArrayMultiply(a, multfactor#)
Dim i&
For i = 1 To UBound(a)
a(i, 1) = a(i, 1) * multfactor
Next
ArrayMultiply = a
End Function
uj5u.com熱心網友回復:
你需要:
rngData = Sheet12.Evaluate(rngData.Address & "*2")
因為地址屬性默認不包括作業表名稱(因此您的公式是在活動作業表范圍 B3:B902 的背景關系中評估的)
那么它需要:
rngData = Sheet12.Evaluate(rngData.Address & "*" & MultFactor)
添加你的變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470796.html