有没有办法在 Excel VBA(Excel 2007)中向数字数组中添加一个常量而不循环?
例如,我有以下数组:
MyArray = (1,2,3,4,5)
我想获得:
MyArray = (2,3,4,5,6)
没有循环。
在电子表格上,如果值在单元格中A1:A5
,我可以选择B1:B5
并输入数组公式{=A1:A5+1}
MyArray = MyArray + 1
似乎不起作用(类型不匹配错误)。
有任何想法吗?
嗯,这是一种作弊:
a = Array(1, 2, 3, 4, 5)
Range("a1:e1") = a
b = Evaluate("=a1:e1+1")
也许这会将数组增加一:
v = Array(1, 2, 3, 4, 5)
With Application
v = .MMult([{1,1}], .Choose([{1;2}], v, 1))
End With
更新
这是一种更直接的方法,它还允许增加 2D 数组
v = Application.Standardize(v,-1,1)
工作表函数方法提供了大量的数学函数,但以下是我能找到的唯一可行的选项,用于支持参数和返回值中的 VBA 数组的基本算术:
(u-v)/w = .Standardize(u,v,w)
-u*v -w = .Fv(0,u,v,w)
int(u/v) = .Quotient(u,v)
这是一个用户定义的函数,可以为您解决问题。只需将参考单元格和增量值作为参数传递。
它不处理输入单元格中有字母的情况,因此您需要为此创建自己的处理或确保良好的数据。
Function udf_IncrementArrayByVal(cellRef As Range, increment As Double)
Dim tempStr As String
Dim splitArray() As String
Dim cntr As Long
Dim arrayLength As Long
tempStr = Replace(Replace(cellRef(1, 1).Value, ")", ""), "(", "")
splitArray = Split(tempStr, ",")
For cntr = 0 To UBound(splitArray)
splitArray(cntr) = splitArray(cntr) + increment
Next cntr
tempStr = "(" + Join(splitArray, ",") + ")"
udf_IncrementArrayByVal = tempStr
End Function