Trouver une ligne avec vba pour lancer un tri
Résolu
mic13710
Messages postés
1087
Date d'inscription
Statut
Membre
Dernière intervention
-
mic13710 Messages postés 1087 Date d'inscription Statut Membre Dernière intervention -
mic13710 Messages postés 1087 Date d'inscription Statut Membre Dernière intervention -
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.
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:
- Trouver une ligne avec vba pour lancer un tri
- Trouver adresse mac - Guide
- Comment faire un tri personnalisé sur excel - Guide
- Partager photos en ligne - Guide
- Trouver un film sans le titre - Télécharger - Divers TV & Vidéo
- Logiciel tri photo - Guide
9 réponses
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
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
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
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
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.
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.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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
par exemple: range(A9:XXXX" & lig) ici étiquette incluse; XXXX représente la dernière colonne
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?
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?
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.
Pour le moment je suis scotché sur cette instruction qui ne fonctionne pas correctement.
Merci pour votre aide.
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.
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.