如何使用 VBA 将 Excel 中的一系列值乘以标量变量 - 对类似问题的回答对我不起作用
How to multiply a range of values in Excel by a scalar variable using VBA - Answer to similarly asked question is not working for me
我已经实现了这个方法来将每个数组元素乘以一个保存在变量中的数字,它有效,但我认为它非常慢。是否有公认的“最快”方法将范围内的每个元素乘以常数?或者至少是一个不那么慢的?我必须这样做 10 次,这需要几分钟。这是我的慢速解决方案:
MultFactor = 10
For Each cell In Sheet1.Range("B3:B902")
cell.Value = cell.Value * MultFactor
Next cell
这里引用的解决方案(有14个赞):
Multiply Entire Range By Value?
乘以一个常量(不是变量),但即使我按原样使用此代码(除了将范围从“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?
我一定是在这里做错了什么,但不知道是什么。如果有人能发现我做错了什么,我将不胜感激。
你需要:
rngData = Sheet12.Evaluate(rngData.Address & "*2")
因为地址 属性 默认不包含 sheet 名称(因此您的公式是在活动 sheet 的范围 B3:B902)
那么需要:
rngData = Sheet12.Evaluate(rngData.Address & "*" & MultFactor)
添加您的变量。
这会快成百上千倍。不同之处在于,所有计算都是针对 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
我已经实现了这个方法来将每个数组元素乘以一个保存在变量中的数字,它有效,但我认为它非常慢。是否有公认的“最快”方法将范围内的每个元素乘以常数?或者至少是一个不那么慢的?我必须这样做 10 次,这需要几分钟。这是我的慢速解决方案:
MultFactor = 10
For Each cell In Sheet1.Range("B3:B902")
cell.Value = cell.Value * MultFactor
Next cell
这里引用的解决方案(有14个赞):
Multiply Entire Range By Value?
乘以一个常量(不是变量),但即使我按原样使用此代码(除了将范围从“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? 我一定是在这里做错了什么,但不知道是什么。如果有人能发现我做错了什么,我将不胜感激。
你需要:
rngData = Sheet12.Evaluate(rngData.Address & "*2")
因为地址 属性 默认不包含 sheet 名称(因此您的公式是在活动 sheet 的范围 B3:B902)
那么需要:
rngData = Sheet12.Evaluate(rngData.Address & "*" & MultFactor)
添加您的变量。
这会快成百上千倍。不同之处在于,所有计算都是针对 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