Comment puis-je trier une collection?
Personne ne sait comment trier une collection en VBA?
- Tout d'abord, vous devez définir ce qui est de la collecte et de la façon dont vous vous attendez à être triés. Sinon, il ne s'agit que de spéculations.
Vous devez vous connecter pour publier un commentaire.
Le code ci-dessous à partir de cette post utilise un tri à bulles
vTemp = cFruit(j)
et ne peux pas comprendre pourquoi.Set vTemp = cFruit(j)
m'a aidé, maintenant je suis coincé surcFruit.Add vTemp, vTemp, i
avec erreur d'exécution (13). .... VBA ..... >:(cFruit.Add vTemp, , i
@bmende j'ai DÛ sauter le paramètre clé, une telle douleur...Set
mot-clé que vous avez découvert. La clé d'une collection doit être une chaîne de caractères. Quand je suis en ajoutant les cordes, je peux utiliser la même chose pour les clés et l'élément. Mais lorsque l'élément est un objet, vous devez utiliser quelque chose de différent. Comme si vous étiez l'ajout de boutons de commande, vous pouvez utiliservTemp.Name
comme la clé (ou une autre chaîne de la propriété de l'objet). Certainement rien de mal avec l'aide de l'index comme vous l'avez fait, si.Tard pour le jeu... voici une implémentation de la MergeSort algorithme en VBA pour les deux Tableaux et les Collections. J'ai testé les performances de cette mise en œuvre à l'encontre de la BubbleSort mise en œuvre de la accepté de répondre à l'aide de chaines générées aléatoirement. Le tableau ci-dessous résume les résultats, c'est à dire que vous ne devez pas utiliser BubbleSort pour trier une collection VBA.
Vous pouvez télécharger le code source de mon GitHub ou tout simplement copier/coller le code source ci-dessous dans les modules appropriés.
Pour une collection
col
, il suffit d'appelerCollections.sort col
.Collections module
Module tableaux
IVariantComparator classe
Si aucune
IVariantComparator
est fourni à l'sort
méthodes, puis de l'ordre naturel qui est utilisé. Toutefois, si vous avez besoin de définir un ordre de tri différent (par exemple, l'envers), ou si vous voulez trier des objets personnalisés, vous pouvez mettre en œuvre laIVariantComparator
interface. Par exemple, pour trier dans l'ordre inverse, il suffit de créer une classe appeléeCReverseComparator
avec le code suivant:CReverseComparator classe
Ensuite appeler la fonction de tri comme suit:
Collections.sort col, New CReverseComparator
Matériel Bonus: Pour une comparaison visuelle entre les performances des différents algorithmes de tri découvrez https://www.toptal.com/developers/sorting-algorithms/
copyOf()
,length()
,swap()
. Il n'est pas testable dans sa forme actuelle, est-il destiné à être un autre module inclus avec la réponse?Vous pouvez utiliser un
ListView
. Même si c'est un objet d'INTERFACE utilisateur, vous pouvez utiliser ses fonctionnalités. Il prend en charge le tri. Vous pouvez stocker des données dansListview.ListItems
et puis trier comme ceci:mscomctl.ocx
.Collection est plutôt du mauvais objet pour le tri.
Le point de collecte est de fournir très vite accès à un certain élément identifié par une clé. Comment les articles sont stockés en interne devrait être hors de propos.
Vous pouvez envisager d'utiliser des tableaux à la place de collections, si vous avez réellement besoin de tri.
Autres que que, oui, vous pouvez trier les éléments dans une collection.
Vous avez besoin de prendre tout algorithme de tri disponibles sur Internet (vous pouvez google inplementations dans pratiquement n'importe quelle langue) et d'apporter une modification mineure où un échange se produit (d'autres changements sont inutiles car vba collections, comme des tableaux, peut être consulté avec les indices). Pour échanger deux éléments dans une collection, vous devez les supprimer à la fois de la collecte et de l'insérer à la bonne position (à l'aide de la troisième ou de la quatrième paramètre de la
Add
méthode)..add
en vba pour la dynamique des ajouts au Tableau.Collection
.Function foo() As Long()
retourne un tableau deLong
s. Vous êtes probablement penser à VB5.ThisWorkbook.Worksheets
collection est très pratique.Il n'est pas natif de tri pour les
Collection
en VBA, mais puisque vous pouvez accéder aux éléments de la collection par le biais de l'index, vous pouvez mettre en œuvre un algorithme de tri d'aller au moyen de la collecte et de tri dans une nouvelle collection.Voici un HeapSort l'implémentation de l'algorithme pour VBA/VB 6.
Voici ce qui semble être un BubbleSort l'implémentation de l'algorithme pour VBA/VB6.
Si votre collection ne contient pas d'objets et vous avez seulement besoin de trier par ordre croissant, vous pourriez trouver cela plus facile à comprendre:
J'ai piraté le cette en quelques minutes, et si cela peut ne pas être le meilleur de tri à bulles, mais il devrait être facile à comprendre, et donc facile à modifier pour votre propre usage.
Ce bout de code fonctionne bien, mais il est en java.
De traduire ce que vous pourriez faire comme ceci:
SeriesManager est juste une classe qui stocke la différence entre les deux valeurs. Il peut vraiment être n'importe quel nombre de la valeur que vous souhaitez trier. Par défaut trie dans l'ordre croissant.
J'ai eu de la difficulté à trier une collection en vba sans faire une classe personnalisée.
C'est ma mise en œuvre de BubbleSort:
Il prend de la collecte, par référence, donc il peut facilement retourner comme une fonction et c'est un paramètre facultatif pour les Ascendants et descendants de tri.
Le tri est de retour cette dans la fenêtre exécution:
C'est un VBA mise en œuvre de l'algorithme QuickSort, qui est souvent une meilleure alternative à MergeSort:
Les objets stockés dans la collecte doivent mettre en œuvre les
ISortableObject
interface, qui doit être défini dans votre projet VBA. Pour ce faire, ajouter un module de classe appelé ISortableObject avec le code suivant: