Explication VBA : Facturation automatique Gestion Devis
🧾 Macro Excel : Exporter un devis en PDF automatiquement
| devis_imprimer |
|---|
| Sub devis_imprimer() If ActiveSheet Is Devis_gestion Then Devis_gestion.Select
Dim wb As Workbook, feuille As Worksheet Dim plage As String, nomDocument As String, dossierAdresse As String Dim iVis As XlSheetVisibility Set wb = ThisWorkbook Set feuille = Devis_gestion 'sans wb.quand j'ulisse le code au lieu du nom vsible de la feuille dossierAdresse = Parameters.Range("K9").Value & "\" nomDocument = feuille.Range("J16").Value & "_" & Devis_gestion2.Range("E10").Value ''''''''''''''vérifier que le dossier existe avant d'enregistrer '''***'''' If Dir(dossierAdresse, vbDirectory) = "" Then MkDir dossierAdresse End If ''''''''''vérifier que le dossier existe avant d'enregistrer '''***'''' 'Mettre à plage l adresse de la plage à imprimer plage = "$C$8:$M$55" Application.ScreenUpdating = False With feuille.PageSetup .PrintArea = plage .FitToPagesTall = 1 .FitToPagesWide = 1 'Set FitToPagesWide to 1 .LeftMargin = Application.InchesToPoints(0) .RightMargin = Application.InchesToPoints(0) .TopMargin = Application.InchesToPoints(0) .BottomMargin = Application.InchesToPoints(0) End With With feuille 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
Else MsgBox "il faut être dans la feille DEVIS" End If
End Sub |
Cette macro permet d’imprimer et d’enregistrer automatiquement un devis Excel au format PDF, tout en définissant le nom du fichier et son emplacement selon les informations saisies dans le classeur.
🎯 Objectif
Générer un PDF propre du devis, à partir de la feuille Devis_gestion, avec :
- Un nom de fichier personnalisé (client + référence)
- Un dossier de destination défini dynamiquement
- Une mise en page optimisée pour l'impression
🛠 Étapes du code
✅ 1. Vérification de la feuille active
If ActiveSheet Is Devis_gestion Then
La macro ne s’exécute que si l’utilisateur est sur la bonne feuille. Sinon, un message s’affiche :
MsgBox "il faut être dans la feille DEVIS"
📁 2. Préparation du fichier
Définition des variables nécessaires :
Set feuille = Devis_gestion
dossierAdresse = Parameters.Range("K9").Value & "\"
nomDocument = feuille.Range("J16").Value & "_" & Devis_gestion2.Range("E10").Value
dossierAdresse: chemin du dossier où enregistrer le PDFnomDocument: nom du fichier PDF
📂 3. Création du dossier si inexistant
If Dir(dossierAdresse, vbDirectory) = "" Then
MkDir dossierAdresse
End If
Cette étape garantit que le dossier existe pour éviter une erreur à l’enregistrement.
🖨 4. Définition de la zone d’impression
plage = "$C$8:$M$55"
With feuille.PageSetup
.PrintArea = plage
.FitToPagesTall = 1
.FitToPagesWide = 1
.LeftMargin = 0
.RightMargin = 0
.TopMargin = 0
.BottomMargin = 0
End With
La zone d'impression est adaptée à une seule page, sans marges, pour une présentation optimale.
📤 5. Exportation en PDF
With feuille
iVis = .Visible
.Visible = xlSheetVisible
.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=dossierAdresse & nomDocument & ".pdf", _
Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=True
.Visible = iVis
End With
Le fichier PDF est généré, nommé automatiquement, et ouvert après création.
✅ Résultat
- PDF généré avec les bonnes infos
- Dossier créé automatiquement si besoin
- Nom de fichier personnalisé
- Feuille imprimée proprement
Une solution rapide et professionnelle pour générer vos devis !
📄 Génération d’un nouveau devis à partir d’un modèle Excel
| Sub nouveau_devis2() |
|---|
Sub nouveau_devis2() Devis_gestion2.Select If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If 'date jour dans J15 Range("J11:L15").Select ActiveCell.FormulaR1C1 = "=TODAY()" 'début info ecole Range("E10").Select ActiveCell.FormulaR1C1 = "=R[8]C[-4]" Range("E11").Select ActiveCell.FormulaR1C1 = "=IFERROR(VLOOKUP(R18C1,Clients,5,FALSE()),"""")" Range("E12").Select ActiveCell.FormulaR1C1 = "=IFERROR(""ICE ""&VLOOKUP(R18C1,Clients,3,FALSE()),"""")" 'fin info ecole ' Fin totalht Macro 'mettre le non de la recherche Range("A18").Select ActiveCell.FormulaR1C1 = "=IF(R[-6]C<>"""",R[-6]C,"""")" 'préparation de numéro de devis dans le 1er model annee = Year(Date) mois = Month(Date) mois = Format(Month(Date), "00") ID = Right(Devis_gestion.Range("J16"), 3) anneeFacture = Mid(Devis_gestion.Range("J16"), 2, 4) moisFacture = Mid(Devis_gestion.Range("J16"), 6, 2) If Int(mois) = Int(moisFacture) Then Devis_gestion.Range("J16") = "D" & annee & mois & Format(Int(ID) + 1, "000") Else Devis_gestion.Range("J16") = "D" & annee & mois & "0001" End If 'Fin préparation de numéro de devis dans le 1er model ' mettre le numéro dans le nouveau model Devis_gestion2.Range("J12").Value = Devis_gestion.Range("J16").Value ' totalht Macro ' Fin totalht Macro 'enlever la réduction Range("H43:L44").Select Selection.ClearContents Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone Selection.Borders(xlEdgeLeft).LineStyle = xlNone Selection.Borders(xlEdgeTop).LineStyle = xlNone Selection.Borders(xlEdgeBottom).LineStyle = xlNone Selection.Borders(xlEdgeRight).LineStyle = xlNone Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone Range("H45:I45").Select ActiveCell.FormulaR1C1 = "Montant Total HT :" Range("J45:L45").Select ActiveCell.FormulaR1C1 = "=IFERROR(SUM(R[-21]C:R[-5]C[2]),"""")" 'mascquer ligne réduction Rows("43:44").Select Selection.EntireRow.Hidden = True Range("J47:L47").Select 'fin enlever la réduction Range("A18:B18").Select ActiveCell.FormulaR1C1 = "=R[-6]C" 'fin calcul prix 'affiche tout Columns("P:AI").Select Range("P7").Activate Selection.EntireColumn.Hidden = False ActiveWindow.ScrollColumn = 11 ActiveWindow.ScrollColumn = 10 ActiveWindow.ScrollColumn = 8 ActiveWindow.ScrollColumn = 7 ActiveWindow.ScrollColumn = 5 ActiveWindow.ScrollColumn = 4 ActiveWindow.ScrollColumn = 3 ActiveWindow.ScrollColumn = 2 ActiveWindow.ScrollColumn = 1 'affiche tout Range("E18").Select 'proteger la feuille ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub |
Cette macro nouveau_devis2 permet de créer un nouveau devis dans une feuille dédiée Devis_gestion2, tout en gardant la continuité de la numérotation depuis le modèle principal Devis_gestion. Elle est utile pour dupliquer des modèles sans compromettre le suivi administratif des devis.
🔧 Étapes principales de la macro :
- Déprotection de la feuille : Si la feuille est protégée, elle est temporairement déverrouillée pour effectuer les modifications.
- Date automatique : La date du jour est insérée dans la cellule
J15via la fonction Excel=TODAY(). - Remplissage automatique des infos client : À partir de l’identifiant client saisi en ligne 18, des fonctions
VLOOKUPsont utilisées pour remplir automatiquement le nom, l’ICE, la ville, etc. - Préparation du numéro de devis :
- Le numéro de devis est généré à partir de l’année et du mois en cours (ex :
D2025040001). - Si un devis existe déjà pour le mois en cours, on incrémente l’ID existant. Sinon, on commence un nouveau compteur à
0001. - Ce numéro est stocké dans
Devis_gestion!J16puis transféré dansDevis_gestion2!J12.
- Le numéro de devis est généré à partir de l’année et du mois en cours (ex :
- Nettoyage de l’ancienne réduction :
- Les lignes
43:44sont vidées et masquées. - Le total HT est recalculé dynamiquement.
- Les lignes
- Affichage et protection : Toutes les colonnes masquées sont rendues visibles pour l’utilisateur. Ensuite, la feuille est à nouveau protégée.
📌 Remarque importante :
Ce système permet de conserver un seul compteur de numérotation dans Devis_gestion tout en utilisant un ou plusieurs modèles secondaires. Il évite les doublons de devis et facilite le suivi chronologique.

Commentaires
Enregistrer un commentaire