我在循环中创建了一个新对象,并将该对象添加到集合中; 但是当我读回之后,它总是被我添加的最后一个对象填满.我想出了两种解决方法,但我根本不明白为什么我的初始实现是错误的.
原版的:
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
Run Code Online (Sandbox Code Playgroud)
这导致每行数为10; 我显然没有创建新对象,而是每次通过循环使用相同的对象,尽管声明在循环内部.
所以,我在行Set oMatch = Nothing之前立即添加Next,这解决了问题,它现在是0到10.所以如果旧对象被明确销毁,那么它是否愿意创建一个新对象?我原以为通过循环的下一次迭代会导致循环中声明的任何东西因范围而被破坏?
好奇,我尝试了另一种声明新对象的方法:Dim oMatch As clsMatch: Set oMatch = New clsMatch.这也导致0到10.
任何人都可以向我解释为什么第一次实施是错误的?
我最近不得不深入研究一些VB6代码,我看到了这个模式:
dim o as obj
set o = new obj
Run Code Online (Sandbox Code Playgroud)
为什么不呢?
dim o as new obj
Run Code Online (Sandbox Code Playgroud)
我记得15年前有一个很好的理由,但我不记得它现在是什么.谁还记得吗?原因仍然有效吗?
在VBA中,我可以通过以下两种方式之一创建对象:
'First way
Dim myCol1 As New Collection
'Second way
Dim myCol2 As Collection
Set myCol2 = New Collection
myCol1.Add "AAA" 'Works
myCol2.Add "BBB" 'Works as well
Run Code Online (Sandbox Code Playgroud)
第二种方式是第一种方式的更详细的版本,还是myCol1和myCol2对象之间实际上有区别?