如何从 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# 中,我会使用 fullName
和 FullName
,但在 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 函数返回自定义类型的主要内容,如果未能解决你的问题,请参考以下文章