Trouver une ligne avec vba pour lancer un tri

Résolu/Fermé
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 - 4 mars 2009 à 15:56
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 - 9 mars 2009 à 10:24
Bonjour,

Je suis un gros débutant en vba et sûrement que ce que je cherche à faire est très simple.

J'ai un tableau sur une feuille excel sur lequel je veux faire un tri croissant sur une colonne. Toutes les cellules du tableau ont une formule (et donc ne sont pas vides) et si je lance un tri croissant, toutes les lignes dont le résultat est 0 se retrouvent en tête de tableau, ce que je ne veux pas. Les lignes sont remplies à la suite et il n'y a donc pas de vide entre les lignes comportant un résultat.
Dans la colonne B les formules renvoient exclusivement du texte (la fonction excel ESTEXTE me renvoit VRAI lorsque le résultat est du texte et FAUX lorsque la valeur de la cellule est 0).
Je souhaiterais sous VBA pouvoir rechercher la dernière cellule contenant du texte dans cette colonne et utiliser son numéro de ligne pour déterminer la zone de tri.

Voici mon code:

Sub Tri_distance()
'
Sheets("Programmations").Select
Rows("10:77").Select
Selection.Sort Key1:=Range("C10"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

End Sub

La ligne 77 est la dernière ligne de mon tableau de 90 lignes dont la cellule de la colonne B (B77) est renseignée et c'est donc ce numéro de ligne qui est variable en fonction des saisies.

Comment puis-je faire pour rechercher la ligne qui m'intéresse et l'utiliser dans ma ligne Rows("10:numéro de ligne trouvé" ) avant de lancer le tri?

Précision: je travaille avec Excel 2003

D'avance merci pour votre aide.
A voir également:

9 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
4 mars 2009 à 18:12
bonjour,

essaies cette instruction qui te donne la dernière ligne avant le premier zéro

lig = Columns(2).Find(0, [B65536]).Row - 1

ton tableau faisant 90 lignes , lig peut déclaré comme byte
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 353
4 mars 2009 à 18:56
Bonjour Michel, et merci pour ta réponse.
Je n'ai pas essayé ta solution qui me semble intéressante, mais le problème sera peut-être que les titres de mon tableau sont à la ligne 9 et les données à partir de la ligne 10. Ton instruction risque fort de me donner 0 parce que je n'ai rien au dessus de la ligne 9 (cellules vides), est-ce que je me trompe ou bien est ce que ça fait la différence entre cellule vide et cellule à 0?

Par ailleurs, que veux-tu dire par "lig peut déclaré comme byte" et comment concrètement j'introduis lig dans mon code? Est-ce comme ceci: Rows("10:lig" )?

Merci pour ton aide
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
4 mars 2009 à 20:39
sub tamacro()
dim lig as byte
....toncode
lig = Columns(2).Find(0, [B9]).Row - 1
rows("10;" & log).Sort Key1:=Range("C10"), Order1:=xlAscending, .... suite deton code

End sub

les select-selection sont inutiles, mangent de la mémoire et ralentissement fortement l'exécution.
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 353
4 mars 2009 à 22:35
Salut Michel,

J'ai essayé ton code et ça m'affiche "Erreur d'exécution 13" "Incompatibilité de type" et le debogage localise le pb sur la ligne Rows. Je ne vois pas ce qui cloche.

Voici le nouveau code:

Sub Tri_distance()

Sheets("Programmations").Select
ActiveSheet.Unprotect
Dim lig As Byte
lig = Columns(2).Find(0, [B9]).Row - 1
Rows("10;" & lig).Sort Key1:=Range("C10"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

ActiveSheet.Protect, userInterfaceOnly:=True

End Sub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 353
4 mars 2009 à 22:59
Je reviens sur le forum suite à mes essais. En fait il y avait une petite erreur dans la ligne rows qui est devenue:

Rows("10:" & lig).Sort Key1:=Range("C10"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

Par contre, si je n'ai plus d'erreur maintenant, je n'ai aucun tri qui se fait. Le tableau reste en l'état.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
5 mars 2009 à 09:17
bonjour il faut que tu tries sur ton tableau et non sur les lignes

par exemple: range(A9:XXXX" & lig) ici étiquette incluse; XXXX représente la dernière colonne
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 353
5 mars 2009 à 10:39
J'ai fait quelques essais et le problème n'est pas sur l'instruction rows. Si je remplace & lig par 77, le tri fonctionne impec.
Il est sur le résultat de la ligne d'instruction:

lig = Columns(2).Find(0, [B9]).Row - 1

lig prend la valeur 14 et non 77. Pourtant toutes mes cellules de B9 à B77 sont pleines de formules qui renvoient des textes, B14 et B15 sont bien des textes (vérifié par la formule ESTTEXTE()), et la première formule égale à 0 se trouve dans B78.

Or, pour le moment le tri se fait de la ligne 10 à 14 uniquement.

Ne serait-ce pas un problème avec Dim lig As Byte qui stocke sous forme de nombre unique codé sur 8 bits?
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 353
6 mars 2009 à 17:26
Quelqu'un a t'il une idée pourquoi le code ci dessus me renvoi la valeur 14 alors qu'il devrait me donner 77 (toutes les lignes entre B10 et B77 sont occupées par du texte) ?

Pour le moment je suis scotché sur cette instruction qui ne fonctionne pas correctement.

Merci pour votre aide.
0
mic13710 Messages postés 1088 Date d'inscription samedi 26 novembre 2005 Statut Membre Dernière intervention 13 mai 2021 353
9 mars 2009 à 10:24
Puisque l'instruction "lig = Columns(2).Find(0, [B9]).Row - 1" ne marche pas (ne trouve pas la valeur "0"??), et que j'en ai eu assez de me prendre le choux avec ce truc, j'ai contourné le problème de la manière suivante:

J'ai utilisé une bonne vieille formule Excel dans la cellule C120:" =EQUIV(0;C10:C119;0)" pour trouver la première cellule à 0 dans le Range C10:C119 (ce qui me donne 69 en l'occurrence) (note: le range B10:B119 renvoit au même résultat), puis j'utilise le code suivant pour faire mon classement:

La variable lig est déclaré "Dim lig As Byte" en tête de module (car utilisée pour d'autres classements)

lig = ActiveSheet.Range("C120").Value + 8
ActiveSheet.Unprotect
Rows("10:" & lig).Sort Key1:=Range("C10"), Order1:=xlAscending, _
Key2:=Range("A10"), Order2:=xlAscending, _
Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2:=xlSortNormal
Range("A8").Value = "PARCOURS CLASSÉS PAR DISTANCES RÉELLES"
ActiveSheet.Protect , userInterfaceOnly:=True

Et là, ça marche impec.

Il m'a suffit ensuite de copier ce code sur d'autres macros, de changer les paramètres de tri, pour avoir différents classements (que j'identifie dans la cellule A8), le tout associés à des boutons, et le tour est joué.

Mais ça n'explique toujours pas pourquoi l'instruction de départ ne fonctionne pas.
0