【问题标题】:How to put user defined datatype into a Dictionary如何将用户定义的数据类型放入字典
【发布时间】:2012-02-07 14:39:26
【问题描述】:

我正在尝试定义自己的数据类型并将其作为值放入字典中。 VBA 抱怨它不接受我的数据类型。关于如何让它发挥作用的任何想法?

Option Explicit

Public Type Translation
    german As String
    french As String
    italian As String
End Type

Private resource As Object

Public Sub addTranslation(key As String, g As String, f As String, i As String)
    Dim trx As Translation
    trx.german = g
    trx.french = f
    trx.italian = i

    resource.add key, trx  '<== here VBA is complaining
End Sub

Public Sub initResource()
    If resource Is Nothing Then Set resource = CreateObject("scripting.dictionary")
End Sub

这是错误信息:

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

【问题讨论】:

  • 只有在公共对象模块中定义的用户定义类型才能被强制传入或传出变体或传递给后期绑定模块。
  • 如果您将行更改为“resource.Add key, trx.french”,那么它将编译,但我无法告诉您您的目标是什么。 “bla” = “add”吗?
  • 谢谢!改进了问题。
  • 不,resource.Add 键,trx.french 也无济于事,目的是用一个键存储所有语言。

标签: excel vba excel-2010


【解决方案1】:

经过一番挖掘,我找到了这个答案:

如果要将用户定义的数据类型放入 Collection 的字典中,则必须将其定义为类。您可以通过添加一个新的类模块并添加以下代码来做到这一点:

Public german As String
Public french As String
Public italian As String

由于我将类模块命名为 trans,因此生成的代码如下所示:

Private resource As Object

Public Sub addTranslation(k As String, g As String, f As String, i As String)
    Dim trx As trans
    Set trx = New trans
    trx.german = g
    trx.french = f
    trx.italian = i

    resource.Add k, trx
End Sub

Public Sub initTranslations()
    If resource Is Nothing Then Set resource = CreateObject("scripting.dictionary")
End Sub

现在我可以动态添加翻译了。

【讨论】:

  • 谢谢。这太愚蠢了,也适用于返回用户定义类型/类的数组......
  • 我离开了 VBA,我发誓永远放弃它。我回来了,涉猎。我忘记了自己,涉水而回……直到失望再次席卷我……带着它是第二次被愚弄的耻辱。简明问答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2017-09-23
  • 2020-08-31
  • 1970-01-01
相关资源
最近更新 更多