Je cherche à mettre en place une classe "Stack" dans VBA pour Excel. Je veux utiliser une dernière structure de première sortie. Est-ce que quelqu'un est tombé sur ce problème avant? Connaissez-vous une structure de manutention des bibliothèques externes telles que la pile, la hâte, le vecteur ... (à part la collection Excel d'origine, etc.) p>
merci p>
4 Réponses :
Je ne connais pas de bibliothèques VBA externes pour ces structures. Pour ma pile d'appels de procédure, j'utilise simplement un pointeur global de tableau et de tableau avec des méthodes PUSH et POP. P>
Bruce McKinney a fourni le code d'une pile, une liste et vecteur dans ce livre (c'était VB5 (!), mais cela n'a probablement pas beaucoup d'importance): P>
http://www.amazon.com/hardcore -Vistual-Basic-Bruce-McKinney / DP / 1572314222 P>
(C'est hors d'impression, mais les copies utilisées sont bon marché.) p>
Le code source semble être disponible ici: P>
http://vb.mvps.org/hardweb/mckinney2a.htm#2 p>
(CAVEATER - Je n'ai jamais utilisé de son code, mais je sais qu'il est un expert VB de longue date de longue date et son livre a été inclus sur MSDN pendant une longue période.) P>
Je suis sûr qu'il y a aussi de nombreuses implémentations différentes pour ces choses flottant autour d'Internet, mais je ne sais pas si l'un d'entre eux est largement utilisé par quiconque mais leurs auteurs. P>
Bien sûr, aucun de ces éléments n'est difficile d'écrire votre propre code pour, étant donné que VBA prend en charge des tableaux séminés (la plupart du chemin d'un vecteur) et fournit une classe de collecte intégrée (la plupart du chemin à un liste). La réponse de Charles William pour une pile concerne toutes les informations dont vous avez besoin. Il suffit de fournir votre propre enveloppe autour d'une matrice ou d'une collection, mais le code à l'intérieur peut être relativement trivial. P>
Pour une haquetable, l'exécution de script MS comprend une classe de dictionnaire qui en est essentiellement une. Voir: P>
Je devrais souligner que le code de McKinney n'est pas tout à fait "trivial". Il fournit également des cours d'itérateurs pour ses collections, etc.
Voici une classe de pile très simple. Testez-le P> Option Explicit
Sub test()
Dim cs As New cStack
Dim i As Long
Set cs = New cStack
With cs
.init
For i = 1 To 10
Debug.Print CStr(.Push(i))
Next i
For i = 1 To 10
Debug.Print CStr(.Pop)
Next i
End With
End Sub
Bienvenue à Stackoverflow! +1 pour fournir du code et montrer à quel point cela peut être simple. Quelques mises en garde: 1) Utilisation '=' pour renvoyer une valeur dans vos routines "PUSH" et "POP" échouera lorsque des objets sont impliqués en raison de la syntaxe "Set" gênante VBA. Voir la fin de cette réponse: 2) Sachez que l'indexation dans une collection est O (n) pour temps. Voir
Vous pouvez utiliser la pile de classe dans System.Collections, comme vous pouvez utiliser la file d'attente et d'autres. Il suffit de rechercher une pile vb.net pour la documentation. Je n'ai pas essayé toutes les méthodes (par exemple Getenumerator - Je ne sais pas comment utiliser un itérateur, si possible dans VBA). L'utilisation d'une pile ou d'une file d'attente vous donne de bons avantages, normalement pas si facile dans VBA. Vous pouvez utiliser même si la pile est vide (renvoie une matrice de taille 0 à -1). P> Utilisation d'un objet Collections personnalisé, cela fonctionne très rapidement. à sa simplicité et peut facilement être réécrit (par exemple, ne manipuler que des varibes fortement typées). Vous voudrez peut-être faire un chèque pour la pile vide. Si vous essayez d'utiliser Pop sur une pile vide, VBA ne le gérera pas gracieusement, comme tous les objets nuls. Je l'ai trouvé plus raisonnable d'utiliser: p> de la fonction à l'aide de la pile, au lieu de la cuisson dans CLSStack.pop. Si vous le faites cuire dans la classe, un appel à POP peut retourner une valeur de type choisi - bien sûr, vous pouvez utiliser ceci pour gérer des valeurs vides, mais vous obtenez beaucoup plus de chagrin de cette façon. P> Un exemple de Utilisation: p> 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