È possibile utilizzare la classe di stack in System.Collections, come si può usare coda e altri. Basta cercare lo stack vb.net per la documentazione. Non ho provato tutti i metodi (ad esempio GetEnumerator - non so come usare un iteratore, se possibile in VBA). Utilizzando una pila o di una coda ti dà qualche bella benefici, di norma non così facile in VBA. È possibile utilizzare
anArray = myStack.ToArray
EVEN se lo stack è vuoto (Restituisce un array di dimensioni da 0 a -1).
Utilizzando un collezioni personalizzate oggetto, esso funziona molto veloce grazie alla sua semplicità e può essere facilmente riscritto (per esempio per il trattamento esclusivo varibles fortemente tipizzati). Potresti voler fare un controllo per lo stack vuoto. Se si tenta di utilizzare pop su uno stack vuoto, VBA non gestirà con grazia, come tutti nulli-oggetti.Ho trovato più ragionevole da usare:
If myStack.Count > 0 Then
dalla funzione utilizzando lo stack, invece di cottura in clsStack.Pop. Se lo inforni nella classe, una chiamata a Pop può restituire un valore di tipo prescelto - ovviamente puoi usarlo per gestire i valori vuoti, ma ottieni molto più dolore in quel modo.
Un esempio di utilizzo:
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
Utilizzando un LIFO-stack può essere estremamente utile!
Classe 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
fonte
2016-06-08 13:45:17
Benvenuti in StackOverflow! +1 per fornire un codice e mostrare quanto può essere semplice. Qualche avvertimento: 1) Usare '=' per restituire un valore nelle routine 'Push' e 'Pop' fallirà quando gli oggetti sono coinvolti a causa della fastidiosa sintassi VBA 'Set'. Vedere la fine di questa risposta: http://stackoverflow.com/questions/4716382/excel-select-case/4719706#4719706 2) Si tenga presente che l'indicizzazione in una raccolta è O (n) per volta. Vedi http://stackoverflow.com/questions/4827963/what-is-the-difference-between-the-time-complexity-of-th-two-ways-of-using-loo/4830157#4830157 – jtolle