Tri d'une multidimensionnal tableau en VBA
J'ai défini le Tableau suivant Dim myArray(10,5) as Long
et tiens à les trier. Quelle serait la meilleure méthode pour le faire?
J'ai besoin de gérer un grand nombre de données comme un 1000 x 5 Matrice. Elle contient principalement des nombres et des dates et de la nécessité de trier en fonction d'une certaine colonne
Voir la accepté de répondre à question. Je ne sais pas exactement comment vous souhaitez faire le tri, mais vous pouvez modifier la mise en œuvre de l'algorithme QuickSort cependant vous avez besoin.
Salut BlackLabrador, je pense que nous aurions besoin d'un peu plus d'informations sur ce qu'est exactement que vous voulez faire ici... Êtes-vous en essayant de trier tous les 50 points en une longue liste, ou effectuer un tri par colonne', ou une 'ligne', ou d'une autre façon? Si vous éditez votre post afin d'inclure ce type d'information que vous êtes beaucoup plus susceptibles d'obtenir plus de/plus de réponses utiles.
Merci pour vos commentaires. Allons jeter un oeil à Cody lien
Salut BlackLabrador, je pense que nous aurions besoin d'un peu plus d'informations sur ce qu'est exactement que vous voulez faire ici... Êtes-vous en essayant de trier tous les 50 points en une longue liste, ou effectuer un tri par colonne', ou une 'ligne', ou d'une autre façon? Si vous éditez votre post afin d'inclure ce type d'information que vous êtes beaucoup plus susceptibles d'obtenir plus de/plus de réponses utiles.
Merci pour vos commentaires. Allons jeter un oeil à Cody lien
OriginalL'auteur BlackLabrador | 2011-02-02
Vous devez vous connecter pour publier un commentaire.
Voici un multi-colonne et une seule colonne de tri rapide pour VBA, modifiés à partir d'un exemple de code posté par Jim Rech sur Usenet.
Notes:
Vous remarquerez que je fais une beaucoup plus défensive de codage que vous voyez dans la plupart des exemples de code sur le web: c'est un Excel forum, et vous avez à anticiper des valeurs nulles et des valeurs vides... Ou imbriqués les tableaux et les objets dans les tableaux si votre tableau source vient de (disons) un tiers de marché en temps réel de la source de données.
Vide des valeurs et des objets non valides sont envoyés à la fin de la liste.
Votre appel sera:
...en Passant '2' que la colonne à trier et à l'exclusion de l'option paramètres qui passe les limites supérieure et inférieure du domaine de recherche.
[ÉDITÉ] - correction d'une drôle de formatage panne dans le <code> balises, qui semblent avoir un problème avec les liens hypertexte dans les commentaires du code.
Le lien Hypertexte j'excisée a été La détection d'un Tableau de Variant en VBA.
... Et le seul tableau de la colonne version:
J'ai l'habitude d'utiliser BubbleSort pour ce genre de chose, mais il ralentit, gravement, d'après le tableau dépasse 1024 lignes. - Je inclure le code ci-dessous pour votre référence: veuillez noter que je n'ai pas fourni le code source pour ArrayDimensions, donc ce ne sera pas le compiler pour vous, sauf si vous refactoriser - ou de le diviser en 'Array' et 'vector' versions.
Cette réponse peut-être arriver un peu en retard pour résoudre votre problème quand vous en avez besoin, mais à d'autres personnes de le ramasser quand ils Google pour obtenir des réponses pour des problèmes similaires.
Je ne peux pas reproduire, et il n'y a rien dans la "ligne de swapper" en boucle qui serait évidemment le faire: pouvez-vous développer votre point de vue afin que je puisse regarder cela d'un peu plus de profondeur?
sur le commentaire, votre question attiré mon attention sur un mal-placé
Redim
dans leWhile i <= j
boucle: c'est une allocation, c'est lent et il ne doit être fait qu'une fois, en dehors de la boucle.Désolé, Le Nil. J'avais un tableau avec les dimensions en arrière, et il a été le tri des colonnes, pas les lignes. Une sorte de bizarre. Votre code est bien. Mes excuses pour la confusion. Donc, juste pour être clair, l'instruction Redim sur le arrRowTemp devrait être en dehors de la boucle while? Depuis, vous avez juste besoin d'allouer de la mémoire une fois, et plus-écrire à chaque fois après que?
C'est une bonne solution, mais N'OUBLIEZ pas DE positionner
Option Base 1
si votre tableau est définie comme la même. Quand je trie un tableau 2d, avec une valeur de la deuxième colonne (colonne de tri) est de zéro. Après le tri terminé la valeur de la première colonne de a aussi été mis à zéro. J'ai passé près de deux heures sur cette. Enfin, il est devenu tout droit, après j'ai misOption Base 1
pour le module.OriginalL'auteur Nigel Heffernan
La partie difficile est que VBA fournit pas de moyen simple pour permuter les lignes dans un tableau 2D. Pour chaque échange, vous allez avoir de la boucle sur les 5 éléments et les swaps de chacun, ce qui sera très inefficace.
Je suppose qu'un tableau 2D est vraiment pas ce que vous devriez être en utilisant de toute façon. Est-ce que chaque colonne ont une signification particulière? Si oui, ne faut-il pas être l'aide d'un tableau d'un type défini par l'utilisateur, ou un ensemble d'objets qui sont des instances d'un module de classe? Même si les 5 colonnes n'ont pas de sens précis, vous pouvez toujours le faire, mais de définir le type défini par l'utilisateur ou un module de classe pour avoir un seul membre qui est une 5-élément de tableau.
Pour l'algorithme de tri lui-même, je voudrais utiliser une plaine ol' le Tri par Insertion. 1000 articles est en fait pas si grande, et vous ne remarquerez probablement pas la différence entre une Insertion de Tri et Tri Rapide, aussi longtemps que nous avons fait en sorte que chaque swap ne sera pas trop lent. Si vous ne utiliser un Tri Rapide, vous aurez besoin de ce code attentivement pour vous assurer que vous ne manquerez pas d'espace de pile, ce qui peut être fait, mais c'est compliqué, et le Tri Rapide est déjà assez compliqué déjà.
Donc, en supposant que vous utilisez un tableau de types définis par l'utilisateur, et en supposant que le type défini par l'utilisateur contient des variantes nommé Champ1 par Field5, et en supposant que nous voulons trier sur Champ2 (par exemple), alors que le code pourrait ressembler à quelque chose comme ça...
Vous êtes, bien sûr, le tri d'un vecteur d'enregistrements. Si seulement il y a une certaine facilement disponibles dans la bibliothèque qui a capturé les données totalisées dans un "jeu d'enregistrements', indexé avec un Arbre, et qu'on appelle un compilés-de-la-métal "Trier" de la fonction... :o)
OriginalL'auteur Steve Jorgensen
parfois, la plupart sans cervelle réponse est la meilleure réponse.
tadaa. l'habitude de vous faire gagner de la programmation prix mais il fait le travail rapide.
OriginalL'auteur swyx
Je vais offrir un peu légère de code différent pour Steve.
Tous les points valables sur l'efficacité, mais pour être franc.. quand j'étais à la recherche d'une solution, j'aurais été moins soucieuse de l'efficacité. Ses VBA... je le traiter comme il le mérite.
Vous souhaitez trier un tableau 2d. Plaine simple sale simple insertion de tri qui va accepter une variable tableau de taille et de tri sur une colonne sélectionnée.
OriginalL'auteur giveemheller
Pour ce que ça vaut (je ne peux pas afficher le code à ce point...laissez-moi voir si je peux le modifier à la poste), j'ai créé un tableau d'objets personnalisés (donc chacune des propriétés de venir avec n'importe quel élément de son triées par), peuplé d'un ensemble de cellules avec chacun des éléments de propriétés de l'objet d'intérêt, puis utilisé la excel fonction de tri par vba pour trier la colonne. Im sûr il y a probablement un moyen plus efficace de faire le tri, plutôt que d'exporter vers les cellules, je viens nai pas compris encore. En fait, cela m'a beaucoup aidé parce que quand j'ai besoin d'ajouter une dimension, j'ai juste ajouté un let et obtenir la propriété pour la prochaine dimension de la matrice.
OriginalL'auteur Dan
Vous pourriez faire un autre tableau avec 2 colonnes. Colonne 1 serait ce que votre tri sur et 2 est ce que la ligne est dans l'autre tableau. Trier ce tableau à la colonne 1 (seulement alterner les deux colonnes au moment de l'échange). Alors vous pouvez utiliser les 2 tableaux de données de processus en tant que de besoin. Tableaux de grande pourrait vous donner des problèmes de mémoire si
OriginalL'auteur BumKneesOhYeah
Il me semble que le QuickSort code ci-dessus ne peut pas gérer les espaces. J'ai un tableau avec des chiffres et des espaces. Quand je trie ce tableau, les enregistrements avec des espaces sont mélangés entre les enregistrements avec des nombres. Il m'a fallu beaucoup de temps pour le découvrir, alors, probablement, il est bon de garder cela à l'esprit lorsque vous utilisez ce code.
meilleur,
Marcel
Version 1
,Version 2.0
etVersion 13
par la séparation de l'identificateur numérique... Mais ce n'est pas la question ici!OriginalL'auteur Marcel