Tri d'un tableau VBA à 2 dimensions multichamps

tototiti2008

XLDnaute Barbatruc
Bonsoir à toutes et tous,

Les tableaux VBA accélèrent les traitements de données sur Excel
Je me suis dit que pouvoir trier les données de ces tableaux sans avoir à les "coller" dans la feuille de calcul pour utiliser les fonctionnalités de tris d'Excel pourrait avoir son intérêt

Voici donc un petit classeur avec le code concerné qui semble fonctionner (pas trop soigné la présentation du classeur, l'intérêt est plus dans le code VBA)
J'ai évité de faire appel aux fonctions Excel pour traiter le tri dans un VBA qui pourrait éventuellement être utilisé dans les autres application Office, au cas où.

Si le concept vous semble intéressant, j'ouvre ce fil pour vous proposer un échange sur le sujet à savoir :
- Est-ce que ça fonctionne vraiment bien ? pourriez-vous faire des tests de votre côté ?
- Le principe utilisé est il bon ? optimisé ? y a t-il plus simple ?
- Le code est-il simplifiable ? optimisable ?

Dites moi si ça vous interpelle ;)
Je préciserais évidement le principe de fonctionnement si ça intéresse quelqu'un :)
 

Pièces jointes

  • Tri tablo.xls
    747.5 KB · Affichages: 902
  • Tri tablo.xls
    747.5 KB · Affichages: 903
  • Tri tablo.xls
    747.5 KB · Affichages: 999

Efgé

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Bonjour Tototiti :), Bonjour carcharodon-carcharias :), Il y a aussi sur le sujet un fil initié par David84 et intitulé "Tri multicolonne sur tableau VBA". Pas possible de mettre directement le lien :-( , désolé. Amicalement Fred
 

Pièces jointes

  • Lien_Tri_multicolonne_sur_tableau_VBA.doc
    23.5 KB · Affichages: 919

tototiti2008

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Bonjour CC, Bonjour Efgé,

Merci de vos retours :)
Je mets le lien vers la discussion initiée par David :
https://www.excel-downloads.com/threads/tri-multicolonne-sur-tableau-vba.174167/
Je l'avais loupée celle là... il faudra que je lise tout ça avec attention
Sinon j'ai une remarque sur mon filtre, le codeur confond horizontal et vertical :D:D, bon, à mettre sur la liste des prochaines corrections (pour l'argument du sens du tableau, si on fournit H il traite un tableau vertical...)
 

tototiti2008

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Re,

Alors, quelques explications sur le principe
Ce tri est paramétrable, il permet d'indiquer :
- l'ordre des différents champs à appliquer avec pour chaque champ : ordre croissant ou décroissant, sensible à la casse ou non (quelques "soucis" là-dessus mais on aura l'occasion d'échanger dessus je pense)
- Si la première "ligne" du tableau est une ligne de titre
- Ordre de tri de valeurs de types différents, par défaut les dates apparaîtront en premier, puis les nombres, puis les textes, puis les valeurs vides
- Sens du tableau horizontal ou vertical (même si je dois changer puisque ça fait le contraire, arf ;))
 

MJ13

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Bonjour à tous

Merci Tototiti pour ce fichier sympa :). Je l'ai testé mais sans plus car je n'ai pas trop compris la logique. Mais ce n'est qu'un début.

Sinon, un truc qui serait bien c'est de faire une USF avec les champs en label de gauche à droite et des boutons à cocher en dessous avec Ordre croissant, décroissant et un textbox pour mettre le numéro d'ordre pour chaque champs à prendre en compte. En plus en module de classe, ce serait le top. C'est possible :confused:.
 

tototiti2008

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Bonjour Michel, Bonjour à tous,

Oui, tout à fait, mais je pense que ce sera l'étape finale
d'abord quelques tests pour vérifier que ça fonctionne, quel que soit le type de données des champs, les options de tris choisis
puis quelques discussions sur les principes utilisés pour le tri, savoir s'il y a plus simple, plus rapide...
puis tout autre discussion entraînées par les précédentes ;)
Et ensuite, on proposera une version commerciale emballée dans du papier bulle :D, je plaisante :)
Ce fil est plus un appel à la collaboration qu'une "démonstration", à vos remarques messieurs dames ;)

Edit : mais je suis à ta disposition pour essayer d'expliquer ce que tu ne comprend pas, évidemment
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Re,

Peut-être commencer par expliquer le principe du code avec des phrases
En fonction des champs sur lesquels le tri doit être effectué, pour chaque champ participant au tri :
- création d'un dictionnaire pour recueillir les valeurs uniques de ces champs
Ce dictionnaire contient des textes en majuscules si la casse ne doit pas être respectée
Conversion des dates en leur entier équivalent dans le dictionnaire
Conversion des nombres en double car quelques soucis sinon
- tri (quicksort de notre ami Boisgontier) des valeurs de chaque dictionnaire
- création d'une clé de tri unique en fonction du type de chaque données puis de la position de la valeur dans son dictionnaire trié, concaténation des clés de chaque champ pour la clé unique
- quicksort sur la clé unique puis positionnement des valeurs dans le nouvel ordre obtenu
 

Dranreb

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Bonjour à tous.
Je pense que le code de MTriTablo pourrait être réduit de moitié en utilisant ma classe TableIndex.
De plus elle serait plus rapide.
Elle utilise aussi une méthode Quick-Sort pour les partitions dépassant les 950 éléments, pour moins elle préfère la méthode dichotomique avec décalages d'entiers Long par MoveMemory. Mais le processus de tri ne s'intéresse même pas aux valeurs à comparer puisque c'est l'appelant qui doit effectuer les comparaisons.
C'est une Property Let BInfA littéralement invaginée, retournée comme un gant, puisque y effectuer une comparaison revient à rendre la main à l'appelant, tandis que la rappeler revient à reprendre logiquement son processus là où il en était avant qu'elle rendre la main. L'avantage est double. D'abord on écrit la comparaison comme on veut (on accède même à ce qu'on veut, de sorte que la classe permet d'indexer n'importe quoi !). Donc pas besoin de concaténer les différentes colonnes pour n'avoir qu'un argument plus facile à comparer: on se concentre sur une petite boucle qui n'explore que les arguments égaux (dans les deux groupes à comparer, le 1er argument diffère 9 fois sur 10 et détermine à lui seul l'ordre). Mais le plus gros avantage est que le résultat est une table de numéros de lignes. Une fois l'indexation terminée, la classe TableIndex est équipée de méthodes simples pour obtenir les numéros de lignes dans leur ordre indexé. La facilité ne se limite donc pas à la restitution des arguments, elle s'étend aux autres informations qui ne participaient pas au tri.
P.S. Il devrait être à présent possible d'utiliser cette classe hors d'un classeur de macro complémentaire que je tiens à votre disposition (vais-je le joindre ici, ou bien ouvrir une discussions ?).
Cordialement.
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Bonjour Dranreb,
Re,

Merci de ta réponse :)
Je serais bien incapable de commenter ta réponse, je n'y comprend goutte
J'ai vu ton module de classe sur le fil initié par David et ça dépasse de loin mes capacités, me semble t-il, ou au moins me faudrait-il beaucoup de temps pour appréhender les concepts utilisés. J'essaierais mais le début d'immersion me fait peur d'attraper le mal des grandes profondeurs ;)
Il existe donc visiblement une méthode plus efficace pour faire les tris multicolonnes d'un tableau VBA.

Cependant, je rechigne un peu à jeter directement mon code à la poubelle, orgueil quand tu nous tiens...
Ton code peut prendre en charge les options que j'ai intégré à mon tri ? distinction des types de données différents ? gestion d'un tableau horizontal/vertical ?
Désolé si je pose des questions inappropriées
 

Misange

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Hello
Fil intéressant même si j'ai pas trop de temps pour regarder dans les détails. Si tu pioches des trucs utiles (ou si tu trouves des erreurs ou des trucs pas clairs) dans les tutos (8 pages car le sujet est complexe) que j'ai essayé non sans mal de faire et plus encore de comprendre, n'hésite pas une seconde ! J'ai mis notamment des procédures de tri sur les arrays mais rien d'aussi sophistiqué que ce que tu proposes.

J'ai mis un like à ton dernier message Dranreb. C'est de la poésie pure arrivé à ce niveau d'abstraction :) et c'est beau !
"Elle utilise aussi une méthode Quick-Sort pour les partitions dépassant les 950 éléments, pour moins elle préfère la méthode dichotomique avec décalages d'entiers Long par MoveMemory. Mais le processus de tri ne s'intéresse même pas aux valeurs à comparer puisque c'est l'appelant qui doit effectuer les comparaisons.
C'est une Property Let BInfA littéralement invaginée, retournée comme un gant, puisque y effectuer une comparaison revient à rendre la main à l'appelant, tandis que la rappeler revient à reprendre logiquement son processus là où il en était avant qu'elle rendre la main."

Je t'imagine flottant au milieu des octets, te retournant pour les voir par en dessous pour mieux les regarder virevolter tels un banc de sardines argentées. :)
 

Dranreb

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Ton code peut prendre en charge les options que j'ai intégré à mon tri ? distinction des types de données différents ? gestion d'un tableau horizontal/vertical ?
Désolé si je pose des questions inappropriées
Elles sont très appropriées au contraire.
Je distingue depuis longtemps les type de données Variants en les éclatant au moyen de cette procédure:
VB:
Property Let TypeEtVal(TypV As Integer, VSorti As Variant, ByVal VEntré As Variant)
TypV = VarType(VEntré)
Select Case TypV
   Case Is <= 1 ' Empty, Null. Rien c'est rien, bon. Deux fois rien c'est pas grand chose, mais avec trois fois rien… (Raymond DEVOS)
   Case 8: If VEntré <> "" Then If VEntré <> CléVide Then VSorti = VEntré: Exit Property ' String
   Case 10: If VEntré <> CVErr(xlErrNA) Then VSorti = "*ERR*": Exit Property ' Error
   Case 12, 13, 36, Is >= 8192: MsgBox "Le type de données """ & TypeName(VEntré) & """ n'est pas supporté.", vbCritical, "TypeEtVal": End
   Case Else: VSorti = VEntré: Exit Property
   End Select
TypV = 32767: VSorti = CléVide
End Property
que j'applique ainsi dans ma procédure d'indexation:
VB:
For C = 1 To CMax
         TypeEtVal(TypA, ArgA) = TabArgs(.A, C)
         TypeEtVal(TypB, ArgB) = TabArgs(.B, C)
         If TypB < TypA Then .BInfA = True:  Exit For
         If TypB > TypA Then .BInfA = False: Exit For
         If ArgB < ArgA Then .BInfA = True:  Exit For
         If ArgB > ArgA Then .BInfA = False: Exit For
         Next C
      If C > CMax Then .BInfA = .B < .A
Les colonne C sont dans l'ordre des argument de tri, mais ce ne serait pas un problème de chercher dans une autre petite table un CBis de certaines colonnes en désordre à prendre comme argument.
Ce ne serait pas un problème non plus de remplacer True et False par Croissanr(C) et Not Croissant(C) comme valeurs affectées à .BInfA.
En revanche je ne me suis pas intéressé à la casse parce que j'ai opté pour Option Compare Text qui l'ignore de toute façon.
Et pour l'orientation je pense qu'il vaudrait mieux s'en débarrasser au début et à la fin à l'aide de WorksheetFunction.Transpose
À +
 
Dernière édition:

YANN-56

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Bonjour à tous,

Au risque probable, sinon incontournable de me faire rabrouer, j'ose humblement poser cette question:

Ce sujet n'aurait-il pas eu aussi sa place dans le Forum Excel?

N'êtes-vous par en train de concocter un sous-forum seulement dédié aux élites et la confrérie.

Je peux certifier qu'il y a des "Pointures" qui ne sont pas fervents visiteurs du "Bon coin",
mais qui, par leurs compétences auraient certainement été de bons conseils.

Amicalement,

Yann
 

david84

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Bonjour le fil,
Ayant moi-même initié le fil indiqué par Efgé, vous vous doutez bien que cette discussion m'intéresse.
J'essaierai donc d'y participer en fonction de mon temps et de mes compétences.

Avant de rentrer dans le vif du sujet, ce message a simplement pour but d'apporter quelques remarques initiales :
Cependant, je rechigne un peu à jeter directement mon code à la poubelle, orgueil quand tu nous tiens...
Surtout pas ! Par contre il faut effectivement voir ce qui le distingue des autres codes proposés sur la discussion du tri sur des plages multicolonne. Si c'est l'aspect paramétrable, il faut donc développer cette originalité, ce qui n'empêche par Dranreb d'inclure cette possibilité dans son bijou de module de classe s'il le désire.

@Dranreb : tu sais ce que je pense de ta production donc je n'y reviens pas ici. Je l'avais étudiée en son temps et avais fini par en comprendre le principe (mais bon, c'est sûr qu'il faut faire "l'effort" d'accepter d'y consacrer un certain temps et pas 5 minutes entre deux fichiers, sinon on perd son temps).
J'avais lu un ou deux tutoriels sur les modules de classe histoire de m'y mettre un de ces quatre : j'attends que tu ouvres ta discussion pour pouvoir y participer et poser des questions.
J'en ai déjà une d'ailleurs quand je vois que tu utilises une MsgBox dans une procédure Property alors que j'ai lu ici que cela était déconseillé :
De même, une classe ne devrait jamais donner la main à l'utilisateur via par exemple un msgbox ou un inputbox.
Il faudra donc développer à l'intérieur du module de classe des événements et des gestions d'erreurs qui rendront
la main au code appelant.
Alors, simple divergence de point de vue sans importance ou cette affirmation est valable de manière générale mais s'impose dans ton cas ?
J'attends ta réponse, non pas ici, mais lorsque tu auras initié ton fil (si bien sûr cela te tente !).

@Yann56 :
Ce sujet n'aurait-il pas eu aussi sa place dans le Forum Excel?

N'êtes-vous par en train de concocter un sous-forum seulement dédié aux élites et la confrérie.
Permets-moi de ne pas être de ton avis même si je trouve tes remarques pertinentes : le salon est aussi fait pour poser des questions sur un thème particulier sur lequel ceux et celles qui le veulent pourront phosphorer à loisir.
C'est un peu un laboratoire.

Je trouve d'ailleurs que ce type de discussion manque sur ce forum et cela permettrait peut-être à des habitués qui ont envie de progresser et qui tournent quelquefois en rond devant certaines demandes récurrentes postées sur le forum de ne pas le déserter peu à peu.

Tout le monde peut bien sûr suivre la discussion et y participer quel que soit son niveau, ne serait-ce que pour tester les solutions proposées.

Si tu places ces discussions non centrées sur une demande particulière mais plutôt sur une thématique dans le forum Excel, elles seraient vite noyées dans la masse.

Je peux certifier qu'il y a des "Pointures" qui ne sont pas fervents visiteurs du "Bon coin",
mais qui, par leurs compétences auraient certainement été de bons conseils.
Cela peut être effectivement le cas : peut-être placer un message dans le fil que j'avais initié sur le forum pour signaler l'ouverture de cette discussion dans le salon.
A+
 
Dernière édition:

YANN-56

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Re David,

Cela peut être effectivement le cas : peut-être placer un message dans le fil que j'avais initié sur le forum pour signaler l'ouverture de cette discussion dans le salon.

Tu as bien compris ce que je voulais dire, et ta suggestion de ce signal est une bonne idée.

De mon coté, je retiens aussi ce mot:
noyées dans la masse.

Ton Fil n'est pas le sujet, et je n'irai pas plus loin quant au mélange des genres. (VBA ou A1+Recherchev.)

Je cherche aussi souvent les sujets où le peu que je sais pourrait aider.... Mais c'est pas facile.

Amicalement, et bonne suite à ce dialogue..

Yann
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Tri d'un tableau VBA à 2 dimensions multichamps

Bonjour Yann, Bonjour David, Bonjour Misange,
Re,

Merci de vos interventions :)

@Yann : à mon avis le forum Excel est là pour poser des questions, ici je propose une solution (qui me semble fonctionnelle) à une problématique, en demandant la collaboration de tous ceux qui souhaitent participer, que ce soit pour faire des tests, pour discuter du principe utilisé ou du code, une sorte de brainstorming sur un sujet. J'ai pensé que ça avait sa place dans le salon mais je peux me tromper. J'accueillerais avec plaisir tes contributions et remarques sur le sujet

@David : l'aspect paramétrable est une chose, je voulais avoir accès à des options à peu près comparables aux tris dans la feuille de calcul, d'où l'ensemble des paramètres, mais ce n'est pas tout.
La méthode de constitution d'une clé unique de tri à partir des champs sur lesquels le tri doit porter me semble aussi un peu différente, si j'ai compris tu concaténait les valeurs séparées par des # ce qui pose potentiellement problème pour les nombres, dates, nombres décimaux... j'irais revérifier sur ton fil. Moi je passe par un tableau trié de ces valeurs, ce qui permet de les trier en respectant leur type, je pense.

@Misange : Merci, j'ai commencé à éplucher les tutoriaux d'Excel Labo sur le sujet, encore du travail :)

@Dranreb : Merci de tes précisions, j'étudierais ta solution plus avant, malgré les probables difficultés que je m'attend à rencontrer :)
 

Discussions similaires

Réponses
5
Affichages
354
Compte Supprimé 979
C

Statistiques des forums

Discussions
312 294
Messages
2 086 924
Membres
103 404
dernier inscrit
sultan87