Tableau Excel avec macro
Bonjour Eugène, Steelson,
Steelson a trouvé une solution qui marche très bien, et qui est bien plus simple que celle que je pensais faire ; pour les 2 subs, je propose quand même ces 5 petits changements : déclaration des variables ; gel de la mise à jour de l'écran ; calcul de la dernière ligne une seule fois (dans la variable n) ; .Resize(4) ; compléter les 2 Next avec la variable associée ; ce qui donne :
Option Explicit Sub trier_date() Dim i&, j&, n&: Application.ScreenUpdating = 0 n = Cells(Rows.Count, "A").End(xlUp).Row For i = 4 To n Step 4 For j = i To n Step 4 If Cells(i, "A") > Cells(j, "A") Then Rows(j).Resize(4).Cut Rows(i).Insert Shift:=xlDown End If Next j Next i End Sub Sub trier_nom() Dim i&, j&, n&: Application.ScreenUpdating = 0 n = Cells(Rows.Count, "B").End(xlUp).Row For i = 4 To n Step 4 For j = i To n Step 4 If Cells(i, "B") > Cells(j, "B") Then Rows(j).Resize(4).Cut Rows(i).Insert Shift:=xlDown End If Next j Next i End Subsi plus tard tu auras beaucoup plus de données et que ce tri bulle devient lent, Steelson pourra sûrement faire un quicksort.
Test macro.xlsm
dhany
Je te remercie cela fonctionne très bien.
Peux tu me dire se que je dois changer dans la formule trier date pour qu'elle sélectionne les date du plus récent au plus ancien.
Si c'est possible naturellement.
Mille merci je peux créer mon nouveau tableau maintenant.
Eugène
Voici
Sub trier_date() For i = 4 To Cells(Rows.Count, "A").End(xlUp).Row Step 4 For j = i To Cells(Rows.Count, "A").End(xlUp).Row Step 4 If Cells(i, "A") > Cells(j, "A") Then Rows(j & ":" & j + 3).Cut Rows(i).Insert Shift:=xlDown End If Next Next End Sub Sub trier_nom() For i = 4 To Cells(Rows.Count, "B").End(xlUp).Row Step 4 For j = i To Cells(Rows.Count, "B").End(xlUp).Row Step 4 If Cells(i, "B") > Cells(j, "B") Then Rows(j & ":" & j + 3).Cut Rows(i).Insert Shift:=xlDown End If Next Next End Sub
Tes formules fonctionnent parfaitement et j'ai copier également les formules adaptées de Dhany;
Comme je l'ai écris à dhany, je peux maintenant créer mon projet définitif.
A vous deux vous êtes des as des macros
Moi bien sur je ne suis qu'un amateur, mais je me débrouille quand même et j'aime cela.
Mille merci et peut être à plus dans l'avenir
Eugène
[quote=Eugène post_id=724885 time=1547535552 user_id=46061]
Bonjour Eugène, Steelson,
Steelson a trouvé une solution qui marche très bien, et qui est bien plus simple que celle que je pensais faire ; pour les 2 subs, je propose quand même ces 5 petits changements : déclaration des variables ; gel de la mise à jour de l'écran ; calcul de la dernière ligne une seule fois (dans la variable n) ; .Resize(4) ; compléter les 2 Next avec la variable associée ; ce qui donne :
Option Explicit Sub trier_date() Dim i&, j&, n&: Application.ScreenUpdating = 0 n = Cells(Rows.Count, "A").End(xlUp).Row For i = 4 To n Step 4 For j = i To n Step 4 If Cells(i, "A") > Cells(j, "A") Then Rows(j).Resize(4).Cut Rows(i).Insert Shift:=xlDown End If Next j Next i End Sub Sub trier_nom() Dim i&, j&, n&: Application.ScreenUpdating = 0 n = Cells(Rows.Count, "B").End(xlUp).Row For i = 4 To n Step 4 For j = i To n Step 4 If Cells(i, "B") > Cells(j, "B") Then Rows(j).Resize(4).Cut Rows(i).Insert Shift:=xlDown End If Next j Next i End Subsi plus tard tu auras beaucoup plus de données et que ce tri bulle devient lent, Steelson pourra sûrement faire un quicksort.
Test macro.xlsm
dhany
Bonjour Dhany ou Steelson
Sans vouloir vous embêter, par exemple pour le sub trier nom, comme j'aime savoir ce que je fait quand j'écris des formules, pouvez vous
l'un ou l'autre m'écrire à chaque ligne avec le signe ( ' ) se que chaque phrase exécute.
Je comprend une partie mais ????
Merci pour votre gentillesse
Eugène
@Eugène,
Prenons trier nom (l'autre c'est pareil à la seule différence que la colonne B devient colonne A
Sub trier_nom()
' i = numéro de ligne, varie de 4 à la dernière ligne renseignée avec un pas de 4
' on obtient la dernière ligne renseignée en remontant xlup depuis la fin extrême de la feuille, donc à partir de rows.count soit 1 millions de ligne et des poussières
For i = 4 To Cells(Rows.Count, "B").End(xlUp).Row Step 4
' j = numéro de ligne qui variera de la ligne i (j'aurais dû mettre i+4 !) jusqu'à la dernière ligne renseignée avec un pas de 4
For j = i To Cells(Rows.Count, "B").End(xlUp).Row Step 4
' je compare ici les noms trouvés en ligne i et j et colonne B
' si le nom en j est inférieur au nom en i alors je remonte avant la ligne i la ligne j et les 3 lignes qui suivent
' et je continuerai du reste les comparaison avec cette nouvelle valeur de nom qui est plus petite que l'ancienne
If Cells(i, "B") > Cells(j, "B") Then
Rows(j & ":" & j + 3).Cut
Rows(i).Insert Shift:=xlDown
End If
Next
Next
End SubJ'avoue que Rows(j).Resize(4).Cut est plus élégant que Rows(j & ":" & j + 3).Cut mais c'est la même chose !
J'espère avoir été suffisamment clair ? sinon, n'hésite pas !