Automatiser la facturation sans investir dans un logiciel
Une TPE qui émet 20 à 100 factures par mois peut gagner un temps considérable avec une macro VBA qui génère automatiquement chaque facture, attribue un numéro séquentiel, l’archive et l’envoie par email. Cette solution remplace des outils à 30 euros par mois pendant plusieurs années.
Architecture du classeur
Quatre feuilles : Clients (base clients), Produits (catalogue), Facture (modèle vierge), Historique (journal des factures émises).
Feuille Facture : modèle
En-tête : nom entreprise, NINEA, adresse, téléphone, email. Encart Facturé à avec formules RECHERCHEV sur Clients. Cellule J5 : numéro de facture. Tableau de lignes : Référence, Désignation, Quantité, Prix unitaire, Total. Totaux : HT, TVA 18 pour cent, TTC.
Étape 1 : VBA de numérotation
Sub NouvelleFacture()
Dim derniere As Long
derniere = Application.WorksheetFunction.Max(Sheets("Historique").Range("A:A"))
Sheets("Facture").Range("J5").Value = derniere + 1
Sheets("Facture").Range("J7").Value = Date
MsgBox "Nouvelle facture : " & derniere + 1
End Sub
Étape 2 : saisie client via formulaire
Insérer un bouton qui ouvre un UserForm avec liste déroulante Clients. À la sélection, les coordonnées remplissent automatiquement la facture :
Private Sub cmbClient_Change()
Dim c As Range
Set c = Sheets("Clients").Columns("A").Find(cmbClient.Value)
If Not c Is Nothing Then
Sheets("Facture").Range("B10").Value = c.Offset(0,1).Value 'Nom
Sheets("Facture").Range("B11").Value = c.Offset(0,2).Value 'Adresse
Sheets("Facture").Range("B12").Value = c.Offset(0,3).Value 'Ville
Sheets("Facture").Range("B13").Value = c.Offset(0,4).Value 'NINEA
End If
End Sub
Étape 3 : archivage automatique
Sub ArchiverFacture()
Dim lig As Long
lig = Sheets("Historique").Cells(Rows.Count, 1).End(xlUp).Row + 1
Sheets("Historique").Cells(lig, 1).Value = Sheets("Facture").Range("J5").Value
Sheets("Historique").Cells(lig, 2).Value = Sheets("Facture").Range("J7").Value
Sheets("Historique").Cells(lig, 3).Value = Sheets("Facture").Range("B10").Value
Sheets("Historique").Cells(lig, 4).Value = Sheets("Facture").Range("TotalTTC").Value
Sheets("Historique").Cells(lig, 5).Value = "Émise"
End Sub
Étape 4 : export PDF
Sub ExporterPDF()
Dim nom As String
nom = "FA" & Sheets("Facture").Range("J5").Value & "_" & _
Replace(Sheets("Facture").Range("B10").Value," ","_") & ".pdf"
Sheets("Facture").ExportAsFixedFormat xlTypePDF, _
"C:\Factures\" & nom, Quality:=xlQualityStandard
MsgBox "Facture exportée : " & nom
End Sub
Étape 5 : envoi par email via Outlook
Sub EnvoyerFacture()
Dim ol As Object, mail As Object
Set ol = CreateObject("Outlook.Application")
Set mail = ol.CreateItem(0)
mail.To = Sheets("Facture").Range("EmailClient").Value
mail.Subject = "Facture " & Sheets("Facture").Range("J5").Value
mail.Body = "Bonjour, veuillez trouver ci-joint votre facture. Cordialement."
mail.Attachments.Add "C:\Factures\FA" & Sheets("Facture").Range("J5").Value & ".pdf"
mail.Send
End Sub
Étape 6 : suivi des paiements
Sur Historique, colonne Statut avec liste déroulante (Émise, Payée, Relancée, Contentieux). Colonne DateEcheance. Mise en forme conditionnelle : rouge si DateEcheance dépassée et Statut différent de Payée.
Étape 7 : rapport mensuel
TCD sur Historique : CA émis par mois, taux d’impayés, délai moyen de paiement. Exportable en PDF pour l’expert-comptable.
Considérations légales
Au Sénégal, les factures doivent être émises en numérotation continue (pas de saut), conservées 10 ans, mentionner NINEA et TVA séparément. Le code VBA ci-dessus respecte ces exigences.
Conclusion
Une journée d’investissement VBA peut remplacer des années d’abonnement SaaS. Solution idéale pour freelances, artisans et petites PME. Pour évoluer : un passage à QuickBooks ou Odoo devient pertinent dès 300 factures par mois.