XL 2019 Tri avec des cellules vides.

Paulle

XLDnaute Occasionnel
Bonjour,

Je voudrai avec une macro faire le tri croissant sur la dernière colonne contenant des valeurs ici la colonne M.
Comme sur le tableau Vert.
La colonne "Produit" va augmenter.

J'ai bloqué sur la sélection de la cellule M4 la ligne 4 contenant des cellules vides.

Merci.
 

Pièces jointes

  • FichierA1.xlsx
    12.6 KB · Affichages: 20
C

Compte Supprimé 979

Guest
Bonjour,

La formule du total =SI(C4="";"";B4*C4) est absolument à éviter, vous allez au devant de gros ennuis

Si vous ne voulez pas voir de valeurs zero, il suffit de mettre le bon format nombre

@+
 

Paulle

XLDnaute Occasionnel
Merci BrunoM45 pour votre aide ;).
J'ai appliqué un format personnalisé "0;-0;;@" c'est vrai que je n'ai plus besoin de formule =si(..... mais je perds le format monétaire. Plage verte.

Dans le tableau Bleu, j'ai appliqué le format monétaire sans formule.
 

Pièces jointes

  • FichierA2.xlsx
    13.5 KB · Affichages: 8

job75

XLDnaute Barbatruc
Bonsoir Paulle, Bruno, R@chid,

Si je vous comprends bien Paulle vous voulez que les colonnes "Total" puissent être triées comme les autres.

C'est à dire que les cellules "vides" soient regroupées en fin de colonne.

Alors il ne faut pas de formules, utilisez le fichier .xlsm joint avec cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim derlig&
derlig = Application.Match("zzz", [A:A])
If derlig < 4 Or Application.CountIf(Rows(3), "Total") = 0 Then Exit Sub 'sécurité
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
If FilterMode Then ShowAllData 'si la feuille est filtrée
Rows(3).Replace "Total", "#N/A", xlWhole
With Intersect(Rows(3).SpecialCells(xlCellTypeConstants, 16).EntireColumn, Rows("4:" & derlig))
    .FormulaR1C1 = "=RC[-2]*RC[-1]" 'formules en colonnes Total
    With Range(.Areas(1), .Areas(.Areas.Count)): .Value = .Value: End With 'supprime les formules
    .EntireRow.Replace 0, "" 'efface les valeurs zéro
End With
Rows(3).Replace "#N/A", "Total"
Application.EnableEvents = True 'réactive les évènements
End Sub
Elle se déclenche automatiquement quand on modifie une cellule quelconque.

A+
 

Pièces jointes

  • Tri(1).xlsm
    19.5 KB · Affichages: 10

Paulle

XLDnaute Occasionnel
Bonsoir et merci R@chid.
Savez-vous où je peux trouver des explications ou tutos sur les formats personnalisés ?

Merci job75.
Ce que vous me proposer fonctionne bien. Mais j'avais dans la tête de trier sur la dernière colonne ayant des valeurs à l'aide d'un bouton relié à un bouton.

Bonne soirée.
 

job75

XLDnaute Barbatruc
Bonjour Paulle, le forum,

Plutôt qu'un bouton il vaut mieux un double-clic en ligne 3 sur une colonne quelconque, fichier (2) :
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim derlig&, derval As Variant
derlig = Application.Match("zzz", [A:A])
If Target.Row <> 3 Or derlig < 4 Then Exit Sub
With Target(2).Resize(derlig - 3)
    If Application.CountA(.Cells) = 0 Then Exit Sub 'si la colonne est vide
    If FilterMode Then ShowAllData 'si la feuille est filtrée
    derval = .Find("*", , xlValues, , , xlPrevious)
    .EntireRow.Sort Target, IIf(Target(2) > derval, xlAscending, xlDescending), Header:=xlNo 'tri
End With
Cancel = True
End Sub
Bon dimanche.
 

Pièces jointes

  • Tri(2).xlsm
    22.1 KB · Affichages: 9

Paulle

XLDnaute Occasionnel
Bonjour job75 et un grand merci.
C'est tout à fait ce qui me convient.

Je vais peut être créer une nouvelle discussion. Par curiosité j'aimerai savoir si en vba il est possible de sélectionner une plage contenant des cellules vides.
 

cp4

XLDnaute Barbatruc
Bonsoir Paulle, Bruno, R@chid,

Si je vous comprends bien Paulle vous voulez que les colonnes "Total" puissent être triées comme les autres.

C'est à dire que les cellules "vides" soient regroupées en fin de colonne.

Alors il ne faut pas de formules, utilisez le fichier .xlsm joint avec cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim derlig&
derlig = Application.Match("zzz", [A:A])
If derlig < 4 Or Application.CountIf(Rows(3), "Total") = 0 Then Exit Sub 'sécurité
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
If FilterMode Then ShowAllData 'si la feuille est filtrée
Rows(3).Replace "Total", "#N/A", xlWhole
With Intersect(Rows(3).SpecialCells(xlCellTypeConstants, 16).EntireColumn, Rows("4:" & derlig))
    .FormulaR1C1 = "=RC[-2]*RC[-1]" 'formules en colonnes Total
    With Range(.Areas(1), .Areas(.Areas.Count)): .Value = .Value: End With 'supprime les formules
    .EntireRow.Replace 0, "" 'efface les valeurs zéro
End With
Rows(3).Replace "#N/A", "Total"
Application.EnableEvents = True 'réactive les évènements
End Sub
Elle se déclenche automatiquement quand on modifie une cellule quelconque.

A+
Bonjour Tout Le Monde:),

Excusez mon intrusion pour poser une question.

@job75;) : Pourrais-tu Stp m'expliquer la ligne de code ci-dessous
VB:
Rows(3).Replace "Total", "#N/A", xlWhole
Merci de votre indulgence de mon ignorance. J'ai bien compris qu'il s'agit de la 3ème ligne, de la fonction remplacer. Je ne connais cette manière d'écriture de cette fonction. Avec mes remerciements anticipés.

Bonne journée.
 

job75

XLDnaute Barbatruc
Bonjour cp4, le forum,

Pour déterminer la plage des Total je remplace en ligne 3 cette valeur par la valeur d'erreur #N/A.

Que je recherche ensuite par SpecialCells(xlCellTypeConstants, 16)..

Avec le paramètre 16 les cellules recherchées sont celles contenant des erreurs.

A+
 

cp4

XLDnaute Barbatruc
Bonjour cp4, le forum,

Pour déterminer la plage des Total je remplace en ligne 3 cette valeur par la valeur d'erreur #N/A.

Que je recherche ensuite par SpecialCells(xlCellTypeConstants, 16)..

Avec le paramètre 16 les cellules recherchées sont celles contenant des erreurs.

A+
Rebonjour Job75,

Merci beaucoup. C'est plus clair pour ma petite cervelle😌😉

Bonne journée.
 

Paulle

XLDnaute Occasionnel
Bonjour tout le monde.

Je voulais que le tri soit fait sur la dernière colonne ayant des valeurs.
Comme dans votre fichier Tri2.

Après, je me demandais s'il était possible de sélectionner une plage contenant des cellules vides.

Le niveau devient trop élevé, je n'arrive pas à suivre.

Merci job75.

Bonne journée.
 

job75

XLDnaute Barbatruc
Bonjour Paulle,
Je voulais que le tri soit fait sur la dernière colonne ayant des valeurs.
Bah avec le double-clic qui peut le plus peut le moins !

Mais si vous tenez à avoir un bouton voyez ce fichier (3) et la macro dans le code de la feuille :
VB:
Sub Tri()
Dim derlig&, col%, derval As Variant
derlig = Application.Match("zzz", [A:A])
If derlig < 4 Then Exit Sub 'si le tableau est vide
If FilterMode Then ShowAllData 'si la feuille est filtrée
col = Rows("4:" & derlig).Find("*", , xlValues, , xlByColumns, xlPrevious).Column
With Cells(4, col).Resize(derlig - 3)
    derval = .Find("*", , , , , xlPrevious)
    .EntireRow.Sort .Cells, IIf(.Cells(1) > derval, xlAscending, xlDescending), Header:=xlNo 'tri
End With
End Sub
A+
 

Pièces jointes

  • Tri(3).xlsm
    23.1 KB · Affichages: 8

Discussions similaires

  • Résolu(e)
Microsoft 365 Tri et Import
Réponses
4
Affichages
186

Statistiques des forums

Discussions
312 366
Messages
2 087 639
Membres
103 627
dernier inscrit
nabil