Fonction tri

Salut le forum,

Je suis en train de décripter une procédure sur un manuel d'initiation au VBA, procédure qui consiste à trier des nombres dans une colonne pour les afficher par ordre croissant dans la deuxième.

Je vous post le code, ca ne fonctionne pas, je pense qu'il y a un bin's avec la fonction SI, d'autre part dans mon manuel, qui collectionne les erreurs et me coince pas mal, la fonction tri est ecrite TriDonnées....jamais vu cette bete.

Pourriez vous me dire ce qui cloche?merci! j'ai une erreur de compil, type defini par l utilisateur non defini

12classeur3.xlsm (13.95 Ko)

bonjour,

La fonction TriDonnées est située sur le module de l'autre feuille, c'est une fonction créée via une macro et donc non répertoriée de base.

Mon principal soucis avec ton code est qu'il se complique la vie.

Pour ne pas simplement utiliser la fonction tri des données de excel en passant par vba ?

Voilà un code exemple :

Sub Macro1()

    Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).Copy
    Range("B1").PasteSpecial

    With ActiveWorkbook.Worksheets("Feuil1").Sort
        .SetRange Range("B1:B" & Range("B" & Rows.Count).End(xlUp).Row)
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

End Sub

si tu voulais absolument utiliser le code indiqué dans ton manuel, je ne peux pas t'aider, il est assez complexe.

A plus !

Salut et merci d essayer de m aider.

Comme je dis, je sais qu'il y a plus simple mais je débute a peine en VBA et même en prog en général, du coup j apprends les fonctions petit a petit et les plus basiques pour l instant, même si le code de mon manuel est compliqué, j arrive à décripter certaines choses quand même, puis c est un code qui viens de plusieurs TP, il a donc été détaillé pour y insérer les fonctions déjà apprises. Seulement, là je sèche, avec les précédentes versions de ce code ca fonctionnait, mais sans cesse ils disaient l améliorer au fil des TP mais maintenant il ne fonctionne plus, et c est a chaque fois dans le code final a la fin d une partie!! aberrant!

Sinon ton code est difficile pour moi, je n'ai pas vu grand chose de ce qu' il y a dedans, je ne le comprendrai surement que plus tard, je la garde au chaud en espérant une correction de ta part car il ne trie pas, ca recopie la colonne A en B, comme tu as l air balaise tu devrais trouver ton erreur,

Merci de ton aide a+

Je viens de me rendre compte qu il y avait une troisieme procedure : c est la macro qui definit TriDonnées,, ne trouvant rien dessus dans l aide et sur le net je me disait bien qu il fallait surement la definir! Bien compliqué tout ca, vivement que j avance et que je connaisse bien plus de fonction et pouvoir tout simplifier!

a vrai dire je ne m'y connais que très peu, j'ai appris en autodidacte, mais pour moi, le meilleur moyen que j'ai trouvé quand je ne sais pas coder une manipulation est d'utiliser l'enregistreur de macro, puis d'automatiser le code généré.

Ici, l'utilisation d'une fonction créée sous vba, et utiliser dans un code ne me semble pas vraiment optimisé. surtout pour une fonction qui existe déjà sans vba.

Mais si je comprend bien, c'est un manuel pour apprendre à coder, et cela s'apparente à un simple exercice.

Pour ton code, je comprend plus ou moins ce qu'il fait, le premier problème est qu'il y a des fautes de syntaxe.

Dans la Function TriDonnées, boleen en Boolean.

Dans la Sub, ubdound en UBound.

Peut être qu'avec la version la plus récente qui fonctionne, je pourrai t'aider, mais la je bloque.

Bonjour,

j'ai noté ce qui me semble être des erreurs, déjà j'ai mis la variable MonTableau en variable public, puis dans le Call de la function, j'ai enlevé les parenthèses après MonTableau ainsi que dans les variables de la function.

Ensuite, j'ai rajouté une ligne

ReDim MonTableau(i)

dans la macro au dessus de y=1 car sinon le tableau ne pouvait pas se redimensionner.

Ensuite j'ai mis la function sur le même module que la macro pour que la variable Montableau puisse être utilisée.

enfin, dans les conditions du "If" de la function, je pense qu'il y a des soucis, ainsi, j'ai enlevé le True And après le <

et j'ai changé le i par un n dans le dernier

MonTableau(i)>MonTableau(n)

Malheureusement je pense qu'il y a une erreur de manipulation dans la série :

  Tps = MonTableau(n)
            MonTableau(n) = MonTableau(i)
            MonTableau = Tps

Je suis dessus.

A plus

Me re-voilà,

voilà après plusieurs test, je pense que c'est à ce code là que tu aurais dû aboutir, bien sur, je ne sais pas par quelles étapes tu es passé dans ton TD mais j'ai simplement corrigé ton code, enlever ou rajouter une ou deux lignes et voilà :

Public MonTableau As Variant
Sub ChargeLesDonnées()
Dim i As Long
Dim y As Long
ReDim MonTableau(i)
y = 1
While Cells(y, 1) <> ""
    ReDim Preserve MonTableau(i)
    MonTableau(i) = Cells(y, 1)
    i = i + 1
    y = y + 1
Wend
Call Module1.TriDonnées(MonTableau, True)
For y = LBound(MonTableau) To UBound(MonTableau)
    Cells(y + 1, 2) = MonTableau(y)
Next y
Application.ScreenUpdating = True
End Sub
'===============================================
Function TriDonnées(ByRef MonTableau As Variant, _
    Optional OrdreCroissant As Boolean = True)
Dim n As Long
Dim i As Long
Dim Tps As Variant
For n = LBound(MonTableau) To UBound(MonTableau)
    For i = n + 1 To UBound(MonTableau)
        If (OrdreCroissant = True And MonTableau(i) < MonTableau(n)) _
        Or (OrdreCroissant = False And MonTableau(i) > MonTableau(n)) Then
            Tps = MonTableau(n)
            MonTableau(n) = MonTableau(i)
            MonTableau(i) = Tps
        End If
    Next i
Next n
End Function

A plus !

Rechercher des sujets similaires à "fonction tri"