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 PDF
  • nomDocument : 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 :

  1. Déprotection de la feuille : Si la feuille est protégée, elle est temporairement déverrouillée pour effectuer les modifications.
  2. Date automatique : La date du jour est insérée dans la cellule J15 via la fonction Excel =TODAY().
  3. Remplissage automatique des infos client : À partir de l’identifiant client saisi en ligne 18, des fonctions VLOOKUP sont utilisées pour remplir automatiquement le nom, l’ICE, la ville, etc.
  4. 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!J16 puis transféré dans Devis_gestion2!J12.
  5. Nettoyage de l’ancienne réduction :
    • Les lignes 43:44 sont vidées et masquées.
    • Le total HT est recalculé dynamiquement.
  6. 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

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