Compile error: Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions.
A method that returns or accepts a user-defined type (UDT) cannot be calledwhen using late binding.
Dim oMyObject as Object Dim MyUDT as Object Set oMyObject = CreateObject("MyProject.MyClass") MyUDT = oMyObject.MyMethod '<-- This line generates a run-time error ' if MyMethod returns a UDT.
To correct this problem, you can use either of the following two solutions:
Use early binding instead of late binding.
Modify the server so that the method returns an object of another class rather than a UDT.
This behavior is by design.
Steps to Reproduce Behavior
Create a new ActiveX EXE project.
On the Project menu, click Properties. Change the Project Name to "TestServer" and click OK.
Add the following code to Class1:
Public Type MyUDT x as Long y as Long End Type Public Function MyMethod() as MyUDT MyMethod.x = 1 MyMethod.y = 2 End Function
On the File menu, click Make TestServer.EXE.
Close this project and start a new Standard EXE project.
Add two command buttons to Form1.
Add the following code to Form1:
Private Type MyUDT x as Long y as Long End Type Private Sub Command1_Click() Dim obj1 as Object Dim obj2 as Object Set obj1 = CreateObject("TestServer.Class1") obj2 = obj1.MyMethod '<== Generates run-time error #429. End Sub Private Sub Command2_Click() Dim obj1 as Object Dim mu as MyUDT Set obj1 = CreateObject("TestServer.Class1") mu = obj1.MyMethod '<== Generates compile error. End Sub
Run the project by pressing F5 and click Command1. You receive the run-time error #429. Click End to end the program.
Run the project once more and click Command2. You receive the compile error described at the beginning of this article.
For information about binding ActiveX components in your project, refer tothe "Declaring an Object Variable" and "How Binding Affects ActiveXComponent Performance" topics in the Visual Basic product documentation.
For information about creating your own collection classes, refer to the"Using Properties and Collections to Create Object Models" topic in theVisual Basic product documentation.