Oui certainement, pour le fun !
Bon, avec si peu de données, avec un objet SortedList (t'inquiètes, en conservant les doublons),
bref, peu importe la méthode, ce sera rapide !
Version imprimable
Oui certainement, pour le fun !
Bon, avec si peu de données, avec un objet SortedList (t'inquiètes, en conservant les doublons),
bref, peu importe la méthode, ce sera rapide !
re
Que dire sinon Merci Marc
voila un exemple qui prend 2 array les tri et le transforme en tablo a 2 ligne
purrée trop fort ce Marc!!
Code:
1
2
3
4
5
6
7
8
9
10
11
12 Sub test20() indice = Array(5, 8, 3, 15, 12, 14, 3, 1) tablo = Array(45, 37, 49, 21, 85, 49, 51, 24) tablo2 = Evaluate("TRANSPOSE(" & "SMALL" & "({" & Join(tablo, ",") & "},ROW(1:" & UBound(tablo) - (LBound(tablo) = 0) & ")))") Debug.Print Join(tablo2) For i = 1 To UBound(tablo2) If i > 1 Then Vrg = "," ind = ind & Vrg & indice(Application.Match(tablo2(i), tablo, 0) - 1) Next tablo2 = Evaluate("{" & Join(tablo2, ",") & ";" & ind & "}") Cells(1, 1).Resize(2, 8) = tablo2 End Sub
je dirais pas que c'est pour le fun mais presqueCitation:
Oui certainement, pour le fun !
ce post a pour but d'apprendre les différentes manières de trier construire un tablo/array avec les fonctions natives et 1 seule boucle ou pas du tout
je vais faire un récap de tout ca et en faire une contrib en vous citant car c'est un sujet interessant et utile
Merci a tous :D
Pour conclure, encore une fois, pensons Excel avant VBA ‼
re
une derniere question quand meme
y a t il une fonction qui pourrait remplacer (small/large) pour trier des nom car avec des items en string ca ne fonctionne pas
je suis certain que tu va nous sortir de ton chapo la solution
????Code:
1
2
3
4
5 Sub test21() indice = Array(5, 8, 3, 15, 12, 14, 3, 1) tablo = Array("paul", "serge", "anna", "henry", "justine", "jacques", "isabelle", "pauline") tablo2 = Evaluate("TRANSPOSE(" & "SMALL" & "({" & Join(tablo, ",") & "},ROW(1:" & UBound(tablo) - (LBound(tablo) = 0) & ")))") Debug.Print Join(tablo2)
Bonjour,
Bon alors si tu changes les règles que tu as toi-même défini...donc on peut utiliser Evaluate si je te suis ?
Heureusement que Marc est revenu à la charge parce que sinon tu serais resté collé aux boucles et WorksheetFunction...
J'aimerais que tu précises une chose suite à ton message 57 : tu as en ligne 6 et 7 les données de départ et en ligne 10 et 11 les résultats.
Ma question est : les données des lignes 6 et 7 sont-elles dans la feuille de calcul au moment où tu lances le code ?
Autrement dit dans la macro doit-on obligatoirement partir de 2 arrays en dur comme tu l'as fait jusqu'à présent ou peut-on se servir de la plage B6:I7 ?
A+
Bonjour Davido
absolument pasCitation:
Bon alors si tu changes les règles que tu as toi-même défini...donc on peut utiliser Evaluate si je te suis ?
Heureusement que Marc est revenu à la charge parce que sinon tu serais resté collé aux boucles et WorksheetFunction...
le titre du post est "Trouver l'index colonne du min dans une variable tableau"
les arguments etait utilisation de 1 seul boucle
vous m'avez proposé plusieur solutions que j'ai retenu
marc arrive avec une solution sans boucle ,tu imagine bien que ca m'interesse
apres examen il s'avere que ca methode ne gere pas les doublons et donc renvoie un resultat faux
bon c'est pas grave je ne jete pas tout
il me propose une fonction trimat qui fonctionne a merveille pour trier croissant/decroissant) sans boucle et bien je la garde
il me reste maintenant a trier les index en fonction du tri de trimat
alors on reprend une boucle sur le tablo trié avec matcth sur le tablo initial pour avoir les index de l'array des indices tout simplement
comme je l'ai posté "tri21"
apres si avec evaluate tu peut me faire les deux je suis preneur
je ne metrise pas ces fonction native je reste donc ouvert a toutes propositions tu le comprends bien
apres pour le départ on peut partir sur 2 ligne excel si tu veux
de toute facon la sub que je retiendrais deviendra une fonction donc les arguments seront injectés
pourquoi:
parce que la fonction me servira aussi bien pour trier une plage que pour une variable tableau rempli par des données HTML
donc a part quelques propositions vous rentrez tous dans le cahier des charges a savoir une boucle maxi pour trier 2 ligne de valeur avec indexation
Apparemment non, Excel disposant déjà d'une méthode de tri …
Te reste en VBA une procédure QuickSort.
Par contre en posant tes données dans une feuille, ce serait simple et rapide, en peu de lignes de code !
Un exemple via une feuille de calculs avec tri & index d'origine :Code:
1
2
3
4
5
6
7
8
9
10
11 Sub DemoF() TS = Split("Paul Serge Anna Henry Justine Jacques Isabelle Pauline") With Cells(1).Resize(2, UBound(TS) + 1).Rows .Item(1).Value = TS .Item(2).Value = Evaluate("TRANSPOSE(ROW(1:" & UBound(TS) + 1 & ")-1)") .Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlNo, Orientation:=xlLeftToRight TR = .Value End With Debug.Print Join(Application.Index(TR, 1)); vbLf; Join(Application.Index(TR, 2)) End Sub
Et encore là je n'ai même pas désactivé l'affichage entre autres …
re
bon ben sa se précise
malgré tout ces bonnes trouvailles le arraylist semble être le meilleur compromis pour travailler sur les numériques ou string
Bonjour Marc,
:plusser: Je suis du même avis que toi.Citation:
Pour conclure, encore une fois, pensons Excel avant VBA ‼
Bonjour Philippe et merci !
A partir de la capture d'écran de ta feuille, un essai via un Evaluate + une boucle :
A+Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Sub Tri() Dim Pl As Range, Pt As Range, T(), temp(), i& Set Pl = Range("B6:I7"): Set Pt = Pl.Rows(2) 'Evaluate permettant la prise en compte des doublons T = Evaluate("TRANSPOSE(MATCH(SMALL(" & Pt.Address & "-COLUMN(" & Pt.Address & _ ")/10^10,ROW(1:" & Pt.Cells.Count & "))," & Pt.Address & "-COLUMN(" & Pt.Address & ")/10^10,0))") temp = Pl.Value For i = LBound(T) To UBound(T) temp(1, i) = Pl.Value2(1, T(i)) temp(2, i) = Pl.Value2(2, T(i)) Next i Range("B12").Resize(UBound(temp), UBound(temp, 2)) = temp End Sub
Bonjour,
Pour obtenir le même résultat que celui de mon message précédent à partir de 2 Arrays (un Evaluate qui départage les doublons + une boucle) et en reprenant la démonstration de Marc :
A+Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Sub TriArrays() Dim t1, t2, t3, t4, tc, ts, i&, pos& t1 = Array(30, 45, 35, 94, 35, 17, 63, 9): t3 = t1 t2 = Array(5, 32, 12, 9, 1, 7, 4, 15): t4 = t2 tc = Application.Transpose(Evaluate("Row(1:" & UBound(t1) + 1 & ")")) ts = Evaluate("{" & Join(t1, ",") & "}-{" & Join(tc, ",") & "}/10^10") For i = LBound(t1) To UBound(t1) pos = Application.WorksheetFunction.Match(Application.WorksheetFunction.Small(ts, i + 1), ts, 0) - 1 t3(i) = t2(pos) t4(i) = t1(pos) Next i Debug.Print Join(t3) & vbCrLf & Join(t4) End Sub
Bonjour,
en développant la partie de l'Evaluate on simplifie la boucle :
A+Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Sub TriArrays() Dim t1, t2, t3, t4, tc, ts, i& t1 = Array(30, 45, 35, 94, 35, 17, 63, 9): t3 = t1 t2 = Array(5, 32, 12, 9, 1, 7, 4, 15): t4 = t2 tc = Application.Transpose(Evaluate("Row(1:" & UBound(t1) + 1 & ")")) ts = Evaluate("TRANSPOSE(TRANSPOSE(MATCH(SMALL({" & Join(t1, ",") & "}-{" _ & Join(tc, ",") & "}/10^10,{" & Join(tc, ",") & "}),{" & Join(t1, ",") & _ "}-{" & Join(tc, ",") & "}/10^10,0)))") For i = LBound(t1) To UBound(t1) t3(i) = t1(ts(i + 1) - 1) t4(i) = t2(ts(i + 1) - 1) Next i Debug.Print Join(t4) & vbCrLf & Join(t3) End Sub