【发布时间】: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 在哪里声明?
-
右击
Sdate或SetObjectValue并选择Definition。 -
@JonathanPorter 听起来您缺少 Sdate 的类模块
-
所以您有一个接受
Variant的外部函数,并且您正试图将一个(可能)使用过的已定义类型传递给它。你不能像错误描述所说的那样做。至于Sdate的未找到定义,它可能意味着也可能不意味着您缺少参考(Definition并不总是完美的)。按 F2 并在那里搜索Sdate以确认。可能是您缺少对包含Sdate定义的库的引用,然后您将能够运行该代码。
标签: vba microsoft-dynamics dynamics-sl