Enregistrement Automatique & impression d'une Facture sur Excel avec VBA



✉️ Enregistrement Automatique & impression d'une Facture sur Excel avec VBA

Macro enregistrer facture VBA

Sub facture_enregistrer()

If ActiveSheet Is Facturation Then

Facturation.Select

If Factures_Liste.Range("E10").Value <> Facturation.Range("J16").Value Then


    Factures_Liste.Range("E10").EntireRow.Insert

    Factures_Liste.Range("E10").Value = Facturation.Range("J16").Value

    Factures_Liste.Range("F10").Value = Facturation.Range("J15").Value

    Factures_Liste.Range("G10").Value = Facturation.Range("E19").Value & "_" & Facturation.Range("E20").Value

    Factures_Liste.Range("H10").Value = Facturation.Range("J47").Value

    Factures_Liste.Range("I10").Value = "Impayée"

    Factures_Liste.Range("L10").Formula2R1C1 = "=YEAR([@Date])"

    Factures_Liste.Range("M10").Formula2R1C1 = "=MONTH([@Date])"

    

    Dim nomDocument As String, dossierAdresse As String

    dossierAdresse = Parameters.Range("K12").Value & "\"

     ''''''''''''''Bonus : vérifier que le dossier existe avant d'enregistrer '''***''''Tu peux ajouter un petit contrôle pour créer le dossier s’il n’existe pas :

    If Dir(dossierAdresse, vbDirectory) = "" Then

    MkDir dossierAdresse

    End If

    ''''''''''''''Bonus : vérifier que le dossier existe avant d'enregistrer '''***''''Tu peux ajouter un petit contrôle pour créer le dossier s’il n’existe pas :

                ' Crée le nom du document (sécurisé) enlèves les slash et..

    nomDocument = NettoyerNomFichier(Facturation.Range("J16").Value & "_" & Facturation.Range("E19").Value)

    Factures_Liste.Range("Q10").Value = dossierAdresse & nomDocument & ".pdf"

    With Factures_Liste.Hyperlinks.Add(Factures_Liste.Range("K10"), Address:=dossierAdresse & nomDocument & ".pdf", TextToDisplay:="Consulter")

        .Range.Font.Name = "Montserrat"

        .Range.Font.Color = RGB(60, 65, 205)

        .Range.Font.Size = 11

    End With    

    Dim wb As Workbook, feuille As Worksheet

    Dim plage As String

    Dim iVis As XlSheetVisibility

    Set wb = ThisWorkbook   

    Set feuille = Facturation 'Set feuille = wb.Sheets("Facture") devient--->>>Set feuille = Facturation sans wb quand j'utilise le code de la feuille aulieu de son nom 

    'Macro utiliser le nom de feuille visible devient Macro utiliser son code feuille VBA

    'Sheets("Réglement") devient Factures_Suivie_Règlement

    'Sheets("Réglement").Select devient Factures_Suivie_Règlement.Select

    'ActiveWorkbook.Worksheets("Réglement")devient Factures_Suivie_Règlement

    'If ActiveSheet.Name = "Facture" Then devien If ActiveSheet Is Facturation Then

    'Set feuille = wb.Sheets("Facture")devient Set feuille = Facturation sans wb

    'rempire les envlope

    Envlope_Adresse.Range("A2").EntireRow.Insert

    Envlope_Adresse.Range("A2").Value = Facturation.Range("E19").Value

    Envlope_Adresse.Range("B2").Value = Facturation.Range("E20").Value

    Envlope_Adresse.Range("C2").Value = Facturation.Range("A20").Value    

     'Fin rempire les envlope   

    'rempire les envlope

     'remplire feille reglement Réglement

   ''''''enlever la protection

    'If Factures_Suivie_Règlement.Unprotect = False Then

    'ActiveSheet.Unprotect

    'End If    

    If Factures_Suivie_Règlement.ProtectContents = True Then

    Factures_Suivie_Règlement.Unprotect

End If    

Set cell = Factures_Suivie_Règlement.Range("B10:B10")

Set tblf = Factures_Suivie_Règlement.ListObjects("T_Suivie_Reglement")

ICE = Mid(Facturation.Range("E21"), 5, 20)

 With Factures_Suivie_Règlement ' liste facture

         If Facturation.Range("N17").Value <> "" Then  'facture

      Factures_Suivie_Règlement.Range("E10").EntireRow.Insert

      Set cell = Factures_Suivie_Règlement.Range("B10:B10")

    With cell

        .Offset(0, tblf.ListColumns("ID INTERNE").Index - 1).Value = Facturation.Range("J16").Value

        .Offset(0, tblf.ListColumns("N°facture").Index - 1).Value = "N°: " & Facturation.Range("J16").Value

        .Offset(0, tblf.ListColumns("Date Facture").Index - 1).Value = Facturation.Range("J15").Value 'date facture

        .Offset(0, tblf.ListColumns("Nom du Client").Index - 1).Value = Facturation.Range("E19").Value  'nom du client

        .Offset(0, tblf.ListColumns("Ville").Index - 1).Value = Facturation.Range("E20").Value 'Ville du client

             

        .Offset(0, tblf.ListColumns("ICE").Index - 1).Value = ICE   ' ICE


               'Taux Réduction  S31       'Montant Réduction Q31   'TOTAL NET H.T. Q32 'TVA Q33

    .Offset(0, tblf.ListColumns("Montant TTC").Index - 1).Value = Facturation.Range("Q34").Value ' prix

        .Offset(0, tblf.ListColumns("Taux Réduction").Index - 1).Value = Facturation.Range("S31").Value  'Taux Réduction

        .Offset(0, tblf.ListColumns("Montant Réduction").Index - 1).Value = Facturation.Range("Q31").Value 'Montant Réduction

        .Offset(0, tblf.ListColumns("TOTAL NET H.T.").Index - 1).Value = Facturation.Range("Q32").Value ' TOTAL NET H.T

        .Offset(0, tblf.ListColumns("Montant TVA").Index - 1).Value = Facturation.Range("Q33").Value ' TVA

        .Offset(0, tblf.ListColumns("Montant HT").Index - 1).Value = Facturation.Range("Q30").Value ' prix

        .Offset(0, tblf.ListColumns("TAUX TVA").Index - 1).Value = "20%"

        'Désignation des biens et services

        .Offset(0, tblf.ListColumns("Désignation des biens et services").Index - 1).Value = Facturation.Range("E25").Value ' Désignation

       

        'Nombre de réglement***************************

        .Offset(0, tblf.ListColumns("N°REG").Index - 1).Value = Facturation.Range("N17").Value 'NBR paiement

        .Offset(0, tblf.ListColumns("Mode de paiement").Index - 1).Value = Facturation.Range("O17").Value 'MODE DE REGLEMENT

        .Offset(0, tblf.ListColumns("N° Chq").Index - 1).Value = Facturation.Range("P17").Value 'N° Cheque

        .Offset(0, tblf.ListColumns("Montant chaque traite").Index - 1).Value = Facturation.Range("R17").Value 'MONTANT CHAQUE TRAITE

        End With

    End If

End With 'fin With Factures_Suivie_Règlement ' liste facture


With Factures_Suivie_Règlement ' liste facture

    If Facturation.Range("N18").Value <> "" Then

      Factures_Suivie_Règlement.Range("E10").EntireRow.Insert

      Set cell = Factures_Suivie_Règlement.Range("B10:B10")

    With cell

        .Offset(0, tblf.ListColumns("ID INTERNE").Index - 1).Value = Facturation.Range("J16").Value

        .Offset(0, tblf.ListColumns("N°facture").Index - 1).Value = "N°: " & Facturation.Range("J16").Value

        .Offset(0, tblf.ListColumns("Date Facture").Index - 1).Value = Facturation.Range("J15").Value 'date facture

        .Offset(0, tblf.ListColumns("Nom du Client").Index - 1).Value = Facturation.Range("E19").Value  'nom du client

        .Offset(0, tblf.ListColumns("Ville").Index - 1).Value = Facturation.Range("E20").Value 'Ville du client  

        .Offset(0, tblf.ListColumns("ICE").Index - 1).Value = ICE   ' ICE

               'Taux Réduction  S31       'Montant Réduction Q31   'TOTAL NET H.T. Q32 'TVA Q33

    .Offset(0, tblf.ListColumns("Montant TTC").Index - 1).Value = Facturation.Range("Q34").Value ' prix

        .Offset(0, tblf.ListColumns("Taux Réduction").Index - 1).Value = Facturation.Range("S31").Value  'Taux Réduction

        .Offset(0, tblf.ListColumns("Montant Réduction").Index - 1).Value = Facturation.Range("Q31").Value 'Montant Réduction

        .Offset(0, tblf.ListColumns("TOTAL NET H.T.").Index - 1).Value = Facturation.Range("Q32").Value ' TOTAL NET H.T

        .Offset(0, tblf.ListColumns("Montant TVA").Index - 1).Value = Facturation.Range("Q33").Value ' TVA

        .Offset(0, tblf.ListColumns("Montant HT").Index - 1).Value = Facturation.Range("Q30").Value ' prix

        .Offset(0, tblf.ListColumns("TAUX TVA").Index - 1).Value = "20%"

        'Désignation des biens et services

        .Offset(0, tblf.ListColumns("Désignation des biens et services").Index - 1).Value = Facturation.Range("E25").Value ' Désignation 

    'Nombre de réglement***************************

        .Offset(0, tblf.ListColumns("N°REG").Index - 1).Value = Facturation.Range("N18").Value 'NBR paiement

        .Offset(0, tblf.ListColumns("Mode de paiement").Index - 1).Value = Facturation.Range("O18").Value 'MODE DE REGLEMENT

        .Offset(0, tblf.ListColumns("N° Chq").Index - 1).Value = Facturation.Range("P18").Value 'N° Cheque

        .Offset(0, tblf.ListColumns("Montant chaque traite").Index - 1).Value = Facturation.Range("R18").Value 'MONTANT CHAQUE TRAITE

    End With

      End If

 End With 'fin With Factures_Suivie_Règlement ' liste facture

     With Factures_Suivie_Règlement ' liste facture

    If Facturation.Range("N19").Value <> "" Then


 Factures_Suivie_Règlement.Range("B10").EntireRow.Insert

 Set cell = Factures_Suivie_Règlement.Range("B10:B10")

    With cell

        .Offset(0, tblf.ListColumns("ID INTERNE").Index - 1).Value = Facturation.Range("J16").Value

        .Offset(0, tblf.ListColumns("N°facture").Index - 1).Value = "N°: " & Facturation.Range("J16").Value

        .Offset(0, tblf.ListColumns("Date Facture").Index - 1).Value = Facturation.Range("J15").Value 'date facture

        .Offset(0, tblf.ListColumns("Nom du Client").Index - 1).Value = Facturation.Range("E19").Value  'nom du client

        .Offset(0, tblf.ListColumns("Ville").Index - 1).Value = Facturation.Range("E20").Value 'Ville du client

        .Offset(0, tblf.ListColumns("ICE").Index - 1).Value = ICE   ' ICE

               'Taux Réduction  S31       'Montant Réduction Q31   'TOTAL NET H.T. Q32 'TVA Q33

    .Offset(0, tblf.ListColumns("Montant TTC").Index - 1).Value = Facturation.Range("Q34").Value ' prix

        .Offset(0, tblf.ListColumns("Taux Réduction").Index - 1).Value = Facturation.Range("S31").Value  'Taux Réduction

        .Offset(0, tblf.ListColumns("Montant Réduction").Index - 1).Value = Facturation.Range("Q31").Value 'Montant Réduction

        .Offset(0, tblf.ListColumns("TOTAL NET H.T.").Index - 1).Value = Facturation.Range("Q32").Value ' TOTAL NET H.T

        .Offset(0, tblf.ListColumns("Montant TVA").Index - 1).Value = Facturation.Range("Q33").Value ' TVA

        .Offset(0, tblf.ListColumns("Montant HT").Index - 1).Value = Facturation.Range("Q30").Value ' prix

        .Offset(0, tblf.ListColumns("TAUX TVA").Index - 1).Value = "20%"

        'Désignation des biens et services

        .Offset(0, tblf.ListColumns("Désignation des biens et services").Index - 1).Value = Facturation.Range("E25").Value ' Désignation

        

    'Nombre de réglement***************************

        .Offset(0, tblf.ListColumns("N°REG").Index - 1).Value = Facturation.Range("N19").Value 'NBR paiement

        .Offset(0, tblf.ListColumns("Mode de paiement").Index - 1).Value = Facturation.Range("O19").Value 'MODE DE REGLEMENT

        .Offset(0, tblf.ListColumns("N° Chq").Index - 1).Value = Facturation.Range("P19").Value 'N° Cheque

        .Offset(0, tblf.ListColumns("Montant chaque traite").Index - 1).Value = Facturation.Range("R19").Value 'MONTANT CHAQUE TRAITE   

    End With

      End If

 End With 'fin With Factures_Suivie_Règlement ' liste facture

     With Factures_Suivie_Règlement ' liste facture

    If Facturation.Range("N20").Value <> "" Then


 Factures_Suivie_Règlement.Range("B10").EntireRow.Insert

 Set cell = Factures_Suivie_Règlement.Range("B10:B10")

    With cell

        .Offset(0, tblf.ListColumns("ID INTERNE").Index - 1).Value = Facturation.Range("J16").Value

        .Offset(0, tblf.ListColumns("N°facture").Index - 1).Value = "N°: " & Facturation.Range("J16").Value

        .Offset(0, tblf.ListColumns("Date Facture").Index - 1).Value = Facturation.Range("J15").Value 'date facture

        .Offset(0, tblf.ListColumns("Nom du Client").Index - 1).Value = Facturation.Range("E19").Value  'nom du client

        .Offset(0, tblf.ListColumns("Ville").Index - 1).Value = Facturation.Range("E20").Value 'Ville du client

        .Offset(0, tblf.ListColumns("ICE").Index - 1).Value = ICE   ' ICE

               'Taux Réduction  S31       'Montant Réduction Q31   'TOTAL NET H.T. Q32 'TVA Q33

        .Offset(0, tblf.ListColumns("Montant TTC").Index - 1).Value = Facturation.Range("Q34").Value ' prix

        .Offset(0, tblf.ListColumns("Taux Réduction").Index - 1).Value = Facturation.Range("S31").Value  'Taux Réduction

        .Offset(0, tblf.ListColumns("Montant Réduction").Index - 1).Value = Facturation.Range("Q31").Value 'Montant Réduction

        .Offset(0, tblf.ListColumns("TOTAL NET H.T.").Index - 1).Value = Facturation.Range("Q32").Value ' TOTAL NET H.T

        .Offset(0, tblf.ListColumns("Montant TVA").Index - 1).Value = Facturation.Range("Q33").Value ' TVA

        .Offset(0, tblf.ListColumns("Montant HT").Index - 1).Value = Facturation.Range("Q30").Value ' prix

        .Offset(0, tblf.ListColumns("TAUX TVA").Index - 1).Value = "20%"

        'Désignation des biens et services

        .Offset(0, tblf.ListColumns("Désignation des biens et services").Index - 1).Value = Facturation.Range("E25").Value ' Désignation         

    'Nombre de réglement***************************

        .Offset(0, tblf.ListColumns("N°REG").Index - 1).Value = Facturation.Range("N20").Value 'NBR paiement

        .Offset(0, tblf.ListColumns("Mode de paiement").Index - 1).Value = Facturation.Range("O20").Value 'MODE DE REGLEMENT

        .Offset(0, tblf.ListColumns("N° Chq").Index - 1).Value = Facturation.Range("P20").Value 'N° Cheque

        .Offset(0, tblf.ListColumns("Montant chaque traite").Index - 1).Value = Facturation.Range("R20").Value 'MONTANT CHAQUE TRAITE

        

    End With

      End If

 End With 'fin With Factures_Suivie_Règlement ' liste facture

    'fin remplire feille reglement Réglement

    'fin remplire feille reglement Réglement

   

     ''''''proteger la feuille réglement

    Factures_Suivie_Règlement.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

       'Mettre à plage l adresse de la plage à imprimer

    plage = "$C$8:$M$64"

    Application.ScreenUpdating = False

    With feuille.PageSetup      '**************'**************il faut que le nom d'école ne comporte pas les slashe verifier le nom'**************'**************

            .PrintArea = plage

            .FitToPagesTall = 1

            .FitToPagesWide = 1

            .LeftMargin = Application.InchesToPoints(0)

            .RightMargin = Application.InchesToPoints(0)

            .TopMargin = Application.InchesToPoints(0)

            .BottomMargin = Application.InchesToPoints(0)

    End With

 With feuille        '**************'**************il faut que le nom d'école ne comporte pas les slashe verifier le nom'**************'**************

          With feuille        '**************'**************il faut que le nom d'école ne comporte pas les slashe verifier le nom'**************'**************

            iVis = .Visible

            .Visible = xlSheetVisible

            .Activate

            .ExportAsFixedFormat Type:=xlTypePDF, _

                Filename:=dossierAdresse & nomDocument & ".pdf", _

                Quality:=xlQualityStandard, IncludeDocProperties:=True, _

                IgnorePrintAreas:=False, OpenAfterPublish:=True

            .Visible = iVis

    End With

    Application.ScreenUpdating = True

    End With

    Application.ScreenUpdating = True


 Else

MsgBox " Même num facture"

End If

 Else

  MsgBox "il faut être dans la feille facture"

  End If

End Sub 

Voici une explication claire, étape par étape, des bases VBA utilisées dans ta macro facture_enregistrer. On va décortiquer les principales structures et syntaxes utilisées dans ce code afin de comprendre, même pour les débutent.


🔧 1. Déclaration de la procédure


Sub facture_enregistrer()

Cette ligne déclare une macro nommée facture_enregistrer. Le mot-clé Sub signifie "Subroutine", soit une procédure qui ne retourne pas de valeur. Elle peut être lancée manuellement ou appelée par un autre code.


🧾 2. Vérifier que la feuille active est bien la feuille de facturation


If ActiveSheet Is Facturation Then

Ici, ActiveSheet représente la feuille actuellement affichée. Facturation est le nom de code VBA de la feuille (et non son nom visible par l’utilisateur).

Is est utilisé pour comparer deux objets (ici, deux feuilles Excel).


📥 3. Vérification si la facture est déjà enregistrée


If Factures_Liste.Range("E10").Value <> Facturation.Range("J16").Value Then

On vérifie ici si la valeur dans la cellule E10 de la feuille Factures_Liste est différente de celle dans J16 de la feuille Facturation. Cela permet d’éviter d’enregistrer deux fois la même facture.


🧩 4. Insertion d'une ligne et remplissage de données


Factures_Liste.Range("E10").EntireRow.Insert

Cette ligne insère une nouvelle ligne vide avant la ligne 10, pour ajouter une nouvelle facture.

Les lignes suivantes remplissent ensuite plusieurs cellules avec les valeurs de la feuille Facturation :


Factures_Liste.Range("E10").Value = Facturation.Range("J16").Value 'Numéro de facture ... Factures_Liste.Range("M10").Formula2R1C1 = "=MONTH([@Date])" 'Mois

👉 Formula2R1C1 est une syntaxe de formule compatible avec les Tableaux Excel (ListObjects). Elle permet d’utiliser des formules dynamiques avec les noms de colonnes.


📁 5. Création du dossier si besoin


If Dir(dossierAdresse, vbDirectory) = "" Then MkDir dossierAdresse End If
  • Dir(...) vérifie si un dossier existe.

  • MkDir crée le dossier si nécessaire.


🔗 6. Création d’un lien hypertexte


With Factures_Liste.Hyperlinks.Add(...) .Range.Font.Name = "Montserrat" ... End With

Cela insère un lien dans la cellule K10 qui pointe vers le fichier PDF de la facture, avec une mise en forme personnalisée.


✉️ 7. Ajout des coordonnées dans une feuille "Enveloppe"


Envlope_Adresse.Range("A2").EntireRow.Insert Envlope_Adresse.Range("A2").Value = Facturation.Range("E19").Value ...

Même principe que précédemment : on ajoute une ligne vide en haut puis on y insère le nom, la ville et l'adresse du client.


🛡️ 8. Déprotéger la feuille si besoin


If Factures_Suivie_Règlement.ProtectContents = True Then Factures_Suivie_Règlement.Unprotect End If

Cette partie vérifie si la feuille est protégée (verrouillée), et la déverrouille temporairement pour pouvoir y écrire.


📊 9. Enregistrement des paiements (jusqu’à 4 échéances)

Les blocs If Facturation.Range("N17").Value <> "" Then à N20 sont très similaires. Pour chaque échéance de paiement, le code :

  • Insère une nouvelle ligne

  • Remplit les informations de la facture

  • Ajoute les détails du règlement (mode de paiement, n° chèque, montant, etc.)


🔁 Récapitulatif des techniques VBA utilisées

Élément Explication
Sub ... End Sub Crée une macro
If ... Then ... End If Condition
.Insert Insère une ligne ou colonne
.Value, .Formula2R1C1 Écrit des valeurs ou des formules
With ... End With Simplifie l’écriture répétitive
Dir, MkDir Gère les dossiers
.Hyperlinks.Add Ajoute un lien
ListObjects, .ListColumns Utilise les tableaux Excel
.Offset(row, col) Accède à une cellule relative
Unprotect Déverrouille une feuille protégée


Commentaires

Posts les plus consultés de ce blog

🛠 Utilisation de CustomUIEditor pour Personnaliser le Ruban Excel

🗓️ Simulateur de Congés et Calendrier Collaboratif sous Google Sheets

Explication VBA : Facturation automatique Gestion client