Вы можете использовать класс Stack в System.Collections, как вы можете использовать Queue и другие.Просто найдите стек vb.net для документации.Я не пробовал все методы (например, Getenumerator - я не знаю, как использовать итератор, если это вообще возможно в VBA).Использование стека или очереди дает вам хорошие преимущества, которые обычно не так просты в VBA.Вы можете использовать
anArray = myStack.ToArray
EVEN, если стек пуст (возвращает массив размером от 0 до -1).
Используя пользовательский объект коллекций, он работает очень быстро благодаря своей простотеи может быть легко переписан (например, обрабатывать только строго типизированные переменные).Вы можете проверить наличие пустого стека.Если вы попытаетесь использовать Pop в пустом стеке, VBA не будет корректно обрабатывать его, как все нулевые объекты.Я нашел более разумным использовать:
If myStack.Count > 0 Then
из функции, использующей стек, вместо того, чтобы запекать ее в clsStack.Pop.Если вы запечете это в классе, вызов Pop может вернуть значение выбранного типа - конечно, вы можете использовать это для обработки пустых значений, но вы получите гораздо больше горя в этом случае.
Пример использования:
Private Sub TestStack()
Dim i as long
Dim myStack as clsStack
Set myStack = New clsStack
For i = 1 to 2
myStack.Push i
Next
For i = 1 to 3
If myStack.Count > 0 Then
Debug.Print myStack.Pop
Else
Debug.Print "Stack is empty"
End If
Next
Set myStack = Nothing
End Sub
Использование LIFO-стека может быть чрезвычайно полезным!
Класс clsStack
Dim pStack as Object
Private Sub Class_Initialize()
set pStack = CreateObject("System.Collections.Stack")
End Sub
Public Function Push(Value as Variant)
pStack.Push Value
End Function
Public Function Pop() As Variant
Pop = pStack.Pop
End Function
Public Function Count() as long
Count = pstack.Count
End Function
Public Function ToArray() As Variant()
ToArray = pStack.ToArray()
End Function
Public Function GetHashCode() As Integer
GetHashCode = pStack.GetHashCode
End Function
Public Function Clear()
pStack.Clear
End Function
Private Sub Class_terminate()
If (Not pStack Is Nothing) Then
pStack.Clear
End If
Set pStack = Nothing
End Sub