Explication VBA : Facturation automatique Gestion client
Mettre à jour automatiquement les noms des colonnes (en-têtes) dans un tableau structuré Excel appelé Client
| ModifierEntetesEtLibelles |
|---|
|
Sub ModifierEntetesEtLibelles()
Dim ws As Worksheet
Set ws = Param_CL_et_PRIX ' Feuille contenant les
tableaux
Dim tblClients As ListObject
Set tblClients = ws.ListObjects("Clients")
Dim tblParam As ListObject
Set tblParam =
ws.ListObjects("param_nom_service_produit")
Dim i As Long
Dim ancienNom As String, nouveauNom As String
Dim cell As Range
' Parcourir chaque ligne de param_nom_service_produit
For i = 1 To tblParam.ListRows.Count
ancienNom = tblParam.DataBodyRange(i,
2).Value ' Colonne B : identifiant actuel
nouveauNom = tblParam.DataBodyRange(i,
3).Value ' Colonne C : nom à utiliser
' Modifier l’en-tête dans le tableau
Clients
On Error Resume Next
tblClients.ListColumns(ancienNom).Name =
nouveauNom
On Error GoTo 0
' Modifier les cellules contenant les
noms des produits
For Each cell In
ws.Range("I8:P8,K2:K8,M2:M8,O2:O4")
If cell.Value = ancienNom
Then
cell.Value =
nouveauNom
End If
Next cell
' Mettre à jour l'ancien nom (colonne B)
avec le nouveau
tblParam.DataBodyRange(i, 2).Value =
nouveauNom
Next i
MsgBox "Les en-têtes et libellés ont été mis à jour
avec succès.", vbInformation
End Sub
|
🔧 Objectif de la macro
ModifierEntetesEtLibelles
Cette macro permet de
mettre à jour automatiquement les noms des colonnes (en-têtes)
dans un tableau structuré Excel appelé
Clients,
ainsi que les étiquettes visibles dans certaines cellules de la
feuille, comme I8,
K2,
M2, etc.
Elle s'appuie sur un
tableau de paramétrage
nommé
param_nom_service_produit, dans
lequel l'utilisateur indique :
-
En colonne B : l'ancien nom (celui à remplacer)
-
En colonne C : le nouveau nom (celui qui remplacera l'ancien)
🧠 Pourquoi faire ça ?
Imaginez que vous gérez des services ou produits pour des clients. Si vous souhaitez renommer un service (par exemple remplacer "Produit AB" par "Produit +", etc.), vous n’avez pas besoin de le changer partout à la main. Cette macro le fait en un clic :
-
Elle modifie le nom de la colonne dans le tableau.
-
Elle modifie les libellés visibles dans les cellules d’entrée.
-
Elle met à jour le tableau de paramétrage lui-même (remplace l’ancien nom par le nouveau).
📘 Explication du code, ligne par ligne
Début de la macro.
On travaille sur la feuille dont le
nom de code VBA est
Param_CL_et_PRIX.
On récupère le
tableau structuré nommé
Clients, celui qui contient
les données des clients.
On récupère le tableau de paramétrage des noms de services/produits.
Déclaration des variables nécessaires pour parcourir les lignes et cellules.
🔁 Parcourir chaque ligne du tableau de paramétrage
Boucle à travers chaque ligne du tableau
param_nom_service_produit.
On lit les valeurs de la colonne B (ancien nom) et C (nouveau nom).
On essaie de renommer la colonne du tableau
Clients si le nom correspond.
En cas d’erreur (par exemple si le nom n'existe pas), on passe à la suite
sans bloquer.
🪄 Mettre à jour les libellés visibles dans la feuille
On parcourt toutes les cellules de cette plage. Si une cellule contient l’ancien nom, elle est remplacée par le nouveau.
🔄 Mettre à jour aussi la colonne de l’ancien nom
On remplace la valeur de la colonne B par le nouveau nom, pour garder le tableau à jour.
✅ Fin
On sort de la boucle et affiche un message de confirmation.
💡 Résumé visuel du fonctionnement
| Avant (paramétrage) | Après exécution de la macro |
|---|---|
| B2 = "Produit TP" | B2 = "Produit+" |
| C2 = "Produit+" | — |
| Colonne du tableau = "Produit TP" | devient "Produit+" |
| I8 = "Produit TP" | devient "Madariss+" |
Vider_preparer_Click
| Vider_preparer_Click |
|---|
|
Private Sub Vider_preparer_Click()
Dim zone As Range
Param_CL_et_PRIX.Range("F1").Value = ""
For Each zone In
Param_CL_et_PRIX.Range("G2:G8,J2:J8,L2:L8,N2:N8,P2:P4")
zone.Value = ""
Next zone
Param_CL_et_PRIX.Range("A1").Value = "P"
MsgBox "C'est prêt !"
End Sub
|
🧼 Macro Vider_preparer_Click — Réinitialiser le formulaire pour une nouvelle saisie client
🎯 Objectif :
-
Vider tous les champs du formulaire (identité + produits).
-
Réinitialiser les cellules de contrôle.
-
Préparer l’espace pour l’ajout d’un nouveau client/prospect.
🧩 Étapes détaillées :
1. 🧹 Vider le numéro de ligne active
-
Cela efface l’indication d’une ligne sélectionnée (utile pour ne pas modifier une ligne existante par erreur).
2. 🔄 Réinitialiser tous les champs du formulaire
-
Tous les champs liés aux données clients et produits sont vidés.
-
Cela inclut :
-
Les infos de base (
G2:G8,J2:J8) -
Les produits (de
L2:L8àP4)
-
✅ Cette partie pourrait être optimisée avec une boucle (For Each) sur des plages comme dans la macro
Ajouter
_Click, pour alléger
le code.
3. 🏷️ Changer l’état en "Prêt à ajouter"
-
On écrit "P" dans
A1pour signaler qu’on est en mode saisie (nouveau client). -
C’est ce qui permet à la macro
Ajouter_Clickde fonctionner (elle vérifieIf A1 = "P").
4. ✅ Message de confirmation
-
Un petit message rassurant pour dire que le formulaire est propre et prêt à accueillir une nouvelle saisie.
Macro Ajouter_Click
| Ajouter_Click |
|---|
|
Private Sub Ajouter_Click() If Param_CL_et_PRIX.Range("A1").Value = "P" And Param_CL_et_PRIX.Range("G2").Value <> "" Then Dim last As Long Dim cell As Range Dim clientsTable As ListObject ' Récupérer le tableau Clients Set clientsTable = Param_CL_et_PRIX.ListObjects("Clients") ' Ajouter une nouvelle ligne Set cell = clientsTable.ListRows.Add.Range.Cells(1, 1)
' Remplir les colonnes de la nouvelle ligne avec les données des cellules With Param_CL_et_PRIX With cell .Offset(0, clientsTable.ListColumns("Nom Facture").Index - 1).Value = .Parent.Range("G2").Value .Offset(0, clientsTable.ListColumns("Nom").Index - 1).Value = .Parent.Range("G3").Value .Offset(0, clientsTable.ListColumns("ICE").Index - 1).Value = .Parent.Range("G4").Value .Offset(0, clientsTable.ListColumns("Ville").Index - 1).Value = .Parent.Range("G5").Value .Offset(0, clientsTable.ListColumns("Responsable").Index - 1).Value = .Parent.Range("G6").Value .Offset(0, clientsTable.ListColumns("Interlocuteur").Index - 1).Value = .Parent.Range("G7").Value .Offset(0, clientsTable.ListColumns("N° ligne (G.sheet)").Index - 1).Value = .Parent.Range("G8").Value .Offset(0, clientsTable.ListColumns("Client/prospect").Index - 1).Value = .Parent.Range("J2").Value .Offset(0, clientsTable.ListColumns("Adresse").Index - 1).Value = .Parent.Range("J3").Value .Offset(0, clientsTable.ListColumns("FAMILLE").Index - 1).Value = .Parent.Range("J4").Value .Offset(0, clientsTable.ListColumns("ID SMS").Index - 1).Value = .Parent.Range("J5").Value .Offset(0, clientsTable.ListColumns("N°TEL").Index - 1).Value = .Parent.Range("J6").Value .Offset(0, clientsTable.ListColumns("EMAIL").Index - 1).Value = .Parent.Range("J7").Value ' Produits – libellés dynamiques .Offset(0, clientsTable.ListColumns(.Parent.Range("I8").Value).Index - 1).Value = .Parent.Range("J8").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("K2").Value).Index - 1).Value = .Parent.Range("L2").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("K3").Value).Index - 1).Value = .Parent.Range("L3").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("K4").Value).Index - 1).Value = .Parent.Range("L4").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("K5").Value).Index - 1).Value = .Parent.Range("L5").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("K6").Value).Index - 1).Value = .Parent.Range("L6").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("K7").Value).Index - 1).Value = .Parent.Range("L7").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("K8").Value).Index - 1).Value = .Parent.Range("L8").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("M2").Value).Index - 1).Value = .Parent.Range("N2").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("M3").Value).Index - 1).Value = .Parent.Range("N3").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("M4").Value).Index - 1).Value = .Parent.Range("N4").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("M5").Value).Index - 1).Value = .Parent.Range("N5").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("M6").Value).Index - 1).Value = .Parent.Range("N6").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("M7").Value).Index - 1).Value = .Parent.Range("N7").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("M8").Value).Index - 1).Value = .Parent.Range("N8").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("O2").Value).Index - 1).Value = .Parent.Range("P2").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("O3").Value).Index - 1).Value = .Parent.Range("P3").Value .Offset(0, clientsTable.ListColumns(.Parent.Range("O4").Value).Index - 1).Value = .Parent.Range("P4").Value End With End With ' Vider les zones de saisie Param_CL_et_PRIX.Range("F1").Value = "" Dim r As Range For Each r In Param_CL_et_PRIX.Range("G2:G8,J2:J8,L2:L8,N2:N8,P2:P4") r.Value = "" Next r MsgBox "Élément ajouté avec succès", vbInformation Else MsgBox "Veuillez remplir les informations client avant d’ajouter.", vbExclamation End If End Sub |
Voici une
explication claire et structurée
de cette macro Ajouter_Click
🔧 Macro : Ajouter_Click
✅ Objectif :
Ajouter un nouveau client dans le tableau nommé
Clients à partir des champs de
saisie situés dans la feuille
Param_CL_et_PRIX.
🧩 Étapes détaillées et faciles à suivre :
1. Vérifier les conditions avant d’ajouter
-
On ne continue l’exécution que si la cellule
A1contient "P"
-
Et si le champ
G2(par exemple "Nom Facture") n’est pas vide.
2. Préparer le tableau cible
-
Le tableau Clients est chargé en mémoire pour y ajouter une ligne.
3. Ajouter une ligne dans le tableau
-
On ajoute une nouvelle ligne dans le tableau.
-
cellpointe sur la première cellule de cette ligne.
4. Remplir les colonnes avec les champs du formulaire
-
On utilise
.Offset()pour écrire dans la colonne "Nom Facture" de la ligne ajoutée. -
La valeur vient de la cellule
G2.
💡 Méthode utilisée :
C’est très lisible et simple à modifier. Tu peux facilement changer les noms des colonnes dans Excel sans devoir changer le code VBA.
5. Remplissage des champs dynamiques (Produits)
-
Ici, la colonne est définie de manière dynamique selon le texte dans
I8. -
La valeur à y mettre est celle de
J8.
➡️ C’est exactement le style que tu préfères : clair, direct, et facile à comprendre.
6. Nettoyage du formulaire après ajout
-
On vide certains champs pour laisser l’utilisateur saisir un nouveau client.
-
On efface toutes les zones de saisie.
7. Message de confirmation
-
On affiche une boîte de message confirmant que l’ajout a bien été fait.
🛑 Si le formulaire est incomplet :
-
L’utilisateur reçoit un message d’erreur clair si le formulaire n’est pas prêt.
Macro Ajouter_Click Vesion 2
| Ajouter_Click |
|---|
Private Sub Ajouter_Click() If Param_CL_et_PRIX.Range("A1").Value = "P" And Param_CL_et_PRIX.Range("G2").Value <> "" Then Dim tbl As ListObject Dim lastRow As Range Dim newRow As ListRow Dim i As Integer Dim colName As String Dim colIndex As Long Set tbl = Param_CL_et_PRIX.ListObjects("Clients") ' Étape 1 : Ajouter une nouvelle ligne vide Set newRow = tbl.ListRows.Add ' Étape 2 : Copier les formules depuis la ligne précédente If tbl.ListRows.Count > 1 Then Set lastRow = tbl.ListRows(tbl.ListRows.Count - 1).Range lastRow.Copy newRow.Range.PasteSpecial Paste:=xlPasteFormulas Application.CutCopyMode = False End If ' Nettoyage des valeurs copiées sans formule Dim cell As Range For Each cell In newRow.Range On Error Resume Next If Not cell.HasFormula And cell.Value <> "" Then cell.Value = "" End If On Error GoTo 0 Next cell ' Étape 3 : Remplir les données si elles existent With newRow.Range Dim pairs As Variant Dim p As Variant pairs = Array( _ Array("G2", "Nom Facture"), Array("G3", "Nom"), Array("G4", "ICE"), Array("G5", "Ville"), _ Array("G6", "Responsable"), Array("G7", "Interlocuteur"), Array("G8", "N° ligne (G.sheet)"), _ Array("J2", "Client/prospect"), Array("J3", "Adresse"), Array("J4", "FAMILLE"), Array("J5", "ID SMS"), _ Array("J6", "N°TEL"), Array("J7", "EMAIL") _ ) For Each p In pairs If Param_CL_et_PRIX.Range(p(0)).Value <> "" Then .Cells(1, tbl.ListColumns(p(1)).Index).Value = Param_CL_et_PRIX.Range(p(0)).Value End If Next p ' Champs dynamiques I8=>J8, K2:K8 => L2:L8, M2:M8 => N2:N8, O2:O4 => P2:P4 If Param_CL_et_PRIX.Range("J8").Value <> "" Then colName = Param_CL_et_PRIX.Range("I8").Value colIndex = tbl.ListColumns(colName).Index .Cells(1, colIndex).Value = Param_CL_et_PRIX.Range("J8").Value End If For i = 2 To 8 If Param_CL_et_PRIX.Range("L" & i).Value <> "" Then colName = Param_CL_et_PRIX.Range("K" & i).Value colIndex = tbl.ListColumns(colName).Index .Cells(1, colIndex).Value = Param_CL_et_PRIX.Range("L" & i).Value End If If Param_CL_et_PRIX.Range("N" & i).Value <> "" Then colName = Param_CL_et_PRIX.Range("M" & i).Value colIndex = tbl.ListColumns(colName).Index .Cells(1, colIndex).Value = Param_CL_et_PRIX.Range("N" & i).Value End If Next i For i = 2 To 4 If Param_CL_et_PRIX.Range("P" & i).Value <> "" Then colName = Param_CL_et_PRIX.Range("O" & i).Value colIndex = tbl.ListColumns(colName).Index .Cells(1, colIndex).Value = Param_CL_et_PRIX.Range("P" & i).Value End If Next i End With ' Nettoyage des champs de saisie Param_CL_et_PRIX.Range("F1").Value = "" Dim r As Range For Each r In Param_CL_et_PRIX.Range("G2:G8,J2:J8,L2:L8,N2:N8,P2:P4") r.Value = "" Next r MsgBox "Élément ajouté avec succès", vbInformation Else MsgBox "Veuillez remplir les informations client avant d’ajouter. Cliquez aussi sur préparer avant d'ajouter les informations du client", vbExclamation End If End Sub |
🔧 Macro VBA – Ajouter une ligne avec conservation des formules dans le tableau Clients
Cette macro permet d’ajouter automatiquement une nouvelle ligne au tableau Clients de la feuille Param_CL_et_PRIX, tout en respectant deux principes essentiels :
-
✅ Conserver toutes les formules déjà présentes dans les colonnes calculées.
-
✍️ Remplir uniquement les champs de saisie manuelle (par l’utilisateur), en évitant d’écraser les formules dynamiques.
📌 Objectif :
Lorsque vous saisissez un nouveau client (matricule, nom, ville, etc.), cette macro :
-
Ajoute une nouvelle ligne.
-
Copie les formules depuis la ligne précédente.
-
Insère les nouvelles données dans les colonnes saisies (ex : Nom, ICE, Téléphone...).
-
Laisse les colonnes calculées automatiquement remplies par les formules (comme l’ancienneté ou le type client déduit du matricule, par exemple).
⚙️ Points techniques clés :
-
tbl.ListRows.Add: ajoute une ligne au tableau structuré. -
lastRow.Copy+PasteSpecial xlPasteFormulas: copie uniquement les formules (sans les valeurs saisies). -
La saisie dans les colonnes est conditionnelle : on vérifie si la cellule source est vide avant d’écrire dans le tableau, pour ne pas effacer une formule.
🧩 Explication détaillée du code VBA
▶️ C’est le début de la macro, déclenchée par un clic sur un bouton "Ajouter".
✔️ Condition de lancement :
La macro ne s'exécute que si :
-
La cellule
A1de la feuilleParam_CL_et_PRIXcontient la lettre"P"(par exemple pour vérifier que les paramètres sont "Prêts"), -
Et la cellule
G2n’est pas vide (le champ "Nom Facture" est rempli).
🧠 Déclaration des variables nécessaires :
-
tbl: le tableau structuré nommé"Clients". -
lastRow: dernière ligne utilisée, servant de modèle pour copier les formules. -
newRow: la nouvelle ligne à insérer. -
i,colName,colIndex: variables pour les boucles dynamiques.
🔗 On pointe vers le tableau "Clients" dans la feuille Param_CL_et_PRIX.
➕ Ajout d’une nouvelle ligne vide à la fin du tableau.
📋 Si le tableau contient déjà au moins une ligne, on :
-
Récupère la ligne précédente (
lastRow), -
Copie uniquement les formules (pas les valeurs) dans la nouvelle ligne.
🧱 À partir d'ici, on remplit les champs manuellement saisis dans la nouvelle ligne du tableau.
Consulter
| Bouton consulter |
|---|
|
Private Sub Consulter_Click()
Param_CL_et_PRIX.Range("A1").Value = ""
Dim clientsTable As ListObject
Set clientsTable = Param_CL_et_PRIX.ListObjects("Clients")
If Not Intersect(ActiveCell, Range("G10:G90000")) Is Nothing Then
'************
Param_CL_et_PRIX.Range("G2").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("Nom Facture").Index - 1).Value
Param_CL_et_PRIX.Range("G3").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("Nom").Index - 1).Value
Param_CL_et_PRIX.Range("G4").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("ICE").Index - 1).Value
Param_CL_et_PRIX.Range("G5").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("Ville").Index - 1).Value
Param_CL_et_PRIX.Range("G6").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("Responsable").Index - 1).Value
Param_CL_et_PRIX.Range("G7").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("Interlocuteur").Index - 1).Value
Param_CL_et_PRIX.Range("G8").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("N° ligne (G.sheet)").Index - 1).Value
Param_CL_et_PRIX.Range("J2").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("Client/prospect").Index - 1).Value
Param_CL_et_PRIX.Range("J3").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("Adresse").Index - 1).Value
Param_CL_et_PRIX.Range("J4").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("FAMILLE").Index - 1).Value
Param_CL_et_PRIX.Range("J5").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("ID SMS").Index - 1).Value
Param_CL_et_PRIX.Range("J6").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("N°TEL").Index - 1).Value
Param_CL_et_PRIX.Range("J7").Value = ActiveCell.Offset(0,
clientsTable.ListColumns("EMAIL").Index - 1).Value
' Produits – libellés dynamiques
Param_CL_et_PRIX.Range("J8").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("I8").Value).Index - 1).Value
Param_CL_et_PRIX.Range("L2").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K2").Value).Index - 1).Value
Param_CL_et_PRIX.Range("L3").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K3").Value).Index - 1).Value
Param_CL_et_PRIX.Range("L4").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K4").Value).Index - 1).Value
Param_CL_et_PRIX.Range("L5").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K5").Value).Index - 1).Value
Param_CL_et_PRIX.Range("L6").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K6").Value).Index - 1).Value
Param_CL_et_PRIX.Range("L7").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K7").Value).Index - 1).Value
Param_CL_et_PRIX.Range("L8").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K8").Value).Index - 1).Value
Param_CL_et_PRIX.Range("N2").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M2").Value).Index - 1).Value
Param_CL_et_PRIX.Range("N3").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M3").Value).Index - 1).Value
Param_CL_et_PRIX.Range("N4").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M4").Value).Index - 1).Value
Param_CL_et_PRIX.Range("N5").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M5").Value).Index - 1).Value
Param_CL_et_PRIX.Range("N6").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M6").Value).Index - 1).Value
Param_CL_et_PRIX.Range("N7").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M7").Value).Index - 1).Value
Param_CL_et_PRIX.Range("N8").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M8").Value).Index - 1).Value
Param_CL_et_PRIX.Range("P2").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("O2").Value).Index - 1).Value
Param_CL_et_PRIX.Range("P3").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("O3").Value).Index - 1).Value
Param_CL_et_PRIX.Range("P4").Value = ActiveCell.Offset(0,
clientsTable.ListColumns(Range("O4").Value).Index - 1).Value
'************
'TESTER le numéro
Param_CL_et_PRIX.Range("F1").Value =
ActiveCell.Offset(0, 0).Row
Else
MsgBox "Pas dans la plage 'merci de selectiner le SUIVI !'"
End If
End Sub
|
Macro Consulter_Click —
Remplir le formulaire client depuis une ligne du tableau
🎯 Objectif :
Permettre à l'utilisateur de
cliquer sur une ligne du tableau "Clients", et d'afficher automatiquement toutes les données dans le formulaire situé
à gauche de la feuille (cellules
G2:G8,
J2:J8,
L2:L8, etc.).
🧩 Étapes de la macro :
1. 🔁 Réinitialisation de l’état du formulaire
-
On vide la cellule
A1pour indiquer qu’on n’est pas en train d’ajouter un nouveau client (utile pour bloquerAjouter_Clicksi besoin).
2. 📋 Ciblage du tableau des clients
-
On définit le tableau principal (
Clients) dans lequel sont stockés tous les clients et leurs produits.
3. ✅ Vérifier que la cellule sélectionnée est bien dans la colonne des clients
-
On autorise la suite seulement si l'utilisateur a cliqué sur une cellule de la colonne
G, lignes 10 à 90000 (zone du tableau).
4. 🔄 Remplir les champs du formulaire
-
La macro utilise
Offsetpour lire les informations sur la même ligne que celle cliquée. -
Elle les copie vers les cellules du formulaire.
-
Les libellés produits (
I8,K2, etc.) étant dynamiques, le nom exact de chaque colonne est d’abord lu avant d’aller chercher sa valeur.
5. 🔢 Enregistrer la ligne sélectionnée
-
On note le numéro de la ligne sélectionnée dans
F1pour éventuellement s’en servir ailleurs (modification, suppression, etc.).
6. ⚠️ Sinon, message d’erreur
-
Si l’utilisateur a cliqué en dehors du tableau (ex. cellule aléatoire), on l’avertit.
✅ Résultat :
Quand on clique sur une cellule de la colonne
G (dans le tableau),
le formulaire est automatiquement rempli
avec les données du client correspondant. C’est pratique pour consulter,
modifier ou dupliquer.
Souhaites-tu aussi une version avec un bouton "Modifier" qui remplace les données d'une ligne déjà sélectionnée ?
Modifier informations client
| Modifier_Click |
|---|
|
Private Sub Modifier_Click()
Param_CL_et_PRIX.Range("A1").Value = ""
'TESTER le numéro
Param_CL_et_PRIX.Range("F1").Value
Dim clientsTable As ListObject
Set clientsTable = Param_CL_et_PRIX.ListObjects("Clients")
If MsgBox("vous voulez vraiment modifier!! ?", 36, "Confirmation") =
vbYes Then
If Not Intersect(ActiveCell, Range("G11:G90000")) Is Nothing Then
If Param_CL_et_PRIX.Range("G2").Value <> "" And
Param_CL_et_PRIX.Range("F1").Value = ActiveCell.Offset(0, 0).Row
Then
'*********************************
ActiveCell.Offset(0,
clientsTable.ListColumns("Nom Facture").Index - 1).Value =
Param_CL_et_PRIX.Range("G2").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("Nom").Index - 1).Value =
Param_CL_et_PRIX.Range("G3").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("ICE").Index - 1).Value =
Param_CL_et_PRIX.Range("G4").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("Ville").Index - 1).Value =
Param_CL_et_PRIX.Range("G5").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("Responsable").Index - 1).Value =
Param_CL_et_PRIX.Range("G6").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("Interlocuteur").Index - 1).Value =
Param_CL_et_PRIX.Range("G7").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("N° ligne (G.sheet)").Index - 1).Value =
Param_CL_et_PRIX.Range("G8").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("Client/prospect").Index - 1).Value =
Param_CL_et_PRIX.Range("J2").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("Adresse").Index - 1).Value =
Param_CL_et_PRIX.Range("J3").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("FAMILLE").Index - 1).Value =
Param_CL_et_PRIX.Range("J4").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("ID SMS").Index - 1).Value =
Param_CL_et_PRIX.Range("J5").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("N°TEL").Index - 1).Value =
Param_CL_et_PRIX.Range("J6").Value
ActiveCell.Offset(0,
clientsTable.ListColumns("EMAIL").Index - 1).Value =
Param_CL_et_PRIX.Range("J7").Value
' Produits – libellés dynamiques le libellet cellule juste
avant ce que je veux saisire
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("I8").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("J8").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K2").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("L2").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K3").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("L3").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K4").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("L4").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K5").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("L5").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K6").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("L6").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K7").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("L7").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("K8").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("L8").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M2").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("N2").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M3").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("N3").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M4").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("N4").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M5").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("N5").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M6").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("N6").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M7").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("N7").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("M8").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("N8").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("O2").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("P2").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("O3").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("P3").Value
ActiveCell.Offset(0,
clientsTable.ListColumns(Range("O4").Value).Index - 1).Value =
Param_CL_et_PRIX.Range("P4").Value
'**************
Else
MsgBox "impossible 'souci vide!ou bien la ligne séléctioner
inexacte'"
End If
Else
MsgBox "Pas dans la plage 'merci de selectiner le Client !'"
End If
End If
End Sub
|
Comprendre la macro VBA "Modifier_Click" pour mettre à jour une fiche client
Objectif de la macro : Cette macro permet de modifier une ligne existante dans un tableau Excel nommé "Clients", à condition que la cellule active corresponde bien à la ligne visée. Elle prend les informations de la fiche de saisie (paramètres en colonne G, J, L, N, P) et les insère dans la ligne sélectionnée du tableau.
🔧 Les vérifications initiales
Param_CL_et_PRIX.Range("A1").Value = ""
Cette ligne vide la cellule A1, souvent utilisée comme indicateur dans d'autres macros.
If MsgBox("vous voulez vraiment modifier!! ?", 36, "Confirmation") = vbYes Then
On demande à l'utilisateur de confirmer la modification via une fenêtre popup (icône d'avertissement + boutons Oui/Non).
If Not Intersect(ActiveCell, Range("G11:G90000")) Is Nothing Then
On vérifie que la cellule active est bien dans la colonne G (lignes 11 à 90000).
If Param_CL_et_PRIX.Range("G2").Value <> "" And Param_CL_et_PRIX.Range("F1").Value = ActiveCell.Row Then
On s'assure que :
-
G2 contient bien un nom (ou une donnée à insérer).
-
La ligne active correspond à la ligne stockée dans F1 (vérification sécuritaire).
📃 Mise à jour de la ligne client
Chaque champ de la fiche est ensuite injecté dans la ligne active du tableau en utilisant des colonnes identifiées par nom via :
clientsTable.ListColumns("Nom du champ").Index
Exemples :
ActiveCell.Offset(0, clientsTable.ListColumns("Nom Facture").Index - 1).Value = Param_CL_et_PRIX.Range("G2").Value
Cette ligne copie la valeur de G2 dans la colonne "Nom Facture" de la ligne active.
Les champs suivants sont concernés :
-
G2 à G8 : Informations client de base (Nom, ICE, Ville, etc.)
-
J2 à J7 : Adresse, famille, contact...
-
J8 : Champ produit dynamique (nom défini dans I8)
-
L2 à L8 : Produits (noms dynamiques en K2 à K8)
-
N2 à N8 : Autres données produits (M2 à M8)
-
P2 à P4 : Champs produits complémentaires (O2 à O4)
Cela rend la macro très modulable.
❌ Gestion des erreurs
Si une des conditions n'est pas remplie :
MsgBox "impossible 'souci vide!ou bien la ligne séléctioner inexacte'"
Ou bien :
MsgBox "Pas dans la plage 'merci de selectiner le Client !'"
L'utilisateur reçoit un message clair et n'est pas autorisé à modifier.
✅ Conclusion
Cette macro est un outil fiable pour la mise à jour des fiches clients dans Excel, avec des contrôles sécuritaires, une logique modulable grâce aux noms de colonnes dynamiques, et une interface intuitive.
Vous pouvez l'utiliser pour construire un système de gestion client souple, efficace, et adapté à vos besoins.
Commentaires
Enregistrer un commentaire