1

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

我的方法:

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

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

    • 但是,我可以创建 2 个附加函数,它们只会读取第一个函数的相应(标量或矩阵)输出,但这会再次导致冗余计算。

恐怕我在这里遗漏了一些非常基本的东西,希望您能给我一些指导……非常感谢您的帮助:)

4

3 回答 3

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
于 2013-08-16T20:56:46.943 回答
1

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

于 2013-08-16T20:26:02.660 回答
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
    
于 2013-08-16T20:34:34.213 回答