假设我们有两个变体X
和Y
,可能是数字,范围或数组。
是否有一种简单的方法来添加或乘以它们,如工作表公式=X+Y
和=X*Y
?
我想到的一种可能性是使用Evaluate操作,如下所示:
Dim X, Y
Sub AddMult()
Dim Add, Mult
X = Array(Array(1, 3), Array(2, 4))
Y = Array(1, 2)
Add = [GetX()+GetY()]
Mult = [GetX()*GetY()]
End Sub
Function GetX()
GetX = X
End Function
Function GetY()
GetY = Y
End Function
虽然看起来有点尴尬。还有其他想法吗?
(以下是相关问题:Multiplying arrays with scalars and adding in VBA。)
答案 0 :(得分:2)
在查看各种选项后,我已经确定了一个Worksheetfunction方法。最可行的算术计算候选者似乎属于金融类别。当PV
= 0时,从rate
函数的Excel帮助中,参数之间存在以下关系:pmt * nper + pv + fv = 0
。该关系也适用于每个其他相应的功能。因此,一种选择是:
Sub AddMult()
Dim X, Y, Add, Mult
X = Array(Array(1, 3), Array(2, 4))
Y = Array(1, 2)
With Application
Add = .Pmt(, -1, X, Y)
Mult = .PV(, 1, .PV(, X, Y))
End With
End Sub
对于变体的其他操作,可以使用更多的WorksheetFunction方法:
.SLN(x,y,1) 'x-y
.SLN(x,,y) 'x/y
.Power(x,y) 'x^y
.Quotient(x,y) 'x\y
.Delta(x,y) 'x=y
.GeStep(x,y) 'x>=y
注意:前缀Application
(不 Worksheetfunction
,不允许使用其他数据类型。)
答案 1 :(得分:0)
提供的代码在模块中有效。函数GetX()和GetY()是UDF,因此[GetX()]和[GetY()]可以对它们进行评估。但那么你的代码可能是最好的解决方案吗?当然,全局范围内有两个UDF和两个变量。但是另一个试图避免这种情况的解决方案会导致无穷无尽地检查Variants真正包含的可能性。
进一步的测试表明,如果将模块中的函数声明为私有,则甚至可以对其进行评估。全局变量也不得公开。所以你的解决方案 是我认为最好的解决方案。
Private X, Y
Sub AddMult()
Dim Add, Mult
X = [{4,5,6}]
Set Y = Range("A1:C200")
Add = [GetX() + GetY()]
Mult = [GetX() * GetY()]
End Sub
Private Function GetX()
GetX = X
End Function
Private Function GetY()
GetY = Y
End Function
问候
阿克塞尔