2013-02-28 112 views
2

我遇到了VBA Excel 2010的问题。我创建了一个名为'Enclosure'的自定义类,创建了一个实例并将其添加到dictonary中。
I 可以然后通过键循环,以确保它已被添加。
我无法取出机箱类。这里是我的提取子代码:Excel VBA:从字典中提取自定义类

Sub AddEnclosureItem(sItemToAdd As String, ByRef rdEnclosures As Scripting.Dictionary, dDebug As Boolean) 

Dim TempEnclosure As Enclosure ' hold enclosure we pull 

TempEnclosure = rdEnclosures(1) 

End Sub 

当我尝试编译我得到“对象变量或带块变量未设置”

任何想法是如何进行的?我读过一些地方,你可以声明一个字典,说明项目是一个特定的对象,但我不能在2010年得到它。这就是我所能想到的。或者是一种在箱体出来时投射出来的方式。

+1

尝试'设置TempEnclosure = rdEnclosures(1)':-) – 2013-02-28 12:23:36

+0

嗨,彼得, 是的我想通了,试图回答,但因为我是新的,我必须等待7个多小时。所以,对你的一个新问题先生,为什么我需要设置? 我还必须为类中的字典属性设置我的访问器,但忘记了为什么要这样做。 – grimchamp 2013-02-28 12:30:27

回答

1

将对象分配给变量时,必须使用Set关键字。与Set相反的是Let,它用于将值(不是对象)赋值给变量。 Let关键字是可选的,几乎没有人再使用它。

原因有SetLet是因为大多数对象有一个默认属性 - 这意味着如果您引用一个没有属性的选项,它将返回存储在默认属性中的值。 Value属性是一个常见的默认属性。此

x = Range("A1") 

是与此相同

x = Range("A1").Value 

是与此相同

Let x = Range("A1").Value 

任何是可接受的(虽然我更喜欢第二个)。这是伟大的,如果x是双人或字符串,但如果x是一个Range对象变量,你需要使用SET

Set x = Range("A1") 

如果省略了Set关键字,VBA假设你想Let并尝试分配(默认) Value property to x。这给出'Object variable或block not set'错误,因为它试图将一个Double或String分配给Range对象变量。

你的自定义类模块可能没有默认值,所以这些都不应该。但它确实如此。即使没有默认值,也必须使用Set来引用对象。

+0

谢谢你:)在后面看来,'set'这个词使得这一切都有意义,但是当你知道它的时候,它只是简单而已。我有另一个问题涉及此坐: http://stackoverflow.com/questions/15141872/vba-dictionary-memory-problems-populate-dict-removeall-populate-issues 非常感谢,如果你可以有看看。 – grimchamp 2013-02-28 17:30:09