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

vba : Sub ModifierEntetesEtLibelles()

Début de la macro.

vba : Dim ws As Worksheet
Set ws = Param_CL_et_PRIX ' Feuille contenant les tableaux

On travaille sur la feuille dont le nom de code VBA est Param_CL_et_PRIX.

vba : Dim tblClients As ListObject
Set tblClients = ws.ListObjects("Clients")

On récupère le tableau structuré nommé Clients, celui qui contient les données des clients.

vba : Dim tblParam As ListObject
Set tblParam = ws.ListObjects("param_nom_service_produit")

On récupère le tableau de paramétrage des noms de services/produits.

vba : Dim i As Long
Dim ancienNom As String, nouveauNom As String Dim cell As Range

Déclaration des variables nécessaires pour parcourir les lignes et cellules.


🔁 Parcourir chaque ligne du tableau de paramétrage

vba : For i = 1 To tblParam.ListRows.Count

Boucle à travers chaque ligne du tableau param_nom_service_produit.

vba : ancienNom = tblParam.DataBodyRange(i, 2).Value ' Colonne B : identifiant actuel
nouveauNom = tblParam.DataBodyRange(i, 3).Value ' Colonne C : nom à utiliser

On lit les valeurs de la colonne B (ancien nom) et C (nouveau nom).

vba : On Error Resume Next
tblClients.ListColumns(ancienNom).Name = nouveauNom On Error GoTo 0

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

vba : 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

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

vba : tblParam.DataBodyRange(i, 2).Value = nouveauNom

On remplace la valeur de la colonne B par le nouveau nom, pour garder le tableau à jour.


✅ Fin

vba: Next i
MsgBox "Les en-têtes et libellés ont été mis à jour avec succès.", vbInformation End Sub

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

vba : Param_CL_et_PRIX.Range("F1").Value = ""
  • 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

vba : Param_CL_et_PRIX.Range("G2").Value = ""
... Param_CL_et_PRIX.Range("P4").Value = ""
  • 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"

vba : Param_CL_et_PRIX.Range("A1").Value = "P"
  • On écrit "P" dans A1 pour signaler qu’on est en mode saisie (nouveau client).

  • C’est ce qui permet à la macro Ajouter_Click de fonctionner (elle vérifie If A1 = "P").

4. ✅ Message de confirmation

vba : MsgBox "C'est prêt !'"
  • 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

vba : If Param_CL_et_PRIX.Range("A1").Value = "P" And Param_CL_et_PRIX.Range("G2").Value <> "" Then
  • On ne continue l’exécution que si la cellule A1 contient "P"

Dans ta feuille Param_CL_et_PRIX, plusieurs boutons permettent d'agir sur le tableau des clients : 🔘 Ajouter un nouveau client avec la macro Ajouter_Click 🔘 Consulter un client existant avec la macro Consulter_Click

🔄 Que fait la cellule A1 ?
Elle sert de signal interne pour savoir quelle opération est en cours On vérifie que A1 = "P" pour être sûr que l'utilisateur est bien en mode AJOUT
  • Et si le champ G2 (par exemple "Nom Facture") n’est pas vide.


2. Préparer le tableau cible

vba : Set clientsTable = Param_CL_et_PRIX.ListObjects("Clients")
  • Le tableau Clients est chargé en mémoire pour y ajouter une ligne.


3. Ajouter une ligne dans le tableau

vba : Set cell = clientsTable.ListRows.Add.Range.Cells(1, 1)
  • On ajoute une nouvelle ligne dans le tableau.

  • cell pointe sur la première cellule de cette ligne.


4. Remplir les colonnes avec les champs du formulaire

vba : .Offset(0, clientsTable.ListColumns("Nom Facture").Index - 1).Value = .Parent.Range("G2").Value
  • 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 :

vba: .Offset(0, clientsTable.ListColumns(nomDeColonne).Index - 1)

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)

vba : .Offset(0, clientsTable.ListColumns(.Parent.Range("I8").Value).Index - 1).Value = .Parent.Range("J8").Value
  • 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

vba : Param_CL_et_PRIX.Range("F1").Value = ""
  • On vide certains champs pour laisser l’utilisateur saisir un nouveau client.

vba : For Each r In Param_CL_et_PRIX.Range("G2:G8,J2:J8,L2:L8,N2:N8,P2:P4")
r.Value = "" Next r
  • On efface toutes les zones de saisie.


7. Message de confirmation

vba : MsgBox "Élément ajouté avec succès", vbInformation
  • On affiche une boîte de message confirmant que l’ajout a bien été fait.


🛑 Si le formulaire est incomplet :

vba : Else
MsgBox "Veuillez remplir les informations client avant d’ajouter.", vbExclamation End If
  • 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 :

    1. Conserver toutes les formules déjà présentes dans les colonnes calculées.

    2. ✍️ 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.

    voici une explication ligne par ligne du code de la macro utilisée pour ajouter une ligne au tableau Clients tout en conservant les formules et remplissant uniquement les données saisies :

    🧩 Explication détaillée du code VBA

    vba Private Sub Ajouter_Click()

    ▶️ C’est le début de la macro, déclenchée par un clic sur un bouton "Ajouter".


    vba If Param_CL_et_PRIX.Range("A1").Value = "P" And Param_CL_et_PRIX.Range("G2").Value <> "" Then

    ✔️ Condition de lancement :
    La macro ne s'exécute que si :

    • La cellule A1 de la feuille Param_CL_et_PRIX contient la lettre "P" (par exemple pour vérifier que les paramètres sont "Prêts"),

    • Et la cellule G2 n’est pas vide (le champ "Nom Facture" est rempli).


    vba Dim tbl As ListObject
    Dim lastRow As Range Dim newRow As ListRow Dim i As Integer Dim colName As String Dim colIndex As Long

    🧠 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.


    📌 Étape 1 : Référencer le tableau "Clients"

    vba Set tbl = Param_CL_et_PRIX.ListObjects("Clients")

    🔗 On pointe vers le tableau "Clients" dans la feuille Param_CL_et_PRIX.


    ➕ Étape 2 : Ajouter une nouvelle ligne

    vba Set newRow = tbl.ListRows.Add

    ➕ Ajout d’une nouvelle ligne vide à la fin du tableau.


    🧠 Étape 3 : Copier les formules depuis la ligne précédente
    vba 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

    📋 Si le tableau contient déjà au moins une ligne, on :

    1. Récupère la ligne précédente (lastRow),

    2. Copie uniquement les formules (pas les valeurs) dans la nouvelle ligne.


    📝 Étape 4 : Remplir les données (champ par champ)

    vba With newRow.Range

    🧱 À partir d'ici, on remplit les champs manuellement saisis dans la nouvelle ligne du tableau.

    🔹 1. Champs standards fixes :

    vba pairs = Array( _
    Array("G2", "Nom Facture"), Array("G3", "Nom"), Array("G4", "ICE"), ... )

    On stocke les correspondances entre cellules de saisie (ex. G2) et colonnes du tableau (Nom Facture) dans un tableau.

    Puis on boucle :

    vba 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

    Seuls les champs non vides sont insérés dans la ligne.

    🔹 2. Champs dynamiques (produits ou services personnalisés) :

    vba 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

    Ici, le nom de la colonne est déterminé dynamiquement par l’utilisateur (par exemple Produit A, Service X, etc.).

    Même logique pour les paires K2:K8L2:L8, M2:M8N2:N8 et O2:O4P2:P4.


    🧹 Étape 5 : Nettoyer les champs de saisie

    vba For Each r In Param_CL_et_PRIX.Range("G2:G8,J2:J8,L2:L8,N2:N8,P2:P4")
    r.Value = "" Next r

    Après l’ajout, tous les champs de saisie sont vidés pour accueillir une nouvelle entrée.


    ✅ Message de confirmation

    vba MsgBox "Élément ajouté avec succès", vbInformation

    Un message confirme l’ajout réussi.


    ❗ Cas d'erreur

    Si les conditions initiales ne sont pas remplies :

    vba MsgBox "Veuillez remplir les informations client ..."

    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_ClickRemplir 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

    vba : Param_CL_et_PRIX.Range("A1").Value = ""
    • On vide la cellule A1 pour indiquer qu’on n’est pas en train d’ajouter un nouveau client (utile pour bloquer Ajouter_Click si besoin).

    2. 📋 Ciblage du tableau des clients

    vba : Dim clientsTable As ListObject
    Set clientsTable = Param_CL_et_PRIX.ListObjects("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

    vba : If Not Intersect(ActiveCell, Range("G10:G90000")) Is Nothing Then
    • 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

    vba : Param_CL_et_PRIX.Range("G2").Value = ActiveCell.Offset(0, clientsTable.ListColumns("Nom Facture").Index - 1).Value
    ' ... Param_CL_et_PRIX.Range("P4").Value = ActiveCell.Offset(0, clientsTable.ListColumns(Range("O4").Value).Index - 1).Value
    • La macro utilise Offset pour 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

    vba : Param_CL_et_PRIX.Range("F1").Value = ActiveCell.Offset(0, 0).Row
    • On note le numéro de la ligne sélectionnée dans F1 pour éventuellement s’en servir ailleurs (modification, suppression, etc.).

    6. ⚠️ Sinon, message d’erreur

    vba : Else
    MsgBox "Pas dans la plage 'merci de sélectionner le SUIVI !'"
    • 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.

    Modifier informations client exemple école


    RechercheECOLE_Change
    Private Sub RechercheECOLE_Change()
    Param_CL_et_PRIX.Range("A1").Value = ""
    If RechercheECOLE.Text <> "" Then


    'anuler les filtre
       On Error Resume Next
        Dim tbl As ListObject
        Set tbl = Param_CL_et_PRIX.ListObjects("Clients")

        ' Supprimer le filtre existant
        tbl.AutoFilter.ShowAllData

        On Error GoTo 0
            

       ' ActiveSheet.ListObjects("LISTE_SERVICE_ADERANT").Range.AutoFilter Field:=13, Criteria1:="=*" & TBNOMRECHS.Text & "*"
        'au lieu de mettre le numéro de filed pour filtrer je peux mettre l'index liste colone en cas de modification de son emplacement
        'exemple au lieu de merttre Field:=13 je remplace 13 par je met Commande_gestion.ListObjects("LISTE_SERVICE_ADERANT").ListColumns("Matricule & Nom").Index
         tbl.Range.AutoFilter Field:=tbl.ListColumns("RECHERCE DIVERS").Index, Criteria1:="=*" & RechercheECOLE.Text & "*"
            
         
        
    ActiveWindow.ScrollRow = 1
            
        End If

    End Sub

    la macro RechercheECOLE_Change() permet d’effectuer une recherche dynamique dans la colonne "RECHERCE DIVERS" de la table Clients, dès que du texte est saisi dans une TextBox nommée RechercheECOLE. Voici une explication claire :


    🔍 Explication de la macro RechercheECOLE_Change()

    Cette macro s'exécute automatiquement à chaque fois que l'utilisateur tape quelque chose dans le champ RechercheECOLE. Elle permet de filtrer dynamiquement la table Clients en fonction du texte saisi. Voici les étapes détaillées :

    1. Réinitialisation de l’état

    vba

    Param_CL_et_PRIX.Range("A1").Value = ""

    La cellule A1 est vidée — souvent utilisée comme indicateur de mode (ex. : "P" pour "Prospect"). Ici, elle est remise à zéro.

    2. Vérification du contenu de la TextBox

    vba
    If RechercheECOLE.Text <> "" Then

    La suite de la macro ne s’exécute que si l’utilisateur a saisi quelque chose.

    3. Suppression des filtres existants

    vba

    On Error Resume Next Set tbl = Param_CL_et_PRIX.ListObjects("Clients") tbl.AutoFilter.ShowAllData On Error GoTo 0

    Cette partie :

    • Récupère la table Clients dans la feuille Param_CL_et_PRIX.

    • Supprime les filtres déjà appliqués (s’il y en a) — et ignore l’erreur si aucun filtre n’était actif.

    4. Application du filtre

    vba

    tbl.Range.AutoFilter Field:=tbl.ListColumns("RECHERCE DIVERS").Index, Criteria1:="=*" & RechercheECOLE.Text & "*"

    Cette ligne applique un filtre contient (=*...*) sur la colonne "RECHERCE DIVERS" en recherchant ce que l'utilisateur a tapé dans la zone RechercheECOLE.

    💡 Astuce utile : au lieu de mettre un chiffre pour désigner la colonne (comme Field:=13), on utilise ici tbl.ListColumns("NomDeColonne").Index, ce qui rend le code robuste même si les colonnes sont déplacées.

    5. Ramener l’affichage en haut

    vba

    ActiveWindow.ScrollRow = 1

    Assure que le haut de la feuille soit visible après le filtrage, ce qui améliore l’expérience utilisateur.


    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