Effectuer un tri / classement (VBA)

Bonjour, je suis confronté à un petit problème...

Je vais essayer d'être clair...

Dans l'initialisation d'une Userform, je relève dans une feuille, des codes d'erreur que je range dans un tableau.

Voici juste pour info le code des deux boucles.

//////////////////////////////////////////////

'Palmarès des erreurs (10)

For Rang = 1 To NomErrTot

ReDim Palm(Rang)

Next

Rang = 1

For LiG = 3 To Ligne

For ColErr = 13 To 21

If Cells(LiG, ColErr).Value <> "" Then

Palm(Rang) = Cells(LiG, ColErr).Value

Rang = Rang + 1

End If

Next

Next

//////////////////////////////////////////////

Ces codes d'erreur peuvent bien sur revenir plusieurs fois, et ont la forme A1, A2, A3, etc...

Je me retrouve donc avec un tableau Palm(Rang) de taille assez conséquente (800 entrées actuellement) dont certaines sont identiques.

J'aimerais à l'aide de ce tableau calculer le "top ten" de ces codes d'erreur.

Classer en premier celui qui arrive le plus souvent, en deux le suivant, ainsi de suite, et les afficher sur ma Userform.

Et là, je bloque.

Si quelqu'un pouvait me dépanner d'une boucle de tri ça m'aiderait bien....

J'espère ne pas avoir été trop brouillon.

Merci ...

Bonsoir,

Dans le tableau,

Ta liste commençant en A3 par exemple , tu mets à coté en B3 :

=NB.SI(A:A;A3)

formule à tirer vers le bas.

ensuite il te reste à trier par la colonne B décroissante et de virer les doublons.

Amicalement

Claude.

Merci Claude, mais ce n'est pas ça que je veux faire.

Je ne veux pas écrire sur la feuille.

Je veux simplement, en VBA, lire la feuille et afficher une Userform d'information.

Bonsoir,

Bonsoir, Claude

dans le fichier joint, les erreurs sont de la cellule A1 à A1683...

En cliquant sur le bouton jaune, puis sur "Go", tu obtiens les 10 erreurs les plus fréquentes....

Sauf si le nombre de l'erreur dépasse 10, ou qu'à partir d'une certaine erreur, et que le cumul de ce type d'erreur dépasse 10, tu n'obtiens que les erreurs pouvant être insérées dans l'usf (max 10)...

Regarde, et reviens

PS, je n'écris pas du tout dans le fichier, tous les calculs sont en VBA.....

https://www.excel-pratique.com/~files/doc/bastlat_v1.zip

Merci Félix, c'est exactement ce tri que je veux réaliser. Je vais décortiquer ton code.

Mais...

Il se trouve que j'ai stocké ces erreurs dans un tableau: Erreurs(n)

Je ne voudrais pas abuser mais...

Comment utiliser ce tableau plutôt qu'une colonne de la feuille de calcul ?

Merci d'avance

Edit: Pfff, je crois que j'ai visé trop haut... Je viens de parcourir le code...Ca me dépasse ! Y'a pas plus simple ?

Bonsoir,

Il se trouve que j'ai stocké ces erreurs dans un tableau: Erreurs(n)

Ces erreurs sont stockées dans un tableau..... (un objet Dictionary)

Y'a pas plus simple ?

La calculette?????

Comment utiliser ce tableau plutôt qu'une colonne de la feuille de calcul ?

Tes erreurs sont bien répertoriées sur une feuille, non?

ou tu fais un calcul, et selon le résultat, tu en déduis des erreurs?

mets un fichier exemple, ce sera plus facile....

Bonne soirée

Merci de ton aide.

Mais comme tu as du le voir dans le petit extrait de code, je suis surtout du niveau Do..Loop, If..Then..Goto.. Et là suis totalement largué. Et j'aime bien comprendre....

... Allez, j'y retourne !

Et bien ça y est j'ai trouvé mon bonheur.

Le Tri à Bulle !

En gros ça donne ça :

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Dim TriFini, PasFini As Boolean

Dim TypErr As Integer, NomErr As String

Dim ErrTyp() As Variant

'Palmares des erreurs (10)

For i = 1 To NombErrTot

ReDim Err(i)

Next

i = 1

For LiG = 3 To Ligne

For ColErr = 13 To 21

If Cells(LiG, ColErr).Value <> "" Then

Err(i) = Cells(LiG, ColErr).Value

Cells(i + 3, 23) = Err(i)

i = i + 1

End If

Next

Next

TriFini = False

'--------------------

Do While TriFini = False 'faire tant que le tri n'est pas fini

For j = 1 To UBound(Err) - 1

If Err(j) > Err(j + 1) Then

'------------------permutation

intTmp = Err(j)

Err(j) = Err(j + 1)

Err(j + 1) = intTmp

'--------------------------------

PasFini = True

'si on ne repasse plus ici

'PasFini sera = à False (cf plus bas)

End If

Next j

If PasFini = False Then

TriFini = True

Exit Do '-------------------------fin ici

End If

'On réinitialise la valeur PasFini

PasFini = False

Loop

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Trouvé ici :

Et en plus je comprends ce qui se passe

Rechercher des sujets similaires à "effectuer tri classement vba"