XL 2019 Macro pour tri (avec condition !)

olouis05

XLDnaute Nouveau
Bonjour à tous...

Pas trop calé en macro sur EXCEL mais très curieux et surtout intéressé, je souhaite appliquer un tri sur une feuille d'un classeur EXCEL 2019 (compta d'une association).
Cette feuille me sert de saisie des écritures, par date, mais pas toujours de façon chronologique !
Les écritures de chaque opération sont séparées par des lignes vides pour une lecture plus aisée...
Un simple tri me rassemble toutes les lignes vides en bas du tableau !
Donc, comment appliquer un tri sur la date mais en gardant les lignes blanches de séparation comme lors de la saisie d'origine ?

Pour illustrer, voici à quoi ça ressemble :

DateN° compteIntituléLibellé de l'écritureDébitCrédit
01/01/2022​
129000Résultat de l'exercice (déficit)Solde au 01/01/202210,00
01/01/2022​
512000BanqueSolde au 01/01/202220,00
01/01/2022​
531000CaisseSolde au 01/01/202230,00
01/01/2022​
890000Bilan d'ouvertureSolde au 01/01/202260,00

01/01/2022​
890000Bilan d'ouvertureSolde au 01/01/202210,00
01/01/2022​
103000Fonds associatifs avec droit de repriseSolde au 01/01/20221,00
01/01/2022​
106000RéservesSolde au 01/01/20222,00
01/01/2022​
419100Usagers Avances et acomptes reçus sur commandesSolde au 01/01/20223,00
01/01/2022​
419000Usagers créditeursSolde au 01/01/20224,00

31/01/2022​
106000RéservesAffectation résultat 20211,00
31/01/2022​
129000Résultat de l'exercice (déficit)Affectation résultat 20211,00

05/01/2022​
625700RéceptionsCafés6,00
05/01/2022​
401000FournisseursCafés6,00
05/01/2022​
401000FournisseursCafés6,00
05/01/2022​
531000CaisseCafés6,00

03/01/2022​
606300Fournitures d'entretien et de petit équipementLampe pince x2 + ampoule bleue x233,12
03/01/2022​
401010FournisseursLampe pince x2 + ampoule bleue x233,12



Je reste à votre disposition pour plus d'information si nécessaire.
D'avance un grand merci à tous pour votre aide et vos compétences.

A bientôt...
Olive
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Il faut un traitement préalable au tri qui remplit les lignes vides avec les valeurs qui servent de critères de tri de la ligne concernée (la Date), en ajoutant un critère de tri supplémentaire (l'Intitulé) pour lequel le traitement préalable placera "zzz" en valeur pour être sûr d'avoir à la fin du tri la ligne vide (qui ne l'est plus) après la ligne concernée.
Puis une traitement post-tri qui retire ces valeurs et remet les lignes à vide.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @olouis05, @Dudu2 ;),
Bienvenue sur XLD :)

Un essai dans le fichier joint. Cliquer sur le bouton Hop!
Aucun de mes codes n'est commenté sauf si le demandeur le demande (gentiment 😜)

nota : le code utilise la colonne G comme colonne auxiliaire. Il faut donc laisser la colonne G inutilisée. Si c'est trop contraignant, on peut faire autrement mais ça rajoute quelques lignes de code (par exemple en insérant une colonne A comme colonne auxiliaire en debut de macro et en supprimant cette colonne A en fin de macro).

Le code est dans le module de la feuille "Feuil1" :
VB:
Sub TriBloc()
Dim derlig1&, derlig2, i&, ref
   Application.ScreenUpdating = False
   If Me.FilterMode Then Me.ShowAllData
   derlig1 = Cells(Rows.Count, "a").End(xlUp).Row
   Range("g1") = "Aide au tri"
   Range("g2").FormulaR1C1 = "=IF(R[-1]C[-6]="""",SUM(R[-1]C,1),SUM(R[-1]C,0))"
   Range("g2:g" & derlig1).FillDown
   Range("g2:g" & derlig1) = Range("G2:G" & derlig1).Value
   Range("a1:g" & derlig1).Sort key1:=Range("a1"), order1:=xlAscending, Header:=xlYes
   derlig2 = Cells(Rows.Count, "a").End(xlUp).Row
   If derlig2 < derlig1 Then Range(Cells(derlig2 + 1, "g"), Cells(derlig1, "g")).Clear
   ref = Cells(derlig2, "g")
   For i = derlig2 To 3 Step -1
      If Cells(i - 1, "g") <> ref Then ref = Cells(i - 1, "g"): Rows(i).Insert
   Next i
   Range("g:g").Clear
End Sub
 

Pièces jointes

  • olouis05- tri par bloc- v1.xlsm
    20.7 KB · Affichages: 6
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir olouis05, Dudu2, mapomme,

Avec la 1ère cellule du tableau en A1 exécutez cette macro :
VB:
Sub TriCColonneA()
Dim i&
Application.ScreenUpdating = False
With Range("A1", ActiveSheet.UsedRange.EntireRow)
    If .Rows.Count = 1 Then Exit Sub
    .Columns(2).EntireColumn.Insert 'colonne auxiliaire
    With .Rows(2).Resize(.Rows.Count - 1)
        .Columns(2) = "=IF(A2="""","""",IF(OR(ROW()=2,A1=""""),MAX(B$1:B1)+1,B1))"
        .Columns(2) = .Columns(2).Value 'supprime les formules
    End With
    .Sort .Columns(1), xlAscending, Header:=xlYes 'tri croissant
    For i = .Rows.Count To 3 Step -1
        If .Cells(i, 2) <> "" Then If .Cells(i, 2) <> .Cells(i - 1, 2) Then .Rows(i).Insert 'séparation
    Next
    .Columns(2).EntireColumn.Delete 'supprime la colonne auxiliaire
End With
End Sub
A+
 

olouis05

XLDnaute Nouveau
Bonjour à tous,

Merci pour vos éclaircissements...
Toutefois, j'essaie d'appliquer la macro donnée par "mapomme" (qui me semble être la solution) sur mon classeur, mais j'ai une erreur qui apparait : "Erreur de compilation. Utilisation incorrecte du mot clé Me" dans le mode Microsoft Visual Basic pour Applications.
J'ai testé avec plusieurs pistes : suppression de la protection du classeur, suppression des lignes avant celle des titres des colonnes, sauvegarde en .xlsm... Mais en vain !
Le souci vient peut-être aussi que j'ai déjà des macros et des lignes de code en VBA dans ce classeur...
Il y a aussi une formule : fonction "RECHERCHEV" dans la colonne "Intitulé" pour trouver le compte dans une autre feuille du classeur, pour chaque ligne...
J'avoue être un peu perdu.
Encore une fois, je suis preneur de tout conseil pour aboutir au résultat escompté.
A très vite donc.
Olive.
 

Membres actuellement en ligne

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 105
dernier inscrit
Joffrette