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
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
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
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
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 :
👉 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
-
Dir(...)vérifie si un dossier existe. -
MkDircrée le dossier si nécessaire.
🔗 6. Création d’un lien hypertexte
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"
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
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
Enregistrer un commentaire