IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

PB insertion ligne dans tableau structuré [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut PB insertion ligne dans tableau structuré
    Bonjour à toutes et tous ;

    Je rencontre un problème qui est certainement bête comme choux mais dont je n'arrive pas à me débarrasser.
    En pièce jointe vous avez le fichier que je suis en train de faire.

    Il s'agit pour moi de suivre les objets que je dois mettre en vente dans un vide grenier permanent. Ce genre de magasin où vous louez un emplacement pour une période donnée, vous permettant ainsi de les vendre.

    Ce fichier est composé de 4 feuilles comme suit :
    1) Feuille Liste : cela comprend la liste de tous les objets mis en vente. (Tableau structuré)
    2) Les feuilles suivantes ('BDCAT' 'CATHOMA' 'BDMAR'), contiennent des tableaux structurés me permettant d'affecter des valeurs dans la feuille 'Liste'

    J'ai ajouté sur le ruban d'Excel un onglet "Outil de saisie" me permettant d'effectuer certaines tâches juste à côté de l’onglet ‘Accueil’.

    Lorsque que j'appuie sur la première option 'Saisie', le formulaire s'affiche.

    Je saisis un premier jet de données puis je clique sur la touche « Ajouter » pour créer une nouvelle ligne dans mon tableau.

    Le problème est que je créé systématiquement une première ligne sous la ligne portant le N° de séquence ‘1’. Ce N° est géré par la formule « Ligne (A1) » directement dans le tableau structuré.
    Je n’arrive pas à utiliser la première ligne N° séquence ‘1’

    Voici donc mon fichier exemple.

    Test1-2024.xlsm

    D'avance je remercie celles et ceux qui voudront bien m'aider.
    En attendant je vous souhaite une bonne journée.

  2. #2
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 509
    Par défaut
    Bonjour,
    Le problème est que je créé systématiquement une première ligne sous la ligne portant le N° de séquence ‘1’. Ce N° est géré par la formule « Ligne (A1) »
    Je pense qu'il n'est pas recommandé d'incrémenter le N° de séquence avec une formule. Il est préférable de te servir d'une fonction qui incrémente le max de la colonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    '@Description "Renvoie le maximum d'une colonne, plus 1 en option."
    Public Function GetMaxID(ByVal Table As Excel.ListObject, Optional ByVal ColumnName As String = "ID", Optional ByVal WithIncrement As Boolean)
        If Not Table Is Nothing Then
            With Table
                If .ListRows.Count > 0 Then
                    Dim MaxValue As Long
                    MaxValue = Application.WorksheetFunction.Max(.ListColumns(ColumnName).DataBodyRange)
                    GetMaxID = MaxValue + IIf(WithIncrement, 1, 0)
                Else
                    GetMaxID = 1
                End If
            End With
        Else
            GetMaxID = 0
        End If
    End Function
    Concernant l'ajout d'une ligne utilise l'objet Excel.Listrow, cela te simplifiera la vie et la compréhension du code.
    Les tableaux structurés garde en mémoire le formatage des colonnes donc nul besoin de formater la valeur des contrôles du formulaire.
    L'ajout d'une ligne peut se résumer à cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub Ajouter_Click()
        On Error GoTo Catch
        Dim itemListObject As Excel.ListObject
        Set itemListObject = Range("Tbl_LISTE").ListObject
     
        Dim itemRow As Excel.ListRow
        Set itemRow = itemListObject.ListRows.Add
     
        With itemRow
            .Range(.Parent.liscolumns("N° Seq").Index).Value = GetMaxID(itemListObject, "N° Seq", True)
            .Range(.Parent.liscolumns("Désignation").Index).Value = Desig.Value
            .Range(.Parent.liscolumns("Genre").Index).Value = LstSexe.Value
            .Range(.Parent.liscolumns("Catégorie d'objet").Index).Value = Combo_Categorie.Value
            .Range(.Parent.liscolumns("Type objet").Index).Value = Combo_Typobj.Valu
            .Range(.Parent.liscolumns("Marque").Index).Value = Combo_Marque.Value
            .Range(.Parent.liscolumns("Montant Fse").Index).Value = MntFse.Value
            .Range(.Parent.liscolumns("Prix Vente Hôma").Index).Value = PrixHoma.Value
        End With
     
    Catch:
        If Err.Number > 0 Then
            MsgBox "Oups... nous avons rencontré une erreur. " & Err.Description
        End If
    End Sub

  3. #3
    Membre confirmé Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Bonjour Valtrase;
    Je te remercie pour ta réponse ainsi pour le temps que tu as pris pour m'aider.

    Je vais regarder de près tes réponses, et essayer de tout comprendre, pour les intégrer à mon code.

    Encore un grand merci et bonne journée à toi.

  4. #4
    Membre confirmé Avatar de jeff1494
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Re bonjour Valtrase;

    J'ai regardé tes codes, et essayé de les intégrer au mien.
    Mais j'ai quelques problèmes :

    1) Faute de frappe : Valu au lieu de Value en ligne 14 du deuxième code.
    2) Faute de frappe : liscolumns au lieu de ListColumns dans les lignes lignes 10 à 17.

    Ce n'est pas grave et n'est pas le problème, cela arrive quelque fois.

    Par contre j'ai un message d'erreur avec err.Number. le message est qualificateur incorrect.
    J'ai fais des recherches mais je n'arrive pas à voir ce qui est faux.

    Lorsque après les corrections des fautes de frappe et la mise en commentaire de la partie liée aux possibles erreurs, je tente la saisie d'un nouvel élément via mon formulaire, la ligne se créée bien mais sur la ligne 2.
    Au lieu de la première ligne (sous l'entête) du tableau.
    La ventilation dans les colonnes est correct.


    Voilà à quoi ressemble alors la mise à jour la partie de la mise à jour de la feuille 'Liste'.
    A noter que j'ai supprimé dans le code suivant ce qui est lié aux erreurs pou ressayer au moins de créer une ligne dans mon tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    '
    '   2) Sélection feuille "Liste", et positionnement sur 1ère ligne vide.
    '
        With Worksheets("Liste").Activate
     
           Dim itemListObject As Excel.ListObject
           Set itemListObject = Range("Tbl_LISTE").ListObject
     
           Dim itemRow As Excel.ListRow
           Set itemRow = itemListObject.ListRows.Add
     
           With itemRow
               .Range(.Parent.ListColumns("N° Seq").Index).Value = GetMaxID(itemListObject, "N° Seq", True)
               .Range(.Parent.ListColumns("Désignation").Index).Value = Desig.Value
               .Range(.Parent.ListColumns("Genre").Index).Value = LstSexe.Value
               .Range(.Parent.ListColumns("Catégorie d'objet").Index).Value = Combo_Categorie.Value
               .Range(.Parent.ListColumns("Type objet").Index).Value = Combo_Typobj.Value
               .Range(.Parent.ListColumns("Marque").Index).Value = Combo_Marque.Value
               .Range(.Parent.ListColumns("Montant Fse").Index).Value = MntFse.Value
               .Range(.Parent.ListColumns("Prix Vente Hôma").Index).Value = PrixHoma.Value
           End With
        End With
    La fonction 'GetMaxID' est située juste en dessous de la procédure de mise à jour.

    Je te joins le fichier dans lequel j'ai appliqué tes conseils. Peut-être ai-je fait une bêtise.

    Test2024.xlsm

    Je te remercie pour ton aide, et te souhaite une bonne journée.

  5. #5
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 509
    Par défaut
    Bonjour,
    Des fois j'écris à la volée d'où ce type d'erreur,
    Par contre j'ai un message d'erreur avec err.Number. le message est qualificateur incorrect.
    Tu as déclaré err de type public long dans le module Variables voilà d'où vient l'erreur.
    Du coup pourquoi toutes ces variables publique. Qui portent pour certaines le même nom que des contrôles ex: Public Combo_Marque As String cela ne sert à rien sauf d’alourdir le code donc on vire.

    Trop de commentaires tue les commentaires, utilises plutôt des noms de variables explicite, pour t'y retrouver.
    La procédure du bouton Ajouter n'a pour fonction que d'ajouter la saisie compète dans un tableau structuré, l'ajout d'une catégorie, type d'objet ou marque doit-être gérer par des boutons spécifique, cela garantie d'une certaine conformité avec le standard Windows.

    Je n'ai pas trouvé la fonction GetMaxID dans ton fichier donc :
    • Crée un module : Menu=> Insertion => Module
    • Nommes le TabsManagement par exemple.
    • Copie et colle le code ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    '@Description "Renvoie le maximum d'une colonne, plus 1 en option."
    Public Function GetMaxID(ByVal Table As Excel.ListObject, Optional ByVal ColumnName As String = "ID", Optional ByVal WithIncrement As Boolean)
        If Not Table Is Nothing Then
            With Table
                If .ListRows.Count > 0 Then
                    Dim MaxValue As Long
                    MaxValue = Application.WorksheetFunction.Max(.ListColumns(ColumnName).DataBodyRange)
                    GetMaxID = MaxValue + IIf(WithIncrement, 1, 0)
                Else
                    GetMaxID = 1
                End If
            End With
        Else
            GetMaxID = 0
        End If
    End Function
    Maintenant on s'occupe du formulaire
    Dans le code du module du formulaire AjoutObjet colle la procédure ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub AjouterLigne()
        On Error GoTo Catch
        Dim itemListObject As Excel.ListObject
        Set itemListObject = Range("Tbl_LISTE").ListObject
     
        Dim itemRow As Excel.ListRow
        Set itemRow = itemListObject.ListRows.Add
     
        With itemRow
            .Range(.Parent.ListColumns("N° Seq").index).Value = GetMaxID(itemListObject, "N° Seq", True)
            .Range(.Parent.ListColumns("Désignation").index).Value = Desig.Value
            .Range(.Parent.ListColumns("Genre").index).Value = LstSexe.Value
            .Range(.Parent.ListColumns("Catégorie d'objet").index).Value = Combo_Categorie.Value
            .Range(.Parent.ListColumns("Type objet").index).Value = Combo_Typobj.Value
            .Range(.Parent.ListColumns("Marque").index).Value = Combo_Marque.Value
            .Range(.Parent.ListColumns("Montant Fse").index).Value = MntFse.Value
            .Range(.Parent.ListColumns("Prix Vente Hôma").index).Value = PrixHoma.Value
        End With
     
    Catch:
        If err.Number > 0 Then
            MsgBox "Oups... nous avons rencontré une erreur. " & err.Description
        End If
    End Sub
    Maintenant dans la procédure Ajouter_Click :
    • Remplaces tout depuis : ' 2) Sélection feuille "Liste", et positionnement sur 1ère ligne vide.
    • Jusqu’à la fin de la procédure, par AjouterLigne


    Et pour finir le module Variables :
    • Passes en commentaires l'ensemble des lignes (cela ne sert à rien)


    Voilà si je ne me suis pas trompé cela devrait résoudre le problème.

    ps. Je ne fournis pas de fichier tout prêt car le meilleur moyen d'apprendre c'est encore de s'y coller...

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    PS:
    Une technique de debuggage que j'utilise lorsqu'un gestionnaire d'erreur se déclenche.
    Considère le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Sub TestError()
    On Error Goto Error
        Dim Data As Long
        Data = 10 / 0
    Exit Sub
    Resume
    Error:
        Stop
        Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End Sub
    Lorsque l'instruction Data = 10/0 est executée (ligne 4), cela déclenche une erreur.
    La main est directement donnée à l'instruction Stop (Ligne 8) qui, comme son nom l'indique, met l'exécution en suspend.
    Dans la marge de ton IDE, il y a une petite fleche jaune, que tu peux déplacer sur l'instruction Resume (Ligne 6), ou tu peux également faire un click droit sur cette dernière et choisir: Définir l'instruction suivante.
    Lorsque tu auras exécute l'instruction Resume en pas à pas détaillé (raccourcis clavier: F8), le curseur pointera ensuite sur l'instruction fautive.

    N'hésite pas également à mettre en place des espions, et utiliser la fenêtre d'execution pour inspecter le contenu et types de tes variables.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Pb avec formule contenant RECHERCHV lors insertion ligne dans tableau structuré
    Par tico06 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/03/2020, 14h25
  2. Réponses: 10
    Dernier message: 06/12/2019, 08h32
  3. [XL-2016] Optimisation code insertion ligne dans tableau
    Par Pabri dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/11/2018, 10h07
  4. [XL-2007] Insertion ligne dans un tableau par rapport à un fichier d'origine
    Par XceSs dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/01/2011, 14h05
  5. [WD-2003] Insertion automatique de ligne dans tableau word après renvoi à la ligne
    Par melouille56 dans le forum VBA Word
    Réponses: 5
    Dernier message: 05/08/2009, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo