我对VBA中的功能有一个非常基本的问题。基本上,我想创建一个函数,它将返回2个输出,一个标量和一个矩阵。用户应该能够将这些结果存储到VBA中的单独变量中,并将它们显示在Excel电子表格中。
我的方法:
我显然可以使用2种不同的功能,但这并不优雅且涉及冗余计算
我创建了一个具有2个属性的类,然后将我的函数定义为该类的实例,将我的标量和矩阵存储为这些属性。问题是,在这种情况下,我不知道如何在Excel中轻松显示我的结果。
我担心我在这里遗漏了一些非常基本的东西,希望你能给我一些指导......非常感谢你的帮助:)。
答案 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