【发布时间】:2011-01-29 12:05:03
【问题描述】:
我正在循环中创建一个新对象,并将该对象添加到集合中;但是当我之后读回这个集合时,它总是完全被我添加的最后一个对象填满。我想出了两种解决方法,但我根本不明白为什么我的初始实现是错误的。
原文:
Dim oItem As Variant
Dim sOutput As String
Dim i As Integer
Dim oCollection As New Collection
For i = 0 To 10
Dim oMatch As New clsMatch
oMatch.setLineNumber i
oCollection.Add oMatch
Next
For Each oItem In oCollection
sOutput = sOutput & "[" & oItem.lineNumber & "]"
Next
MsgBox sOutput
这导致每个 lineNumber 为 10;我显然不是在创建新对象,而是在每次循环中都使用同一个对象,尽管声明位于循环内部。
所以,我在Next 行之前添加了Set oMatch = Nothing,这解决了问题,它现在是0 到10。所以如果旧对象被显式销毁,那么它愿意创建一个新对象吗?我会认为循环的下一次迭代会导致循环中声明的任何内容都因范围而被破坏?
很好奇,我尝试了另一种声明新对象的方式:Dim oMatch As clsMatch: Set oMatch = New clsMatch。这也导致 0 到 10。
谁能向我解释为什么第一个实现是错误的?
【问题讨论】:
-
在 VBA 中使用“As New”被认为是不好的做法。当您发现困难的方式时,它可能会导致各种细微的错误。最好在顶部声明所有变量并在适当的地方使用“= New”。 (旁注:我会在 VB.Net 中说完全相反)
-
VBA 中最小的可能范围是过程级;
For...Next块(或任何其他块)不会创建范围。