从函数,子或类型返回多个值?

Ken*_*nes 31 vba function return-value word-vba

所以我想知道,如何从VBA中的函数,子或类型返回多个值?我有这个主要的子应该从几个函数收集数据,但一个函数只能返回它看起来的一个值.那么如何将多个返回给子?

Mic*_*nis 49

您可能希望重新考虑应用程序的结构,如果您真的想要一个方法来返回多个值.

要么分开,要么不同的方法返回不同的值,或者找出逻辑分组并构建一个对象来保存可以返回的数据.

' this is the VB6/VBA equivalent of a struct
' data, no methods
Private Type settings
    root As String
    path As String
    name_first As String
    name_last As String
    overwrite_prompt As Boolean
End Type


Public Sub Main()

    Dim mySettings As settings
    mySettings = getSettings()


End Sub

' if you want this to be public, you're better off with a class instead of a User-Defined-Type (UDT)
Private Function getSettings() As settings

    Dim sets As settings

    With sets ' retrieve values here
        .root = "foo"
        .path = "bar"
        .name_first = "Don"
        .name_last = "Knuth"
        .overwrite_prompt = False
    End With

    ' return a single struct, vb6/vba-style
    getSettings = sets

End Function
Run Code Online (Sandbox Code Playgroud)

  • 对不起,这是一个措辞不好的评论.字符串或其他什么,你只能返回一件东西.Thing可以是单个字符串,也可以是包含多个属性的对象,这些属性本身就是字符串.但你不能回报多件事. (2认同)

One*_*ide 20

您可以尝试返回VBA集合.

只要您处理对值,例如"Version = 1.31",您就可以将标识符存储为键("Version"),将实际值(1.31)存储为项目本身.

Dim c As New Collection
Dim item as Variant
Dim key as String
key = "Version"
item = 1.31
c.Add item, key
'Then return c
Run Code Online (Sandbox Code Playgroud)

之后访问这些值是一件轻而易举的事情:

c.Item("Version") 'Returns 1.31
or
c("Version") '.Item is the default member
Run Code Online (Sandbox Code Playgroud)

是否有意义?


Mar*_*lan 14

想法:

  1. 使用传递参考(ByRef)
  2. 构建用户定义类型以保存要返回的内容,并返回该内容.
  3. 与2类似 - 构建一个类来表示返回的信息,并返回该类的对象......

  • @Kenny,看看'Type'语句的帮助.它应该让你开始. (5认同)

dlm*_*dlm 8

您还可以使用variant数组作为返回结果来返回任意值的序列:

Function f(i As Integer, s As String) As Variant()
    f = Array(i + 1, "ate my " + s, Array(1#, 2#, 3#))
End Function

Sub test()
    result = f(2, "hat")
    i1 = result(0)
    s1 = result(1)
    a1 = result(2)
End Sub
Run Code Online (Sandbox Code Playgroud)

因为你的调用者需要知道返回什么才能使用结果,所以很容易出现丑陋和容易出错的问题.


小智 5

一个函数返回一个值,但它可以“输出”任意数量的值。示例代码:

Function Test (ByVal Input1 As Integer, ByVal Input2 As Integer, _
ByRef Output1 As Integer, ByRef Output2 As Integer) As Integer

  Output1 = Input1 + Input2
  Output2 = Input1 - Input2
  Test = Output1 + Output2

End Function

Sub Test2()

  Dim Ret As Integer, Input1 As Integer, Input2 As Integer, _
  Output1 As integer, Output2 As Integer
  Input1 = 1
  Input2 = 2
  Ret = Test(Input1, Input2, Output1, Output2)
  Sheet1.Range("A1") = Ret     ' 2
  Sheet1.Range("A2") = Output1 ' 3
  Sheet1.Range("A3") = Output2 '-1

End Sub
Run Code Online (Sandbox Code Playgroud)


She*_* O. 5

您可以将 2 个或更多值返回给 VBA 或任何其他 Visual Basic 内容中的函数,但您需要使用称为 Byref 的指针方法。请参阅下面我的示例。我将创建一个函数来添加和减去 2 个值,例如 5,6

sub Macro1
    ' now you call the function this way
    dim o1 as integer, o2 as integer
    AddSubtract 5, 6, o1, o2
    msgbox o2
    msgbox o1
end sub


function AddSubtract(a as integer, b as integer, ByRef sum as integer, ByRef dif as integer)
    sum = a + b
    dif = b - 1
end function
Run Code Online (Sandbox Code Playgroud)