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

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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.
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

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

Dernière édition:
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

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

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

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

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

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour