如何从 VBA 函数返回自定义类型

Posted

技术标签:

【中文标题】如何从 VBA 函数返回自定义类型【英文标题】:How to return custom type from VBA function 【发布时间】:2019-08-02 09:20:02 【问题描述】:

我想从 VBA 函数返回自定义类型。当我运行以下代码时,我收到错误“第 16 行错误 - 类型不匹配”。我真的不明白出了什么问题。

Type FullName
    FirstName As String
    LastName As String
End Type

Sub Main 
Dim fullName As FullName
fullName = GetName()

MsgBox fullName.FirstName &" "& fullName.LastName

End Sub

Function GetName() As FullName
    Dim temp As FullName
    temp.FirstName = "John"
    temp.LastName = "Doe"

    Set GetName = temp

End Function

【问题讨论】:

你可以试试 [GetName = temp] 而不是 [Set GetName = temp] 我试过了,结果一样 我打开了一个新的 Excel,创建了一个新的模块,粘贴了您的代码,并检查了它是否失败。然后退出“设置”。它运行正常。 好的,我在 Rumba 脚本引擎中运行它。所以也许这就是问题 【参考方案1】:

试试这个

Function GetName() As fullName
    Dim temp As fullName
    temp.FirstName = "John"
    temp.LastName = "Doe"

    With temp
        GetName.FirstName = .FirstName
        GetName.LastName = .LastName
    End With

End Function

但是GetName = temp 应该也可以工作

【讨论】:

现在我得到“在线错误:20-GetName__.FirstName = .FirstName”。我在 Rumba 大型机模拟器的 Rumba 脚本引擎中运行此代码。但这只是使用 VBA 和一些额外的命令 对不起,我没有 Rumba 脚本引擎,假设您在 excel 及其 vba 引擎中使用此代码,如标签所示。那就另当别论了。【参考方案2】:

这就是我的工作方式,删除了函数中的Set()

Option Explicit

Type FullName

    FirstName As String
    LastName As String

End Type

Sub Main()

    Dim myFullName As FullName
    myFullName = GetName()
    Debug.Print myFullName.FirstName & " " & myFullName.LastName

End Sub

Function GetName() As FullName

    Dim temp As FullName
    temp.FirstName = "John"
    temp.LastName = "Doe"
    GetName = temp

End Function

引入myFullName,是为了区分FullName类型和同名变量。在 C# 中,我会使用 fullNameFullName,但在 VBA 中不支持这种“奢侈”。

【讨论】:

【参考方案3】:

请尝试一下

 Public Type FullName

   FirstName As String
   LastName As String

  End Type

Function GetName() As FullName

   Dim temp As FullName

       temp.FirstName = "John"
       temp.LastName = "Doe"

       GetName = temp

 End Function

【讨论】:

以上是关于如何从 VBA 函数返回自定义类型的主要内容,如果未能解决你的问题,请参考以下文章

Java中如何调用函数和自定义函数

Java中自定义方法,如果无返回值,该如何调用呢?

定义返回空白的自定义 VBA 函数

将excel VBA中的日期类型(Sun Apr 01 00:00:00 UTC 2018)转换为自定义函数

thinkphp的自定义返回类型具体是如何使用的?

在 VBA 中使用自定义数据类型