XL 2016 automatiser l'édition de factures

Achille_du_60

XLDnaute Nouveau
Bonjour
A partir d'un fichier comportant 2 onglets, un recap et une facture type, je souhaite automatiser la création d'autant de factures qu'il y a de lignes sur l'onglet recap avec enregistrement de chaque facture en pdf sous la forme "client".pdf.
Je me débrouille avec les macros, j'ai donc réussi à automatiser le remplissage de la facture en fonction du nom de client saisi.
Par contre, je ne maitrise pas le code VBA et je pense qu'il faut passer par là pour arriver à faire ce que je souhaite.
Quelqu'un peut-il m'aiguiller ?
Merci

En pièce jointe, un fichier anonymisé qui peut servir de support
 

Pièces jointes

  • facture.xlsx
    10.8 KB · Affichages: 18
Solution
Re,

Voici la macro remaniée pour votre fichier du post #1:
VB:
Sub ImprimerFacturesClients()
    Dim listeClients As Variant
    Dim Nom As Variant
    Dim i As Integer, count As Integer
    
    '
    ' Récupérer les valeurs de la liste des clients
     listeClients = Sheets("recap").Range("A1").CurrentRegion.Columns(1).Value
    
    With Sheets("Facture")
        '
        ' Parcourir tous les noms de la liste
        For i = 2 To UBound(listeClients)
            Nom = listeClients(i, 1)
            '
            ' Préparer la facture
            .Range("B2") = Nom
            '
            ' Laissez excel calculer la nouvelle facture
            Do While Application.CalculationState <> xlDone: Loop
            '
            ' Si le...

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans le classeur joint, j'ai un peu remanié votre tableau et l'ai transformé en tableau structuré excel et je l'ai nommé T_Détails (détails facture)
Pour vous démontrer l'utilité d'une telle présentation, j'en ai tiré un court tableau croisé dynamique sur la dernière feuille
Cela m'a permis de faire une liste unique des clients sur laquelle se base la macro d'impression facture.
Dans la feuille facture j'ai rajouté une colonne (qui pourra être masquée éventuellement) puis refais les formules.
Dans la colonne A la formule retourne le numéro d'odre d'apparition du nom de client dans le tableau de la feuille Détails.

J'ai également nommé certaine cellules, pour y faire référence dans la macro.
Cela rend les choses plus lisibles et permet qu'elles soient déplacées sans avoir à modifier la macro (tant que leur nom existe bien-sûr)

tout ceci est bien évidement une simple démonstration, à vous d'adapter selon vos souhaits et besoins.
P.S. les lignes pour lesquelles Qté = 0 n'apparaissent pas dans la facture (cela peut être changé)
VB:
Sub ImprimerFacturesClients()
    Dim listeClients As Variant
    Dim Nom As Variant
    Dim printNoms As String
    '
    ' Récupérer les valeurs de la liste des clients
    listeClients = Sheets("Détails").Range("T_Clients[Client]").Value
    With Sheets("Facture")
        '
        ' Parcourir tous les noms de la liste
        For Each Nom In listeClients
            '
            ' Préparer la facture
            .Range("Client.Choisi") = Nom
            '
            ' Laissez excel calculer la nouvelle facture
            Do While Application.CalculationState <> xlDone: Loop
            '
            ' Si le client à un total > à 0 on imprime
            If .Range("Facture.Total.Général") > 0 Then
                '
                ' Définif la plage d'impression
                .PageSetup.PrintArea = .Range(.Cells(2, 2), .Range("Facture.Total.Général")).Address
                '
                ' Exporter la feuille au format pdf
                .ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\" & Nom & ".pdf", _
                                     Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False
               
                printNoms = printNoms & Nom & ";"
            End If
        Next Nom
    End With
    '
    ' Si la variable PrintNoms contient quelque chose, c'est qu'il y a eu des clients à imprimer
    If printNoms <> "" Then
        '
        ' Enlever le ';' en fin de variable
        printNoms = Left(printNoms, Len(printNoms) - 1)
        '
        ' Avertir l'utilisateur du nombre d'impression
        MsgBox UBound(Split(printNoms, ";")) + 1 & " facture(s) client(s) imprimés(s): " & vbLf & _
                Replace(printNoms, ";", vbLf), vbInformation, "Impression facture"
    Else
        '
        ' Aucune facture à imprimer
        MsgBox "Aucune facture à imprimer", vbExclamation, "Impression facture"
    End If
End Sub
Cordialement
 

Pièces jointes

  • facture.xlsm
    26.2 KB · Affichages: 35

Achille_du_60

XLDnaute Nouveau
Merci à vous d'avoir consacré du temps sur ma demande.
Malheureusement, je ne peux pas changer la structure de mon état recap au vu du nombre de "clients" et "articles" de mon tableau réel.
De plus, je dois faire figurer toutes les lignes, y compris celles où la quantité est à 0.
Si une autre solution ne peut-être envisagée, je passerais par une étape supplémentaire qui consistera à transformer mon onglet recap existant en un recap au format que vous proposez.
Encore merci à vous pour votre aide.
Cordialement
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Voici la macro remaniée pour votre fichier du post #1:
VB:
Sub ImprimerFacturesClients()
    Dim listeClients As Variant
    Dim Nom As Variant
    Dim i As Integer, count As Integer
    
    '
    ' Récupérer les valeurs de la liste des clients
     listeClients = Sheets("recap").Range("A1").CurrentRegion.Columns(1).Value
    
    With Sheets("Facture")
        '
        ' Parcourir tous les noms de la liste
        For i = 2 To UBound(listeClients)
            Nom = listeClients(i, 1)
            '
            ' Préparer la facture
            .Range("B2") = Nom
            '
            ' Laissez excel calculer la nouvelle facture
            Do While Application.CalculationState <> xlDone: Loop
            '
            ' Si le client à un total > à 0 on imprime
            If .Range("E8") > 0 Then
                '
                ' Définif la plage d'impression
                .PageSetup.PrintArea = "$A$2:$E$8"
                '
                ' Exporter la feuille au format pdf
                .ExportAsFixedFormat Type:=xlTypePDF, Filename:=ThisWorkbook.Path & "\" & Nom & ".pdf", _
                                     Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False
                
                count = count + 1
            End If
        Next
    End With
    '
    ' Si la variable PrintNoms contient quelque chose, c'est qu'il y a eu des clients à imprimer
    If count > 0 Then
      
        '
        ' Avertir l'utilisateur du nombre d'impression
        MsgBox count & " facture(s) client(s) imprimées(s) ", vbInformation, "Impression facture"
    Else
        '
        ' Aucune facture à imprimer
        MsgBox "Aucune facture à imprimer", vbExclamation, "Impression facture"
    End If
End Sub

Bonne soirée
 

Discussions similaires