最简单的方法是使功能报告2输出

时间:2013-08-16 20:18:55

标签: excel vba

我对VBA中的功能有一个非常基本的问题。基本上,我想创建一个函数,它将返回2个输出,一个标量和一个矩阵。用户应该能够将这些结果存储到VBA中的单独变量中,并将它们显示在Excel电子表格中。

我的方法:

  • 我显然可以使用2种不同的功能,但这并不优雅且涉及冗余计算

  • 我创建了一个具有2个属性的类,然后将我的函数定义为该类的实例,将我的标量和矩阵存储为这些属性。问题是,在这种情况下,我不知道如何在Excel中轻松显示我的结果。

    • 然而,我可以创建另外两个函数来读取第一个函数的相应(标量或矩阵)输出,但这会再次导致冗余计算。

我担心我在这里遗漏了一些非常基本的东西,希望你能给我一些指导......非常感谢你的帮助:)。

3 个答案:

答案 0 :(得分:1)

您可以使用这两个属性创建一个类,并返回此类的新实例作为返回值。然后你的调用代码必须读取两个属性。

答案 1 :(得分:1)

最简单的方法?大概是:

Function TwoOutputs() As Variant()

    Dim matrix(1 To 2, 1 To 3) As Variant

    matrix(1, 1) = "Did"
    matrix(1, 2) = "it"
    matrix(1, 3) = "work?"

    matrix(2, 1) = "Yes"
    matrix(2, 2) = "it"
    matrix(2, 3) = "did!"

    TwoOutputs = Array("scalar", matrix)

End Function

然后,要访问您想要的任何属性,您可以:

  • 在VBA中(0将返回标量,2将返回矩阵):

    Sub tst()
    
        Dim FunctionResult() As Variant
        Dim i As Long
        Dim j As Long
    
        FunctionResult = TwoOutputs
    
        MsgBox "Scalar: " & FunctionResult(0)
    
        For i = LBound(FunctionResult(1), 1) To UBound(FunctionResult(1), 1)
            For j = LBound(FunctionResult(1), 2) To UBound(FunctionResult(1), 2)
                MsgBox "Matrix loc(" & i & ", " & j & "): " & FunctionResult(1)(i, j)
            Next j
        Next i
    
    End Sub
    

答案 2 :(得分:1)

您可以使用ByRef。可能不是最好的计划。

Sub Example(ByRef A As String, ByRef B As String)
A = A & "Hello"
B = B & "World!"
End Sub

Sub test()
Dim A As String
Dim B As String

    A = "Test"
    B = "Test"

    Example A, B

    Debug.Print A & " " & B

End Sub

修改

如果您尝试在工作表上提供UDF,那么您可以完全忽略我。

如果您从工作表中调用此(无论您的解决方案是什么),我认为您将始终对该函数进行多次(2)调用。假设它不经常更改,您可以缓存函数的结果。 它不会停止通话,但会停止一些额外的计算。

Private Cache As Object

Public Function MonsterFunction(ByVal A As Integer, ByVal B As Integer, Optional ByVal Add As Boolean = False) As Variant
Dim Key As String
Dim Result As Integer

Key = CStr(A) & IIf(Add, "+", "-") & CStr(B)

If Cache Is Nothing Then
    Set Cache = CreateObject("Scripting.Dictionary")
End If

If Cache.Exists(Key) Then
    MonsterFunction = Cache(Key)
Else
    If Add Then
        Result = A + B
    Else
        Result = A - B
    End If

    Cache.Add Key, Result
    MonsterFunction = Result
End If

End Function