Добрый день!
Написал (на VBA 6)небольшой класс для работы с иерархиеческой структурой - можно строить дерево с бесконечным уровнем вложенности. Вот кусок
cDivision.cls
01 Private pName As String
02 Private pCCode As String
03 Private pMach As Boolean
04 Private pLevel As Long
05 Private pUID As Long
06 Private pParentID As Long
07 Public Units As Collection
08 Public Property Let Level(value As Long)
09 pLevel = CLng(value)
10 End Property
11 Public Property Get Level() As Long
12 Level = pLevel
13 End Property
Public Function FindEx(Name As String, Level As Long) As CSubdivision
Dim Unit As CSubdivision
Dim Child As CSubdivision
Dim i As Long
10 If (CStr(Name) = pName) And (CLng(Level) = pLevel) Then
20 Set FindEx = Me
30 Exit Function
40 End If
50 For Each Child In Units
60 Set Unit = Child.FindEx(Name, Level)
70 If Not (Unit Is Nothing) Then
80 Set FindEx = Unit
90 Exit Function
100 End If
110 Next Child
120 Set FindEx = Nothing
130 End Function
Главное тут FindEx - ищет нужную ветвь, рекурсивно высывая себя.
Процедура уходит вглубь на обну ветку, а если там ничего не нашел должен выйти выше на другую ветку, о опять начать спускаться.
Затем захотел использовать не Collection, а Scripting.Dictionary.
Замнил строки на такие:
07 Public Units As Scripting.Dictionary
50 For i = 0 To Units.Count
60 Set Unit = Units.Items(i).FindEx(Name, Level)
70 If Not (Unit Is Nothing) Then
80 Set FindEx = Unit
90 Exit Function
100 End If
110 Next i
Теперь возникает проблема: не хочет возращаться на уровень выше, валиться при вызове Units.Items(i).FindEx(Name, Level), если i=0.
Как бы мне правильно написать? И почему с For Each работает?
Ответить
|