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 Sub

si 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

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.

tu peux changer le signe ici

Cells(i, "A") > Cells(j, "A")

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.

tu peux changer le signe ici

Cells(i, "A") > Cells(j, "A")

Super cela fonctionne très bien Merci

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 Sub

si 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 Sub

J'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 !

Rechercher des sujets similaires à "tableau macro"