Trier avec des cellules contenant des formules et des des liaisons.

DAVID-44-

XLDnaute Occasionnel
Bonjour, je reviens vers vous, car j’ai besoin d’un coup de main.

J’ai demandé dernièrement comment trier avec des cellules contenant des formules et des liaisons.
J’ai eu l’aide de sylvanu et R@chid (merci beaucoup) qui m’ont proposé des fichiers avec des formules matricielles. Malheureusement, ils font planter Excel, car très gourmands en ressources, mon pc n’étant pas très puissant.

Du coup, pour détourner le souci, je souhaiterais savoir si avec un bouton contenant une macro, il était possible de sélectionner seulement les lignes remplies, puis de les trier par ordre alphabétique, et cela pour chaque section de journée (de B3 - D42 puis B45 - D85 puis B87- D126 ETC.)

Merci de votre aide.
Bon dimanche.
 

Pièces jointes

  • MENU.xls
    70 KB · Affichages: 11
Dernière édition:

Dudu2

XLDnaute Barbatruc
J'ai supprimé mon post car je me suis rendu compte après que tu as un vieille version d'Excel dans laquelle on ne peut pas utiliser de tableaux structurés.

Quelle est ta version d'Office ?

Question: pourquoi tu as 40 lignes par menu ? Pour garder de la place ou pour des questions de mise en page à l'impression ?

Je trouve ta présentation peu exploitable et je me demande si su ne gagnerais pas à faire 1 ou 2 menus (cote à cote) par feuille (1 feuille par jour) plutôt que de tout aligner de cette manière.
 

fanch55

XLDnaute Barbatruc
Bonjour, à tester :
VB:
Sub Filtrer_Data()
Dim R As Range
    Set sh = ActiveWorkbook.Worksheets("MENU LILIANE")
    Set R = sh.Columns("b").Find("Produits", , xlValues, xlWhole, xlByRows, xlNext)
    Do While Not R Is Nothing
        If sr = "" Then sr = R.Address
        Rng = R.Offset(1).Address
        Set R = sh.Columns("b").Find("Produits", R, xlValues, xlWhole, xlByRows, xlNext)
        sh.Sort.SortFields.Clear
        sh.Sort.SortFields.Add Key:=sh.Range(Rng), Order:=xlDescending, SortOn:=xlSortOnValues
        sh.Sort.SortFields.Add Key:=sh.Range(Rng).Offset(0, 2), Order:=xlDescending, SortOn:=xlSortOnValues
        If R.Address = sr Then
            Set Plage = sh.Range(Rng & ":D" & sh.UsedRange.Rows.Count)
        Else
            Set Plage = sh.Range(Rng & ":D" & R.Row - 2)
        End If
        sh.Sort.SetRange Plage
        sh.Sort.Apply
        sh.Sort.SortFields.Clear
        sh.Sort.SortFields.Add Key:=sh.Range(Rng), Order:=xlAscending
        sh.Sort.SortFields.Add Key:=sh.Range(Rng).Offset(0, 2), Order:=xlAscending, SortOn:=xlSortOnValues
        If R.Address = sr Then
            Set S = sh.Range(Rng & ":b" & sh.UsedRange.Rows.Count).Find("")
        Else
            Set S = sh.Range(Rng & ":b" & R.Row - 2).Find("")
        End If
        sh.Sort.SetRange sh.Range(Rng & ":D" & S.Row - 1)
        sh.Sort.Apply
        If R.Address = sr Then Set R = Nothing
    Loop
End Sub
 

Dudu2

XLDnaute Barbatruc
Je n'ai pas cherché à modifier ta présentation qui est ton choix.
Par contre il faut que tu te débarrasses de ces '0' qui trainent dans les colonnes en modifiant l'option avancée de masquage des valeurs nulles.

Sinon utilise ce fichier qui contient la macro de tri (pour un tri Excel 93-2007 qui fonctionne aussi pour les versions suivantes) dans lequel j'ai viré les '0' masqués et modifié l'option correspondante.

Edit: si ta présentation actuelle change, adapte les constantes pour que le tri puisse suivre.
VB:
Const NbJours = 5
Const NbMenus = NbJours * 2
Const NbLignesMenu = 42
Const PremièreLigneMenu = 3
Const NbColonnesMenu = 3
Const PremièreColonneMenu = 2
 

Pièces jointes

  • MENU.xls
    63.5 KB · Affichages: 5
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Un essai en VBA sans que le tableau soit à intervalles réguliers.
Le code:
VB:
Sub trierMenu()
Dim derlig&, t, i&, i1&, i2&, j&

Application.ScreenUpdating = False
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
derlig = Cells(Rows.Count, "b").End(xlUp).Row: t = Range("b1:b" & derlig)
i2 = UBound(t)
Do
   For i = i2 To 1 Step -1
      If t(i, 1) <> "" Then Exit For
   Next i
   If i = 0 Then Exit Do
   For j = i - 1 To 1 Step -1
      If t(j, 1) = "PRODUITS" Then Exit For
   Next j
   If j = 0 Then Exit Do
   Range(Cells(j, 2), Cells(i, 4)).Sort key1:=Cells(j, 2), order1:=xlAscending, MatchCase:=False, Header:=xlYes
   i2 = j - 2: If i2 <= 1 Then Exit Sub
Loop
End Sub
 

Pièces jointes

  • DAVID-44- MENU- v1.xls
    93.5 KB · Affichages: 6

fanch55

XLDnaute Barbatruc
Pas de contraintes de nombre de lignes par jours,
prend en compte les quantités sans produits ( comme dans classeur initialement fourni )
VB:
Sub Filtrer_Data()
Dim R As Range, Sh As Range, Plage As Range
Dim Sr As String

    Set Sh = ActiveWorkbook.Worksheets("MENU LILIANE")
    Set R = Sh.Columns("b").Find("Produits", , xlValues, xlWhole, xlByRows, xlNext)
    Do While Not R Is Nothing
        If Sr = "" Then Sr = R.Address
        Rng = R.Offset(1).Address
        Set R = Sh.Columns("b").Find("Produits", R, xlValues, xlWhole, xlByRows, xlNext)
        Set Plage = Sh.Range(Rng & ":D" & IIf(R.Address = Sr, Sh.UsedRange.Rows.Count, R.Row - 2))
        Sh.Sort.SortFields.Clear
        Plage.Sort Header:=xlNo, Key1:=Plage.Columns(1), Order1:=xlAscending, key2:=Plage.Columns(3), order2:=xlAscending, MatchCase:=False
        If R.Address = Sr Then Set R = Nothing
    Loop

End Sub
 

Discussions similaires

Statistiques des forums

Discussions
315 087
Messages
2 116 084
Membres
112 655
dernier inscrit
fannycordi