[RESOLU] Savoir si une colonne a été triée en VBA

richert90

XLDnaute Occasionnel
Bonjour

J'aimerais savoir en VBA, comment faire pour savoir si une colonne est triée

"if colonne1A est triée then
xxxx
else
xxxx
end if "

Merci d'avance
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Savoir si une colonne a été triée en VBA

Bonjour.
Moi, je vous proposerait bien de l'indexer à l'aide de mon module de classe TableIndex: si un numéro rendu lors du parcours n'est jamais inférieur au dernier rendu c'est que la colonne était triée.
 

richert90

XLDnaute Occasionnel
Re : Savoir si une colonne a été triée en VBA

Merci pour vos réponses

Victor21 je ne peux pas car ce n'est pas toujours la même a trié... selon si une colonne est triée ou non, j'en trie une autre

Dranreb, ton module de classe fonctionne pour tout type de données (tri de dates, nombres?)
 
G

Guest

Guest
Re : Savoir si une colonne a été triée en VBA

Bonjour,

Tu peux essayer cette petite fonction qui compare chaque valeur d'une colonne avec celle du dessous,
à la première valeur ne correspondant pas à l'ordre Ascendant (par défaut) ou Descendant, la fonction retourne Faux et on sort de la boucle, sinon on va jusqu'à l'avant dernière valeur.

Appel:
dim ColonneTriée as boolean

'La colonne est-elle triée en ordre ascendant, sa première cellule est une cellule d'entête
ColonneTriée = EstTriée (Range("A1:A100"),xlAscending,true)



Code:
Function EstTriée(Target As Range, Optional SortOrder As XlSortOrder = xlAscending, Optional HasHeader As Boolean = True) As Boolean
'Auteur: hasco 
    Dim t As Variant
    Dim i As Long
    If Target.Columns.Count > 1 Then Set Target = Target.Columns(1)
    If HasHeader Then Set Target = Target.Offset(1).Resize(Target.Rows.Count - 1)
    t = Target.Value
    EstTriée = True
    
    If SortOrder = xlAscending Then
        For i = 1 To UBound(t) - 1
            If t(i, 1) > t(i + 1, 1) Then
                EstTriée = False
                Exit For
            End If
        Next
    Else
        For i = 1 To UBound(t) - 1
            If t(i, 1) < t(i + 1, 1) Then
                EstTriée = False
                Exit For
            End If
        Next
    End If
End Function

[Edit] une version avec plus de variables mais une seule boucle qui vas de haut en bas ou de bas en haut suivant SortOrder

Code:
Function EstTriée(Target As Range, Optional SortOrder As XlSortOrder = xlAscending, Optional HasHeader As Boolean = True) As Boolean
    'Auteur: hasco Voir le profil: Hasco - Excel Downloads Forums
    Dim t As Variant
    Dim depart As Long, arrivee As Long, i As Long
    Dim pas As Integer, increment As Integer
    
    If Target.Columns.Count > 1 Then Set Target = Target.Columns(1)
    If HasHeader Then Set Target = Target.Offset(1).Resize(Target.Rows.Count - 1)
    
    t = Target.Value
    EstTriée = True
    If SortOrder = xlAscending Then
        depart = LBound(t)
        arrivee = UBound(t) - 1
        pas = 1
    Else
        depart = UBound(t)
        arrivee = LBound(t) + 1
        pas = -1
    End If
    EstTriée = True
    For i = depart To arrivee Step pas
        If t(i, 1) > t(i + pas, 1) Then
            EstTriée = False
            Exit For
        End If
    Next
End Function

A+
 
Dernière modification par un modérateur:

Dranreb

XLDnaute Barbatruc
Re : Savoir si une colonne a été triée en VBA

Dranreb, ton module de classe fonctionne pour tout type de données
Mon module de classe TableIndex en laisse la responsabilité au programme appelant, se contentant de lui indiquer ce qu'il doit comparer. Mais les modules MDictionnArbo et MClassement de OutIdx ont des fonctions TbIdxTV et TbIdxTVcd rendant des TableIndex prêts à l'emploi (il ne reste plus que le parcours à faire) qui donnent satisfaction pour tous types de données, lesquels n'y sont toutefois pas mélangés pour éviter tout risque de résultat imprévisible selon que chaque comparaison aura nécessité ou non la conversion en String d'un des deux termes numérique.
 

richert90

XLDnaute Occasionnel
Re : Savoir si une colonne a été triée en VBA

Re,

J'ai essayé la fonction de Hasco

J'ai une petite erreur à ce niveau:

Code:
Set Target = Target.Offset(1).Resize(Target.Rows.Count - 1)
dans la ligne
Code:
    If HasHeader Then Set Target = Target.Offset(1).Resize(Target.Rows.Count - 1)
.
C'est une erreur d'exécution 1004.
Je crois que ça vient du Target.Rows.count - 1.
Je peux remplacer Target.Rows.count par le nombre de ligne dans le tableau?
 

Roland_M

XLDnaute Barbatruc
Re : Savoir si une colonne a été triée en VBA

bonjour,

mais enfin, je pense tout de même que Victor21 a raison ! quand il dit:
"Il suffit de la trier : on saura qu'elle l'est, et si elle l'était déjà, cela ne changera rien, non ? "

c'est plus long de rechercher s'il elle est triée que de la trier directement,
et surtout, c'est plus fiable que toutes sortes de combines, sans tenir compte qu'il peut y avoir des interventions manuelles dans les listes, et là toutes les combines sont foireuses !

et sans oublier qu'il est nécessaire de savoir dans quel ordre !

que de complications ! quand on en arrive là c'est qu'on a loupé quelque chose dans l'organisation du projet non !?
 
Dernière édition:
G

Guest

Guest
Re : Savoir si une colonne a été triée en VBA

Re,

Bien-sûr mais ce n'est pas normal que tu aies cette erreur. Comment as-tu appellé la fonction? Sur quelle plage de cellules?
Fait nous un fichier exemple.

Si tu reprends mon dernier post tu verras que j'y ai mis une autre version.

A+

[Edit] Hello Roland, tout à fait d'accord avec toi, mais j'aime bien m'amuser.... quand il y a de la résistance...
 
Dernière modification par un modérateur:

richert90

XLDnaute Occasionnel
Re : Savoir si une colonne a été triée en VBA

Code:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
   
        Application.ScreenUpdating = False
        Call trier_bpu
        Sheets(4).Select 'Retour onglet 4
        
        End If
        
    End If
    
End Sub

sur la feuille 4 jai des graphiques
et la colonne bpu est sur la feuille 1

Voila le code que j'avais. C'est quand j'accède à un onglet que je veux trier une colonne d'une autre feuille! (ici colonne appelée bpu présente sur la feuille 1). mais je veux me replacer dans la feuille 4 une fois terminé.

Avec ce code, ça va agir comme une boucle infinie c'est à dire que comme à la fin du code j'ai sheets(4).select, je me remets sur l'onglet et du coup il y a re-éxécution de la procédure ci dessus donc ça re-trie la colonne infiniment. D’OÙ la nécessite d'avoir un code pour savoir si ça déjà été triée!!!
 
G

Guest

Guest
Re : Savoir si une colonne a été triée en VBA

re,

pfoufff, pourquoi faire simple quand on peut faire compliqué. Pourquoi résister à la demande d'un fichier exemple exposant le problème avec données anonymisées et tout le pataquès?

Je passe la main.

A+
 

Discussions similaires

Réponses
2
Affichages
188
Réponses
13
Affichages
230
Réponses
5
Affichages
170

Statistiques des forums

Discussions
312 145
Messages
2 085 762
Membres
102 966
dernier inscrit
InitialPP