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

MyD*_*ons 4 vba

我正在努力学习一些 VBa 和 Excel。我需要在 VBa 中创建一个结构,它是一个Type. 我遇到的问题是,当我尝试执行代码时收到错误消息!我觉得我需要解释一下我是如何到达现在的位置的,以防我犯了错误。

我读过要创建一个类型,它需要公开。因此,我创建了一个新类(在类模块下)。在Class1中,我写了

Public Type SpiderKeyPair
    IsComplete As Boolean
    Key As String
End Type
Run Code Online (Sandbox Code Playgroud)

我里面ThisWorkbook有以下内容

Public Sub Test()    
    Dim skp As SpiderKeyPair
    skp.IsComplete = True
    skp.Key = "abc"    
End Sub
Run Code Online (Sandbox Code Playgroud)

没有其他代码。我遇到的问题是收到错误消息

无法在对象模块中定义公共用户定义类型

如果我将类型设置为私有,则不会收到该错误,但当然我无法访问该类型的任何属性(使用 .NET 术语)。

如果我将代码从 Class1 移动到 Module1 中,它就可以工作,但是,我需要将其存储到一个集合中,这就是它出错的地方,也是我陷入困境的地方。

我已经更新Test

Private m_spiderKeys As Collection 

Public Sub Test()                
    Dim sKey As SpiderKeyPair
    sKey.IsComplete = False
    sKey.Key = "abc"            
    m_spiderKeys.Add (sKey)    'FAILS HERE            
End Sub
Run Code Online (Sandbox Code Playgroud)

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

我已经研究过这个,但我不明白我需要做什么...如何将 SpiderKeyPair 添加到我的集合中?

小智 5

遇到了完全相同的问题并浪费了很多时间,因为错误信息具有误导性。我怀念 List<>。

在 Visual Basic 中,您不能真正将所有内容都视为对象。您的结构和类在内存分配方面存在差异:https://learn.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/data-types/structurals-and-classes

类型是一种结构(数组也是),因此如果您想要它们的“列表”,您最好使用数组及其附带的所有内容。

如果要使用Collection来存储“List”,则需要为要处理的对象创建一个Class。

并不令人惊奇......但这就是该语言所提供的。