Microsoft 365 Simplifier un tableau en ne tenant compte que des cases non vides

Loïc Ch.

XLDnaute Nouveau
Bonsoir à tous,

Chaque semaine, je collecte des commandes de Fruits et de Légumes de salariés dans le cadre de mon activité en tant que membre du CSE.
Cela me donne un tableau relativement complexe à lire pour le primeur (, et il arrive parfois qu'il y ait ensuite des erreurs de produits lors de la livraison des commandes.
Je souhaiterais donc automatiser ce fichier pour créer des commandes spécifiques, qui viendrait chercher pour un client la quantité des produits souhaités.
Vous trouverez attaché à ce message un exemple avec le tableau global dans le premier onglet et la commande du client A dans le second onglet.

Qui peut/veut m'aider ? :)

Merci d'avance.
 

Pièces jointes

  • Liste_CSE_F&L.xlsx
    79 KB · Affichages: 10
Solution
Pour le lieu de livraison formule en D3 :
Code:
=SIERREUR(INDEX(Global!2:2;EQUIV(C1;Global!3:3;0));"")
Pour le cadrage du commentaire :
VB:
'---commentaire---
Set c = Cells([D4] + 8, 1)
[A6].Copy c 'pour les formats
c = "Commentaire"
With c(1, 2).Resize(, 3)
    .WrapText = True 'renvoi à la ligne
    .HorizontalAlignment = xlCenterAcrossSelection 'centre sur 3 colonnes
    .BorderAround Weight:=xlThin
End With
c(1, 2) = c(0, 4)
c(0, 4).Clear
Bonne nuit.

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir Ljjchabert, bonsoir le forum,

En pièce jointe une proposition VBA. Clique sur le bouton Commandes... Code commenté.
Ne pas supprimer l'onglet masqué Modèle !
 

Pièces jointes

  • LjjChabert_ED_v01.xlsm
    103.7 KB · Affichages: 6

Loïc Ch.

XLDnaute Nouveau
Bonjour Robert,

Merci pour cette réponse rapide !

Je me suis aperçu que lorsqu'il y avait des cellules fusionnées dans l'onglet Global, les informations ne remontaient pas correctement. J'ai donc dupliqué les cellules, et cela fonctionne parfaitement désormais.

Par contre, la première ligne du tableau devrait être désignation / provenance / prix / quantité souhaitée et il apparaît le premier produit choisi. Peux-tu voir ce souci ?

J'ai lancé la macro et j'ai dupliqué l'onglet du client A. Dans cette onglet A(2), je te présente ce que je souhaiterais obtenir à la fin. Cela est-il possible ? A minima, si tu peux me mettre les données dans les bonnes cases (voir mes commentaires), je pourrais me débrouiller ensuite pour mettre en forme rapidement chaque commande grâce au bouton "reproduire la mise en forme".

Merci en tout cas pour ton aide.
Je me débrouille correctement avec les fonctions d'Excel, mais je ne sais pas me servir de VBA. Je vais me lancer dans une formation via les tutos de forum !

Bonne après-midi.

Loïc
 

Pièces jointes

  • LjjChabert_ED_v01 commenté.xlsm
    176.3 KB · Affichages: 4

job75

XLDnaute Barbatruc
Bonjour ljjchabert, Robert, le forum,

Voyez le fichier (1) joint et cette macro dans le code de la feuille "Client" :
VB:
Private Sub Worksheet_Activate()
Worksheet_Change [C2] 'lance la macro
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [C2]) Is Nothing Then Exit Sub
Dim nom$, col As Variant, dercel As Range, P As Range, c As Range
nom = [C2]
Application.ScreenUpdating = False
Range("A5:E" & Rows.Count).Delete xlUp 'RAZ
With Sheets("Global")
    col = Application.Match(nom, .Rows(3), 0)
    If IsError(col) Then Exit Sub
    Set dercel = .Cells.SpecialCells(xlCellTypeLastCell)
    '---traitement des cellules fusionnées---
    Set P = .Range("B4:C" & dercel.Row)
    P.Copy P.Offset(, dercel.Column) 'pour mémoriser
    For Each c In P
        If c <> "" And c.MergeCells Then
            With c.MergeArea
                .UnMerge 'défusionne
                c.Copy .Cells
                .Borders.Weight = xlThin 'bordures
            End With
        End If
    Next
    '---filtrage---
    With .Range("B3", dercel)
        .Columns(col - 1).Font.Bold = False 'non gras
        .Cells(2, .Columns.Count + 1) = "=" & .Cells(2, col - 1).Address(0, 0) & "<>""""" 'critère de filtrage
        [D4] = nom
        .Cells(2, .Columns.Count + 1) = "" 'RAZ
        .AdvancedFilter xlFilterCopy, .Cells(1, .Columns.Count + 1).Resize(2), [A4:D4] 'filtre avancé copié vers A4:D4
        [D4] = "Quantité souhaitée"
    End With
    '---remise en état---
    With P.Offset(, dercel.Column)
        .Copy P
        .Delete xlToLeft
    End With
    With .UsedRange: End With
End With
With UsedRange: End With 'actualise la barre de défilement verticale
End Sub
Le filtre avancé est utilisé.

La macro se déclenche quand on modifie C2 ou qu'on active la feuille.

Je ne vois pas l'intérêt de la feuille A(2) de cotre post #3, si vous voulez une autre présentation il suffit de modifier un peu la macro, voyez le fichier (2).

Et il est totalement inutile de créer un onglet pour chaque client !

Edit : ajouté With .UsedRange: End With

A+
 

Pièces jointes

  • Liste_CSE_F&L(1).xlsm
    33.8 KB · Affichages: 1
  • Liste_CSE_F&L(2).xlsm
    34.3 KB · Affichages: 0
Dernière édition:

Loïc Ch.

XLDnaute Nouveau
Robert et job75,

Je vous remercie pour vos solutions. Un mix des 2 serait parfait !! lol
En tout cas, je vous remercie pour votre travail.

@ job75 :
1/ l'onglet A(2) de mon fichier était simplement pour montrer le résultat souhaité. Vous trouverez le visuel final souhaité (que j'ai fait à partir de votre fichier (2) : j'ai ajouté le lieu de livraison à aller chercher en ligne 2 et j'ai dissocié le commentaire possible (si inexistant, mettre RAS, ou ne rien faire apparaître du tout sera le top)
2/ la proposition du Robert d'afficher tous les clients m'intéresse fortement, car je pourrais ainsi tous les éditer dans un seul PDF au final par exemple. Est-il possible de tous les faire apparaître ?

Merci d'avance une nouvelle fois.

Bonne après-midi.

Loïc
 

Pièces jointes

  • Visuel final souhaité.pdf
    404.5 KB · Affichages: 4

Loïc Ch.

XLDnaute Nouveau
Job75,

J'ai en effet oublié d'attacher le fichier votre fichier (2) commenté.
Le voici.
Le lieu de livraison est soit 1 soit 2, en ligne 2.

En fait, une fois tous les onglets clients créés, je souhaiterais tous les imprimer dans un même PDF via l'impression PDF.

Merci d'avance pour votre aide.

Bonne après-midi.

Loïc
 

Pièces jointes

  • Liste_CSE_F&L(2) commenté.xlsm
    34.4 KB · Affichages: 1

Dugenou

XLDnaute Barbatruc
Bonjour,
Je n'ai lu que le premier message comme un gros ballot avant de voir que Job et Robert avaient répondu en VBA. Comme j'ai fait le travail en formule et qu'il serait dommage (pour moi) de l'avoir fait en pure perte, je vous le transfère pour info.
Cordialement
 

Pièces jointes

  • Ljjchabert_Liste_CSE_F&L.xlsx
    81.4 KB · Affichages: 3

job75

XLDnaute Barbatruc
Re, salut Dugenou,

Cette macro du fichier (3), toujours dans le code de la feuille "Client", crée le fichier PDF :
VB:
Sub PDF()
Dim nom$, dercol%, i%, a()
nom = [C1]
Application.ScreenUpdating = False
Application.DisplayAlerts = False
With Sheets("Global")
    dercol = .Cells(3, .Columns.Count).End(xlToLeft).Column
    For i = 6 To dercol
        Range("C1") = .Cells(3, i)
        Sheets.Add After:=Sheets(Sheets.Count)
        Cells.Copy ActiveSheet.Range("A1")
        Range("A3").Copy Range("A3") 'allège la mémoire
        With ActiveSheet.PageSetup
            .PrintArea = "A:D"
            .Zoom = False
            .FitToPagesWide = 1
        End With
    Next
End With
If Sheets.Count > 2 Then
    ReDim a(1 To Sheets.Count - 2)
    For i = 1 To UBound(a)
        a(i) = Sheets(i + 2).Name
    Next
    Sheets(a).Select 'sélection multiple
    ActiveSheet.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\" & [A1] & ".pdf"
    Application.EnableEvents = False 'désactive les évènements
    ActiveWindow.SelectedSheets.Delete 'RAZ
    Application.EnableEvents = True 'réactive les évènements
    Sheets(1).Select
    Me.Select
    [C1] = nom 'état initial
End If
End Sub
J'ai aussi complété la macro Worksheet_Change pour le commentaire.

A+
 

Pièces jointes

  • Liste_CSE_F&L(3).xlsm
    51.4 KB · Affichages: 1

Loïc Ch.

XLDnaute Nouveau
Bonsoir Dugenou,

Merci pour votre proposition.

Job75,

L'impression au PDF est top ! Merci beaucoup, c'est plus que je n'attendais ! VBA est vraiment puissant !
Puis-je néanmoins vous demander d'ajouter le lieu de livraison (ligne 2, CA ou L/A), comme indiqué dans mon précédent mail, et de faire en sorte que le commentaire ait un retour à la ligne automatique (voir l'extraction finale du client Q en page 17, son commentaire n'est pas complet) ?
 

Pièces jointes

  • Commande F&L S04.pdf
    249 KB · Affichages: 4
  • Liste_CSE_F&L(3) commenté.xlsm
    51.8 KB · Affichages: 1

job75

XLDnaute Barbatruc
Pour le lieu de livraison formule en D3 :
Code:
=SIERREUR(INDEX(Global!2:2;EQUIV(C1;Global!3:3;0));"")
Pour le cadrage du commentaire :
VB:
'---commentaire---
Set c = Cells([D4] + 8, 1)
[A6].Copy c 'pour les formats
c = "Commentaire"
With c(1, 2).Resize(, 3)
    .WrapText = True 'renvoi à la ligne
    .HorizontalAlignment = xlCenterAcrossSelection 'centre sur 3 colonnes
    .BorderAround Weight:=xlThin
End With
c(1, 2) = c(0, 4)
c(0, 4).Clear
Bonne nuit.
 

Pièces jointes

  • Liste_CSE_F&L(4).xlsm
    54.2 KB · Affichages: 2
Dernière édition:

Statistiques des forums

Discussions
312 166
Messages
2 085 899
Membres
103 024
dernier inscrit
rdge