VBA:只有在公共对象模块中定义的用户定义类型才能被强制转换为变体或从变体强制转换或传递给后期绑定函数

Posted

技术标签:

【中文标题】VBA:只有在公共对象模块中定义的用户定义类型才能被强制转换为变体或从变体强制转换或传递给后期绑定函数【英文标题】:VBA: Only user-defined types defined in public object modules can be coerced to or from a variant or passed to a late-bound functions 【发布时间】:2017-09-14 20:36:57 【问题描述】:

编译错误:

编译错误:只有在公共对象中定义的用户定义类型 模块可以被强制转换为变体或从变体强制转换或传递给后期绑定 功能。

我是 VBA 新手,我的任务是为 Dynamics SL 中的自定义屏幕调试一些代码。我做的第一件事是查看它是否编译并收到上述消息。

当我阅读内置帮助参考时,我发现上述错误如下:

您试图使用公共用户定义类型作为参数或 类模块的公共过程的返回类型,或作为 公共用户定义类型。只有公共的用户定义类型 可以以这种方式使用在公共对象模块中定义的。

我也遇到过类似的问题:

How to put user defined datatype into a Dictionary Only user-defined type defined in public object modules can be coerced when trying to call an external VBA function

他们有同样的错误,但我没有看到上述两个问题关注的集合对象。

如果您知道可能导致此错误的原因,请随时提出建议。

代码:

Private Sub cpjt_entity_Chk(ChkStrg As String, retval As Integer)
Dim ldDate As Sdate
Dim xStrDailyPost As Sdate

ldDate.val = GetObjectValue("cpe_date")
'xStrDailyPost = DateToStr(ldDate)
'Call MsgBox("Daily Post Date: " & xStrDailyPost, vbOKOnly, "TEST")
serr1 = SetObjectValue("cld_id08", xStrDailyPost) <- Error highlights "xStrDailyPost"

End Sub

SetObjectValue 的定义:

Declare Function SetObjectValue Lib "swimapi.dll" Alias "VBA_SetObjectValue" (ByVal ctlname$, newval As Variant) As Integer

提前谢谢你!

【问题讨论】:

该错误不是由集合引起的,而是在使用它们时可能发生,因为它们接受Variant,就像错误描述中所说的那样。 SetObjectValue是什么,它的第二个参数是怎么声明的,Sdate是在哪里声明的? Sdate 似乎是用户定义的类型。 Sdate 在哪里声明? 右击SdateSetObjectValue并选择Definition @JonathanPorter 听起来您缺少 Sdate 的类模块 所以您有一个接受Variant 的外部函数,并且您正试图将一个(可能)使用过的已定义类型传递给它。你不能像错误描述所说的那样做。至于Sdate 的未找到定义,它可能意味着也可能不意味着您缺少参考(Definition 并不总是完美的)。按 F2 并在那里搜索 Sdate 以确认。可能是您缺少对包含 Sdate 定义的库的引用,然后您将能够运行该代码。 【参考方案1】:

您可能正在使用最初使用 Dynamics SL(实际上当时是 Solomon IV)基本脚本语言 (BSL) 宏语言而不是 VBA 编写的代码。

无论如何...解决方法是,传递 SDate 的 xStrDailyPost 实例的“val”方法的结果。所以代码应该是这样的:

serr1 = SetObjectValue("cld_id08", xStrDailyPost.val)

我还没有实际测试过,但我很确定这会解决您的问题。

如果您想要更多背景知识,“Sdate”实际上只是一个非常薄的整数包装(实际上我认为它很短,但我从未发现我真的需要确定)。 "Val" 方法返回 SDate 变量中的基础整数。

【讨论】:

以上是关于VBA:只有在公共对象模块中定义的用户定义类型才能被强制转换为变体或从变体强制转换或传递给后期绑定函数的主要内容,如果未能解决你的问题,请参考以下文章

访问未使用 FileOpenDialog 定义的 2010 vba 用户定义类型?

用户定义类型的 VarType

VBA 定义一个简单的静态公共数组

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

Java基础——面向对象

如何在 VBA 中设置全局变量