Есть объект Document.
У него есть иерархическая коллекция Tags, в которой хранятся элементы Tag, каждый из которых может иметь свою дочернюю коллекцию Tags (в Document хранится иерархическая коллекция HTML-тэгов).
Вот пример заполнения документа:
- Код: Выделить всё
Dim doc As New Document
With doc.Tags
.Add "DOCTYPE", True
With .Add("HTML").Childs
With .Add("HEAD").Childs
.Add "TITLE"
.Add "BASE"
.Add "META"
End With
With .Add("BODY").Childs
.Add "P"
With .Add("TABLE").Childs
With .Add("TR").Childs
With .Add("TD").Childs
.Add "P"
.Add "P"
.Add "P"
End With
With .Add("TD").Childs
.Add "P"
.Add "P"
.Add "P"
End With
End With
End With
.Add "IMG"
With .Add("DIV").Childs
.Add "IMG"
End With
End With
End With
End With
Допустим, есть такой код:
- Код: Выделить всё
Dim T As Tag
With tvwTest.Nodes
.Clear
For Each T In doc.Tags
Nodes.Add Text:=T.Name
Next T
End With
doc.CleanUp
Set doc = Nothing
В doc.CleanUp выполняется очистка данных (обнуляются ссылки и т.п.).
Так вот, после Set doc = Nothing в процедуре имеется одна незакрытая ссылка на Tags (если конкретно, то на doc.Tags). В doc.CleanUp эта ссылка обнуляется, значит есть еще одна объектная переменная, ссылающаяся на нее.
Если убрать For Each, то лишней ссылки не остается.
Если For Each оформить так:
- Код: Выделить всё
Dim C As Tags
Set C = doc.Tags
For Each T In C
...
Next T
Set C = Nothing
то лишней ссылки также не остается.
Или если вынести For Each в отдельную процедуру
- Код: Выделить всё
Private Sub test(doc As Document, Nodes As Nodes)
Dim T As Tag
For Each T In doc.Tags
Nodes.Add Text:=T.Name
Next T
End Sub
и вместо For Each вызывать Call test, то лишней ссылки также не остается.
Больше всего похоже на то, что For Each создает временную переменную, но не очищает ее, когда цикл отрабатывает.
Вопрос простой: что делать?