在VBA中添加或乘以变体

时间:2014-08-29 19:56:20

标签: excel vba variant

假设我们有两个变体XY,可能是数字,范围或数组。 是否有一种简单的方法来添加或乘以它们,如工作表公式=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。)

2 个答案:

答案 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

问候

阿克塞尔