
Bienvenue sur Savoir et Partage ! Dans la gestion d’une activité professionnelle ou d’un projet informatique, l’édition de factures, le suivi des fiches clients et la préparation des envois postaux sont des tâches quotidiennes chronophages. Et si nous laissions Excel faire tout le travail de configuration à notre place en un seul clic ?
Dans cet article, nous allons décortiquer une macro VBA complète qui automatise à 100 % la mise en page d’une Facture au format strict A4, génère une feuille de configuration dynamique contenant vos listes de clients/tarifs, et prépare une feuille logistique pour vos enveloppes.
Si vous préférez monter votre fichier à la main sans utiliser le code, pas de panique : nous détaillons d’abord toute la structure manuelle, emplacement par emplacement. Vous trouverez ensuite le code complet à copier-coller en fin de page.
1. Ce que fait la macro en un coup d’œil (Résumé)
La macro réalise trois actions majeures dans votre classeur :
- Elle formate la feuille active pour en faire une facture élégante, au design moderne (thème épuré, typographie Aptos Narrow), pré-configurée pour une impression parfaite sur une page A4 (marges à zéro).
- Elle crée une deuxième feuille nommée
Param_CL_et_PRIXqui fait office de base de données (ICE clients, tarifs des produits, répertoires d’enregistrement système) et injecte des listes déroulantes intelligentes. - Elle crée une troisième feuille nommée
Envlope_Adressestructurant les coordonnées logistiques (Nom, Ville, Adresse) pour faciliter vos envois de courriers.
2. Structure et Architecture Manuelle du Fichier
Si vous ne souhaitez pas exécuter la macro et préférez configurer votre classeur vous-même, voici les emplacements exacts et les paramètres à appliquer.
Feuille 1 : « Facture » (Mise en page & Design)
- Zone d’impression A4 : Plage
$C$8:$M$64(Fond Blanc). Tout le reste de la feuille reçoit un fond gris clair épuré. - En-têtes du tableau (Ligne 24) : *
E24: REF (Aligné à gauche)F24: DESCRIPTION (Fusionné deF24:G24, aligné à gauche)H24: Qté (Centré)I24: PRIX HT (Centré)J24: Total HT (Fusionné deJ24:L24, centré)
- Corps du tableau (Lignes 25 à 41) : Les cellules de descriptions (
F:G) et de totaux (J:L) sont fusionnées ligne par ligne pour permettre une saisie propre. - Bloc Date & Numéro : *
I15(« Date : ») etI16(« N° : ») alignés à droite.J15:L15(Fusionné) contient la formule=AUJOURDHUI()pour une date automatique.
- Zone de Contrôle Invisible : La cellule
B24sert à stocker la date pivot pour les abonnements. Elle est nomméeDate_Fin_Old_CM.
Feuille 2 : « Param_CL_et_PRIX » (Les Tableaux de Données)
Cette feuille regroupe plusieurs tableaux Excel structurés (ListObjects) répartis de manière chirurgicale :
| Nom du Tableau | Emplacement (Plage) | Description / Contenu |
Clients | G10:AE20 | Contient 25 colonnes (Nom, ICE, Ville, Responsable, Adresse, suivi des licences Produits 1, 2, 3, Site Web et Forfait SMS). |
Produits | AN10:AP35 | Catalogue des tarifs avec 3 colonnes : Désignation, Référence, et Prix (Formaté en ##0,00 "DH"). |
Periode_facture | AK1:AQ3 | Générateur automatique de dates et textes de périodes de maintenance (Année+1, Fin de mois, etc.). |
Tabl_maintenance1 | AR10:AS20 | Détail des prestations pour la Maintenance Produit 1. |
Tabl_maintenance2 | AU10:AV20 | Détail des prestations pour la Maintenance Produit 2. |
Tabl_maintenance3 | AX10:AY20 | Configuration complète (Produit 1 + Produit 2 + Site Web). |
💡 Le secret des listes déroulantes : Une plage nommée appelée
Designation_ref_prixest adossée à la colonneDésignationdu tableauProduits. Elle est utilisée comme critère de Validation des données pour distribuer des menus déroulants automatiques dans le corps de la facture (F25:G41) et dans les tableaux de maintenance.
Feuille 3 : « Envlope_Adresse » (Logistique courriers)
Si vous créez cette feuille manuellement, appliquez la structure suivante sur la toute première ligne :
- Cellule
A1: Nom (Largeur de colonne conseillée : 30) - Cellule
B1: Ville (Largeur de colonne conseillée : 15) - Cellule
C1: Adresse (Largeur de colonne conseillée : 50)
3. Les Formules Clés intégrées dans le Système
Pour assurer la dynamique des dates d’abonnements et de maintenance, le tableau Periode_facture utilise des formules locales spécifiques :
- Calcul de la période annuelle standard (Ligne 2) :
- Début du mois précédent :
=DATE(ANNEE(AK2);MOIS(AK2)-1;1) - Fin du mois précédent :
=FIN.MOIS(AL2;0) - Date Échéance (+365j) :
=AN2+365 - Texte de la période : Compiles automatiques via la fonction
TEXTE(Date; "00/00/AAAA").
- Début du mois précédent :
4. Astuce Pro : Renommer le « CodeName » de vos feuilles (Méthode Manuelle)
Dans le monde du VBA, il existe deux noms pour une feuille Excel : le nom classique qui apparaît sur l’onglet en bas de votre écran, et le CodeName (le nom interne de la feuille utilisé par les développeurs). Modifier le CodeName par programmation VBA demande de modifier les options de sécurité globales d’Excel pour autoriser l’accès au projet, ce qui génère régulièrement des bugs et des blocages de sécurité sur les postes de vos utilisateurs.
Comme la méthode simple est toujours la plus efficace, voici comment attribuer un CodeName propre à vos trois feuilles manuellement en moins de 15 secondes :
- Ouvrez l’éditeur VBA en pressant les touches ALT + F11 de votre clavier.
- Dans la colonne de gauche (l’Explorateur de projets), repérez votre liste de feuilles.
- Cliquez une fois sur la feuille correspondante pour la sélectionner.
- Si la fenêtre des propriétés n’apparaît pas en bas à gauche, appuyez sur la touche F4 pour l’afficher.
- Dans la liste des propriétés, repérez la toute première ligne :
(Name)(écrite avec des parenthèses). - Modifiez la valeur à droite de la ligne en saisissant précisément :
Facturepour votre feuille de facturation.Param_CL_et_PRIXpour votre feuille de paramètres.Envlope_Adressepour votre nouvelle feuille logistique.
Grâce à cette manipulation, votre projet devient 100 % robuste : même si un collaborateur renomme ou modifie manuellement l’onglet Excel visible en bas de l’écran, vos macros continueront de s’émaner sans jamais planter !
5. Code VBA Global : Générer le projet en 1 clic
Pour installer ce code : ouvrez votre classeur, appuyez sur ALT + F11, insérez un nouveau module (Insertion > Module), collez-y le script ci-dessous, puis fermez la fenêtre et lancez la macro !
VBA
Sub Generer_Facture_Et_Configuration_Global()
Dim wsFacture As Worksheet, wsParam As Worksheet, wsEnveloppe As Worksheet
Dim SH As Shape
Dim plageFacture As String
Dim tbl As ListObject
Dim Entetes As Variant, Clients As Variant, tName As Variant
Dim i As Integer
' 1. INITIALISATION ET OPTIMISATION DE L'ENVIRONNEMENT
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set wsFacture = ActiveSheet
plageFacture = "$C$8:$M$64"
On Error Resume Next
wsFacture.Name = "Facture"
On Error GoTo 0
' 2. CONSTRUCTION DE LA ZONE DE FACTURATION (A4)
With wsFacture.Cells.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorLight2
.TintAndShade = 0.899990844447157
End With
With wsFacture.Range(plageFacture).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With
wsFacture.Columns("C:D").ColumnWidth = 4
wsFacture.Columns("E:E").ColumnWidth = 21
wsFacture.Columns("F:G").ColumnWidth = 25
wsFacture.Columns("H:H").ColumnWidth = 10.14
wsFacture.Columns("I:I").ColumnWidth = 18
wsFacture.Columns("J:K").ColumnWidth = 5
wsFacture.Columns("L:M").ColumnWidth = 10
wsFacture.Rows("8:11").RowHeight = 14
wsFacture.Rows("12:12").RowHeight = 30
wsFacture.Rows("14:14").RowHeight = 14
wsFacture.Rows("15:16").RowHeight = 15.75
wsFacture.Rows("24:24").RowHeight = 25
wsFacture.Rows("25:37").RowHeight = 35.5
wsFacture.Rows("43:47").RowHeight = 20
wsFacture.Rows("52:52").RowHeight = 30
wsFacture.Rows("53:64").RowHeight = 12
wsFacture.Range("E24").Value = "REF"
wsFacture.Range("F24").Value = "DESCRIPTION"
wsFacture.Range("H24").Value = "Qté"
wsFacture.Range("I24").Value = "PRIX HT"
wsFacture.Range("J24").Value = "Total HT"
wsFacture.Range("J24:L24").Merge
With wsFacture.Range("E24:L24").Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorLight2
.TintAndShade = 0.249977111117893
End With
With wsFacture.Range("E24:L24")
.VerticalAlignment = xlCenter
With .Font
.Name = "Aptos Narrow"
.Size = 12
.Bold = True
.ThemeColor = xlThemeColorDark1
End With
End With
wsFacture.Range("E24:F24").HorizontalAlignment = xlLeft
wsFacture.Range("H24:J24").HorizontalAlignment = xlCenter
For i = 25 To 41
With wsFacture.Range("J" & i & ":L" & i)
.Merge
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
End With
With wsFacture.Range("F" & i & ":G" & i)
.Merge
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
End With
Next i
With wsFacture.Range("M9:M64")
.Font.ColorIndex = xlAutomatic
.Interior.ThemeColor = xlThemeColorDark1
End With
On Error Resume Next
wsFacture.Shapes("TextBox_Titre_Facture").Delete
On Error GoTo 0
Set SH = wsFacture.Shapes.AddTextbox(msoTextOrientationHorizontal, 520, 45, 150, 40)
With SH
.Name = "TextBox_Titre_Facture"
.Fill.Visible = msoFalse
.Line.Visible = msoFalse
With .TextFrame2
.VerticalAnchor = msoAnchorMiddle
With .TextRange
.Text = "FACTURE"
.ParagraphFormat.Alignment = msoAlignCenter
With .Font
.Name = "Aptos Narrow"
.Size = 24
.Bold = True
.Kerning = 5
.Fill.ForeColor.RGB = RGB(0, 0, 0)
End With
End With
End With
End With
wsFacture.Range("I15").Value = "Date :"
wsFacture.Range("I16").Value = "N° :"
wsFacture.Range("J15:L15").Merge
wsFacture.Range("J15").FormulaR1C1 = "=TODAY()"
wsFacture.Range("J16:L16").Merge
wsFacture.Range("I15:I16").HorizontalAlignment = xlRight
wsFacture.Range("J15:L16").HorizontalAlignment = xlCenter
wsFacture.Range("J52").Value = "La direction"
wsFacture.Range("E50:L51").Merge
wsFacture.Range("E50:L51").HorizontalAlignment = xlCenter
wsFacture.Range("E50:L51").VerticalAlignment = xlBottom
With Union(wsFacture.Range("I15:L16"), wsFacture.Range("J52")).Font
.Name = "Aptos Narrow"
.Size = 12
.Bold = True
.Color = RGB(0, 0, 0)
End With
With wsFacture.PageSetup
.PrintArea = plageFacture
.FitToPagesTall = 1
.FitToPagesWide = 1
.LeftMargin = Application.InchesToPoints(0)
.RightMargin = Application.InchesToPoints(0)
.TopMargin = Application.InchesToPoints(0)
.BottomMargin = Application.InchesToPoints(0)
.Zoom = False
.Orientation = xlPortrait
.PaperSize = xlPaperA4
.PrintHeadings = False
.PrintGridlines = False
End With
On Error Resume Next
ActiveWorkbook.Names("Date_Fin_Old_CM").Delete
On Error GoTo 0
ActiveWorkbook.Names.Add Name:="Date_Fin_Old_CM", RefersTo:="='" & wsFacture.Name & "'!$B$24"
With wsFacture.Range("B24")
.Font.ColorIndex = xlAutomatic
.Interior.ThemeColor = xlThemeColorDark1
.Interior.TintAndShade = -0.149998474074526
.NumberFormat = "m/d/yyyy"
.FormulaR1C1 = "=TODAY()"
End With
' 3. CRÉATION ET REMPLISSAGE DE LA FEUILLE DE PARAMÈTRES
On Error Resume Next
Sheets("Param_CL_et_PRIX").Delete
On Error GoTo 0
Set wsParam = Worksheets.Add(After:=wsFacture)
wsParam.Name = "Param_CL_et_PRIX"
' --- TABLEAU : CLIENTS (25 éléments par sous-array) ---
wsParam.Range("G9").Value = "Information des clients"
Entetes = Array( _
"Nom Facture", "Nom", "ICE", "Ville", "Responsable", _
"Interlocuteur", "Adresse", "N°TEL", "EMAIL", _
"Produit 1", "Pr1 Type Lic", "Pr1 Dt Lic", "Pr1 Dt MNT", _
"Produit 2", "Pr2 Type Lic", "Pr2 Dt Lic", "Pr2 Dt MNT", _
"Produit 3", "Pr3 Type Lic", "Pr3 Dt Lic", "Pr3 Dt MNT", _
"Site Web Type Lic", "Site Web Dt Lic", "Site Web Dt MNT", _
"Pr4 Forfait SMS")
wsParam.Range("G10").Resize(1, UBound(Entetes) + 1).Value = Entetes
Clients = Array( _
Array("Etablissement SONBOLA", "Etablissement SONBOLA", "00**63720082", "RABAT", "JAMAL", "JAMAL", "AVENUE Abdelhadi ,Rue 3, N°4 Lots bourgogne", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), _
Array("Groupe Scolaire ALEP", "Groupe Scolaire ALEP", "00**66**660**3", "RABAT", "ABDESLAM", "ABDESLAM", "AVENUE Abdelhadi ,Rue 3, N°4 Lots bourgogne", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), _
Array("Institut Azzaitouna", "Institut Azzaitouna", "00**6686820**", "RABAT", "MME KHADIJA", "MME KHADIJA", "AVENUE Abdelhadi ,Rue 3, N°4 Lots bourgogne", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), _
Array("Complexe Scolaire le POINT", "Complexe Scolaire le POINT", "00**623874008**", "CASABLANCA", "ABDELOUAHD", "ABDELOUAHD", "AVENUE Abdelhadi ,Rue 3, N°4 Lots bourgogne", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), _
Array("Complexe Scolaire Zahira", "Complexe Scolaire Zahira", "0024**97860068", "MEKNÈS", "KARIMA", "KARIMA", "AVENUE Abdelhadi ,Rue 3, N°4 Lots bourgogne", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), _
Array("GROUPE SCOLAIRE Hafida", "GROUPE SCOLAIRE Hafida", "", "CASABLANCA", "IHSSANE", "IHSSANE", "AVENUE Abdelhadi ,Rue 3, N°4 Lots bourgogne", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), _
Array("INSTITUT DES SCIENCES", "INSTITUT DES SCIENCES", "", "TETOUAN", "MOHAMED", "MOHAMED", "AVENUE Abdelhadi ,Rue 3, N°4 Lots bourgogne", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), _
Array("Ecole Al Awal", "Ecole Al Awal", "00**87476036", "RABAT", "IDRISSE", "IDRISSE", "AVENUE Abdelhadi ,Rue 3, N°4 Lots bourgogne", "", "", "", "", "", "", "", "", "", "", "", canvas, "", "", "", "", "", ""), _
Array("Institution El Omari", "Institution El Omari", "", "CASABLANCA", "MEHDI", "MEHDI", "AVENUE Abdelhadi ,Rue 3, N°4 Lots bourgogne", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), _
Array("Institut NARD", "Institut NARD", "", "TETOUAN", "RACHED", "RACHED", "AVENUE Abdelhadi ,Rue 3, N°4 Lots bourgogne", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "") _
)
' Écriture ligne par ligne dans la feuille Excel
For i = LBound(Clients) To UBound(Clients)
wsParam.Cells(11 + i, "G").Resize(1, UBound(Entetes) + 1).Value = Clients(i)
Next i
Set tbl = wsParam.ListObjects.Add(xlSrcRange, wsParam.Range("G10").Resize(UBound(Clients) + 2, UBound(Entetes) + 1), , xlYes)
tbl.Name = "Clients"
' --- TABLEAU : PRODUITS ET TARIFS ---
wsParam.Range("AN8").Value = "Information des produits"
wsParam.Range("AN9").Value = "veuillez saisir les Information des produits"
wsParam.Range("AN10").Resize(1, 3).Value = Array("Désignation", "Référence", "Prix")
wsParam.Range("AN11").Resize(1, 3).Value = Array("Maintenance Produit 1 Professionnelle", "CM-MP", 2500)
wsParam.Range("AN12").Resize(1, 3).Value = Array("• Droit d’utilisation annuelle" & vbLf & "• Mises à jour correctives" & vbLf & "• Assistance" & vbLf & "• USL-1000", "", "")
wsParam.Range("AN13").Resize(1, 3).Value = Array("=Date_Licence_plus1", "", "")
wsParam.Range("AN14").Resize(1, 3).Value = Array("Maintenance Produit 1 Medium", "CM-MM", 1900)
wsParam.Range("AN15").Resize(1, 3).Value = Array("Maintenance Produit 1 Small", "CM-MS", 1020)
wsParam.Range("AN16").Resize(1, 3).Value = Array("Maintenance Produit 2 Profil", "CM-EM", 2475)
wsParam.Range("AN17").Resize(1, 3).Value = Array("Licence Produit 1 Professionnelle", "LIC-MP", 13100)
wsParam.Range("AN18").Resize(1, 3).Value = Array("Licence Produit 1 Medium", "LIC-MM", 9480)
wsParam.Range("AN19").Resize(1, 3).Value = Array("Poste client supplémentaire", "M-PCS", 690)
wsParam.Range("AN20").Resize(1, 3).Value = Array("Création d'un site web", "CM-SW", 6000)
wsParam.Range("AN21").Resize(1, 3).Value = Array("Passage à la version V12 de Produit 1", "PASS", 4100)
wsParam.Range("AN22").Resize(1, 3).Value = Array("Maintenance Produit 1 Crèche", "CM-MC", 1000)
wsParam.Range("AN23").Resize(1, 3).Value = Array("Maintenance Produit 1 Start Up", "CM-SU", 1000)
wsParam.Range("AN24").Resize(1, 3).Value = Array("Licence Produit 2 Profil", "Lic-EM", 2920)
wsParam.Range("AN25").Resize(1, 3).Value = Array("Maintenance Produit 1 Produit 2", "CM-ME", 8982)
wsParam.Range("AN26").Resize(1, 3).Value = Array("Passage de SMALL vers MEDIUM", "PASS", 5280)
wsParam.Range("AN27").Resize(1, 3).Value = Array("Licence Pack Connect Professionnel", "Lic-CP", 16820)
wsParam.Range("AN28").Resize(1, 3).Value = Array("Frais d'activation de service", "FAS", 500)
wsParam.Range("AN29").Resize(1, 3).Value = Array("Maintenance Produit 1", "MM", 1000)
wsParam.Range("AN30").Resize(1, 3).Value = Array("Maintenance module Paie de Produit 1", "M-MP", 1000)
wsParam.Range("AN31").Resize(1, 3).Value = Array("Licence Produit 1 SMALL", "LIC-MS", 4200)
wsParam.Range("AN32").Resize(1, 3).Value = Array("=Date_Maintenance_old_plus1", "", "")
wsParam.Range("AN33").Resize(1, 3).Value = Array("Maintenance annuelle Produit 1 Produit 2", "CM-ME", 10500)
wsParam.Range("AN34").Resize(1, 3).Value = Array("Maintenance Site Web", "CM-ME", 1200)
wsParam.Range("AN35").Resize(1, 3).Value = Array("Maintenance Produit 2 Mobile", "CM-eMM", 17850)
wsParam.Range("AP11:AP35").NumberFormat = "# ##0,00 ""DH"""
Set tbl = wsParam.ListObjects.Add(xlSrcRange, wsParam.Range("AN10:AP35"), , xlYes)
tbl.Name = "Produits"
' --- TABLEAU : PÉRIODE FACTURE ---
wsParam.Range("AK1:AQ1").Value = Array("Date", "début mois", "fin mois", "Année moins 1", "Année plus 1", "Periode Mois", "Periode Année")
wsParam.Range("AK2").FormulaLocal = "=AUJOURDHUI()"
wsParam.Range("AL2").FormulaLocal = "=DATE(ANNEE(AK2);MOIS(AK2)-1;1)"
wsParam.Range("AM2").FormulaLocal = "=FIN.MOIS(AL2;0)"
wsParam.Range("AN2").FormulaLocal = "=AK2"
wsParam.Range("AO2").FormulaLocal = "=AN2+365"
wsParam.Range("AP2").FormulaLocal = "=""Période du ""&TEXTE(JOUR(AL2);""00"")&""/""&TEXTE(MOIS(AL2);""00"")&""/""&TEXTE(ANNEE(AL2);""0000"")&"" au ""&TEXTE(JOUR(AM2);""00"")&""/""&TEXTE(MOIS(AM2);""00"")&""/""&TEXTE(AM2;""AAAA"")"
wsParam.Range("AQ2").FormulaLocal = "=""Période du ""&TEXTE(JOUR(AN2);""00"")&""/""&TEXTE(MOIS(AN2);""00"")&""/""&TEXTE(ANNEE(AN2);""0000"")&"" au ""&TEXTE(JOUR(AO2);""00"")&""/""&TEXTE(MOIS(AO2);""00"")&""/""&TEXTE(AO2;""AAAA"")"
wsParam.Range("AK3").Formula = "=Date_Fin_Old_CM"
wsParam.Range("AL3").FormulaLocal = "=DATE(ANNEE(AK3);MOIS(AK3)-1;1)"
wsParam.Range("AM3").FormulaLocal = "=FIN.MOIS(AL3;0)"
wsParam.Range("AN3").FormulaLocal = "=AK3"
wsParam.Range("AO3").FormulaLocal = "=AN3+365"
wsParam.Range("AP3").FormulaLocal = "=""Période du ""&TEXTE(JOUR(AL3);""00"")&""/""&TEXTE(MOIS(AL3);""00"")&""/""&TEXTE(ANNEE(AL3);""0000"")&"" au ""&TEXTE(JOUR(AM3);""00"")&""/""&TEXTE(MOIS(AM3);""00"")&""/""&TEXTE(AM3;""AAAA"")"
wsParam.Range("AQ3").FormulaLocal = "=""Période du ""&TEXTE(JOUR(AN3);""00"")&""/""&TEXTE(MOIS(AN3);""00"")&""/""&TEXTE(ANNEE(AN3);""0000"")&"" au ""&TEXTE(JOUR(AO3);""00"")&""/""&TEXTE(MOIS(AO3);""00"")&""/""&TEXTE(AO3;""AAAA"")"
Set tbl = wsParam.ListObjects.Add(xlSrcRange, wsParam.Range("AK1:AQ3"), , xlYes)
tbl.Name = "Periode_facture"
wsParam.Range("Periode_facture[[Date]:[Année plus 1]]").NumberFormat = "m/d/yyyy"
ThisWorkbook.Names.Add Name:="Date_Licence_plus1", RefersTo:=wsParam.Range("AQ2")
ThisWorkbook.Names.Add Name:="Date_Maintenance_old_plus1", RefersTo:=wsParam.Range("AQ3")
' --- TABLEAUX DE MAINTENANCE (1, 2, 3) ---
wsParam.Range("AR8").Value = "Information Macro maintenance 1"
wsParam.Range("AR10:AS10").Value = Array("Référence", "Désignation")
wsParam.Range("AR11").Value = "1 element": wsParam.Range("AS11").Value = "Maintenance Produit 1 Professionnelle"
wsParam.Range("AR12").Value = "2 element": wsParam.Range("AS12").Value = "• Droit d’utilisation annuelle" & vbLf & "• Mises à jour correctives" & vbLf & "• Assistance"
wsParam.Range("AR13").Value = "3 element": wsParam.Range("AS13").Formula = "=Date_Maintenance_old_plus1"
For i = 4 To 10: wsParam.Cells(10 + i, "AR").Value = i & " element": Next i
Set tbl = wsParam.ListObjects.Add(xlSrcRange, wsParam.Range("AR10:AS20"), , xlYes)
tbl.Name = "Tabl_maintenance1"
wsParam.Range("AU8").Value = "Information Macro maintenance 2 MAD_EMAD"
wsParam.Range("AU10:AV10").Value = Array("Référence", "Désignation")
wsParam.Range("AU11").Value = "1 element": wsParam.Range("AV11").Value = "Maintenance Produit 2 Profil"
wsParam.Range("AU12").Value = "2 element": wsParam.Range("AV12").Value = "• Droit d’utilisation annuelle" & vbLf & "• Mises à jour correctives" & vbLf & "• Assistance"
wsParam.Range("AU13").Value = "3 element": wsParam.Range("AV13").Formula = "=Date_Maintenance_old_plus1"
wsParam.Range("AU14").Value = "4 element": wsParam.Range("AV14").Value = "Maintenance Produit 1 Professionnelle"
wsParam.Range("AU15").Value = "5 element": wsParam.Range("AV15").Value = "• Droit d’utilisation annuelle" & vbLf & "• Mises à jour correctives" & vbLf & "• Assistance"
wsParam.Range("AU16").Value = "6 element": wsParam.Range("AV16").Formula = "=Date_Maintenance_old_plus1"
For i = 7 To 10: wsParam.Cells(10 + i, "AU").Value = i & " element": Next i
Set tbl = wsParam.ListObjects.Add(xlSrcRange, wsParam.Range("AU10:AV20"), , xlYes)
tbl.Name = "Tabl_maintenance2"
wsParam.Range("AX8").Value = "Information Macro maintenance 3 mainte_MAD_EMAD_site"
wsParam.Range("AX10:AY10").Value = Array("Référence", "Désignation")
wsParam.Range("AX11").Value = "1 element": wsParam.Range("AY11").Value = "Maintenance Produit 2 Profil"
wsParam.Range("AX12").Value = "2 element": wsParam.Range("AY12").Value = "• Droit d’utilisation annuelle" & vbLf & "• Mises à jour correctives" & vbLf & "• Assistance"
wsParam.Range("AX13").Value = "3 element": wsParam.Range("AY13").Formula = "=Date_Maintenance_old_plus1"
wsParam.Range("AX14").Value = "4 element": wsParam.Range("AY14").Value = "Maintenance Produit 1 Professionnelle"
wsParam.Range("AX15").Value = "5 element": wsParam.Range("AY15").Value = "• Droit d’utilisation annuelle" & vbLf & "• Mises à jour correctives" & vbLf & "• Assistance"
wsParam.Range("AX16").Value = "6 element": wsParam.Range("AY16").Formula = "=Date_Maintenance_old_plus1"
wsParam.Range("AX17").Value = "7 element": wsParam.Range("AY17").Value = "Maintenance Site Web"
wsParam.Range("AX18").Value = "8 element": wsParam.Range("AY18").Formula = "=Date_Maintenance_old_plus1"
wsParam.Range("AX20").Value = "10 element"
Set tbl = wsParam.ListObjects.Add(xlSrcRange, wsParam.Range("AX10:AY20"), , xlYes)
tbl.Name = "Tabl_maintenance3"
' 4. MISE EN PAGE ET VALIDATIONS
wsParam.Columns("A:F").ColumnWidth = 1
wsParam.Columns("AQ:AQ").EntireColumn.AutoFit
wsParam.Columns("AS:AS").EntireColumn.AutoFit
wsParam.Columns("AV:AV").EntireColumn.AutoFit
wsParam.Columns("AY:AY").EntireColumn.AutoFit
wsParam.Columns("AN:AN").EntireColumn.AutoFit
wsParam.Columns("AO:AO").ColumnWidth = 13.57
wsParam.Columns("E:E").ColumnWidth = 12.33
wsParam.Columns("B:B").ColumnWidth = 20.67
'
ActiveWorkbook.Names.Add Name:="Designation_ref_prix", _
RefersTo:="='" & wsParam.Name & "'!Produits[Désignation]"
For Each tName In Array("Tabl_maintenance1[Désignation]", "Tabl_maintenance2[Désignation]", "Tabl_maintenance3[Désignation]")
With wsParam.Range(tName).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="=Designation_ref_prix"
.ShowError = False
End With
Next tName
With wsFacture.Range("F25:G41").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="=Designation_ref_prix"
.ShowError = False
End With
wsParam.Range("A2").Value = "Dossiers d'enregistrement "
wsParam.Range("A3").Value = "Veuillez saisir les Dossiers d'enregistrement "
wsParam.Range("A5").Value = "Devis": wsParam.Range("B5").Value = "C:\devis"
wsParam.Range("A6").Value = "Bon commande": wsParam.Range("B6").Value = "C:\BC"
wsParam.Range("A7").Value = "Bon livraison": wsParam.Range("B7").Value = "C:\BL"
wsParam.Range("A8").Value = "Facture": wsParam.Range("B8").Value = "C:\Facture"
wsParam.Select
wsParam.Range("G11").Select
ActiveWindow.FreezePanes = True
' =========================================================================
' 5. CRÉATION ET REMPLISSAGE DE LA FEUILLE ADRESSE ENVELOPPE
' =========================================================================
On Error Resume Next
Sheets("Envlope_Adresse").Delete
On Error GoTo 0
Set wsEnveloppe = Worksheets.Add(After:=wsParam)
wsEnveloppe.Name = "Envlope_Adresse"
' Remplissage des en-têtes
wsEnveloppe.Range("A1").Value = "Nom"
wsEnveloppe.Range("B1").Value = "Ville"
wsEnveloppe.Range("C1").Value = "Adresse"
' Design rapide pour la feuille Enveloppe
With wsEnveloppe.Range("A1:C1")
.Font.Name = "Aptos Narrow"
.Font.Size = 11
.Font.Bold = True
.Font.Color = RGB(255, 255, 255)
.Interior.Color = RGB(64, 64, 64)
.HorizontalAlignment = xlCenter
End With
' Ajustement des colonnes pour les adresses
wsEnveloppe.Columns("A:A").ColumnWidth = 30
wsEnveloppe.Columns("B:B").ColumnWidth = 15
wsEnveloppe.Columns("C:C").ColumnWidth = 50
' Finition et retour écran
wsFacture.Select
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "Le système complet (Facture + Paramètres + Adresses Enveloppes) a été généré avec succès !", vbInformation, "Savoir et Partage"
End Sub
N’hésitez pas à partager vos questions ou vos retours dans l’espace commentaires. Pensez à vous abonner à la newsletter de Savoir et Partage pour recevoir tous nos futurs tutoriels et optimisations Excel/VBA !