Tri cellule
Bonjour,
Je vous expose ma problématique : je fais mes comptes sur Excel et du coup cela arrive que les dépenses et recettes ne soient pas triées chronologiquement.
J'avais récupérer une macro pour trier automatiquement du plus ancien au plus récent et également pour qu'à chaque fois que je l'utilise, ma cellule active se retrouve aux alentours de mes dernières lignes de compte rentrées :
Sub TriDate()
'
' TriDate Macro
'
' Touche de raccourci du clavier: Ctrl+m
'
Columns("A:F").Select
Range("F684").Activate
ActiveWorkbook.Worksheets("Comptes").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Comptes").Sort.SortFields.Add Key:=Range("C2:C9000" _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Comptes").Sort
.SetRange Range("A1:F9000")
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("B999").Select
End SubLe problème c'est que je dois régulièrement retourner dans la macro pour modifier l'avant-dernière ligne "Range("B999").Select
J'aimerais savoir s'il y a une solution pour que lorsque j'utilise ma touche de raccourcie afin d'activer la macro, la cellule se positionne automatiquement sur la dernière ligne de compte rentrée (ou bien la première cellule vide juste en-dessous n'importe).
Je joins un fichier d'exemple.
Bonjour,
proposition d'adaptation
Sub TriDate()
'
' TriDate Macro
'
' Touche de raccourci du clavier: Ctrl+m
With Sheets("comptes")
dl = .Cells(Rows.Count, 1).End(xlUp).Row
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=.Range("B2:B" & dl ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Sort.SetRange .Range("A1:F" & dl)
.Sort.Header = xlYes
.Sort.MatchCase = False
.Sort.Orientation = xlTopToBottom
.Sort.SortMethod = xlPinYin
.Sort.Apply
.Range("B" & dl + 1).Select
End With
End SubBonjour,
Merci de ta réponse
Malheureusement rien ne se passe
Edit : finalement j'ai trouvé une solution en naviguant un peu partout :
A la place de : Range("B999").Select
Je mets : Range("B9999").End(xlUp).Offset(1, 0).Select
Le 9999 est arbitraire, 10000 fonctionne tout autant.
Je n'ai pas vraiment compris comment ça fonctionne malheureusement mais ça fonctionne. ^^
Merci quand même !
Bonjour Dimit19,
D'après ta réponse, je pense que le code VBA de h2so4 aurait marché en changeant simplement un chiffre :
dl = .Cells(Rows.Count, 2).End(xlUp).Row
Ainsi, ça détectera la dernière cellule utilisée selon la colonne B et non plus selon la colonne A.
Je n'ai pas téléchargé ton fichier ; peut-être aussi faudrait-il mettre : .Sort.SetRange .Range("B1:F" & dl)
Rien ne t'empêche d'essayer de nouveau la macro TriDate() de h2so4.
Tu a écrit :Je n'ai pas vraiment compris comment ça fonctionne malheureusement mais ça fonctionne. ^^
Pour ta ligne Range("B9999").End(xlUp).Offset(1, 0).Select elle signifie : on part de la cellule B9999 et on monte au-dessus jusqu'à trouver la 1ère cellule non vide, par exemple B19 ; ensuite, le .Offset(1, 0) fait un décalage ligne de +1 donc B20 ; et un décalage colonne de 0, donc même colonne B ➯ toujours B20 ; le .Select sélectionne cette cellule.
À toi de vérifier si le décalage d'une ligne en dessous est adapté et justifié par rapport au travail à faire, ici la sélection d'une cellule ; si tu veux que la cellule active soit B20, c'est parfait ; si tu préfères qu'elle soit B19, enlève le .Offset(1, 0) devenu inutile :
Range("B9999").End(xlUp).Select
⚠ Si pour ton tableau tu remplis tellement de lignes que tu atteins ou dépasse la ligne 9999, ça ne marchera plus ! car il faut partir d'une cellule située sous la dernière ligne de données utilisée pour que ça marche !
il vaudrait mieux alors mettre : Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Select
ou : Range("B" & Rows.Count).End(xlUp).Select
Rows.Count retourne le nombre de lignes maximum : 1 048 576 avec Excel 2007 (et versions ultérieures) ; 65 535 avec Excel 2003 (et versions antérieures).
dhany