首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数报表2输出的最简单方法

函数报表2输出的最简单方法
EN

Stack Overflow用户
提问于 2013-08-16 20:18:54
回答 3查看 73关注 0票数 1

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

我的方法:

  • 我显然可以使用2种不同的函数,但这并不优雅,而且涉及到冗余计算。
  • 我创建了一个具有2个属性的类,然后将函数定义为该类的实例,将标量和矩阵存储为这些属性。问题是,在这种情况下,我不知道如何在Excel中轻松地显示结果。

代码语言:javascript
复制
- I could however create 2 additional functions that would just read the respective (scalar or a matrix) output of the first function but this would again result in redundant computations.

恐怕我错过了一些最基本的东西,希望你能给我一些指导.非常感谢你的帮助:)

EN

回答 3

Stack Overflow用户

发布于 2013-08-16 20:26:02

您可以使用这两个属性创建一个类,并将该类的一个新实例作为返回值返回。那么您的调用代码必须同时读取这两个属性。

票数 1
EN

Stack Overflow用户

发布于 2013-08-16 20:34:34

最简单的方法?可能:

代码语言:javascript
复制
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 () Dim FunctionResult()作为变式Dim i和长FunctionResult = TwoOutputs MsgBox“标量:”& FunctionResult(0) For i= LBound(FunctionResult( 1),1) To UBound(FunctionResult(1),1)表示j= LBound(FunctionResult(1),2) To UBound(FunctionResult(1),2) MsgBox“矩阵loc(”&I& ",“&&j& "):&& FunctionResult(1)(i,j)下一个j-下一个j-下一个j
票数 1
EN

Stack Overflow用户

发布于 2013-08-16 20:56:46

你可以用ByRef。不过,可能不是最好的计划。

代码语言:javascript
复制
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)调用函数。假设函数不会频繁更改,您可能能够缓存函数的结果。它不会停止呼叫,但它会停止一些多余的计算。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18281507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档