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 :

La méthode 'Add' de l'objet 'ListRows' a échoué [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Par défaut La méthode 'Add' de l'objet 'ListRows' a échoué
    Bonjour,

    Lorsque je souhaite Actualiser les données de mon formulaire, ce qui revient pour moi (mais il y a sûrement une façon plus élégante de faire) à Supprimer puis Ajouter je suis surpris d'avoir ce message d'erreur lequel au passage précède l'arrêt d'Excel:

    Nom : Capture 1.PNG
Affichages : 2591
Taille : 127,5 Ko

    car j'utilise la même méthode Add que celle que j'utilise avec Ajouter et qui fonctionne parfaitement. Je joins ci-dessous le code pour Ajouter, Supprimer et Actualiser. Si vous pouviez me dire ce qui cloche dans le code pour Actualiser je vous en suis par avance très reconnaissant.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    Private Sub BtnModifIntervenant_Click()
     
    Dim A As String
    Dim B As String
    Dim C As String
    Dim D As String
    Dim E As String
    Dim F As String
    Dim G As String
     
    If IntervenantsForm.TboNomActualiser.Value <> "" Then
        A = IntervenantsForm.TboNomActualiser
        B = IntervenantsForm.TboPrenomActualiser
        C = IntervenantsForm.TboTxHActualiser
        D = IntervenantsForm.TboTxJActualiser
        E = IntervenantsForm.TboRoleActualiser
        F = IntervenantsForm.TboEmailActualiser
        G = IntervenantsForm.TboTelActualiser
        With Liste_Intervenants
            ThisWorkbook.Worksheets(3).Select
            Application.Goto Reference:="TableauIntervenants"
            Selection.ListObject.ListRows(.ListIndex + 1).Delete
        End With
        ThisWorkbook.Worksheets(3).Select
        Application.Goto Reference:="TableauIntervenants"
        Range("A2:G2").Select
        Selection.ListObject.ListRows.Add (1)
        Range("A2").Select
        ActiveCell.Value = A
        ActiveCell.Offset(0, 1).Value = B
        ActiveCell.Offset(0, 2).Value = C
        ActiveCell.Offset(0, 3).Value = D
        ActiveCell.Offset(0, 4).Value = E
        ActiveCell.Offset(0, 5).Value = F
        ActiveCell.Offset(0, 6).Value = G
        End With
        Unload Me
        IntervenantsForm.Show
    Else
    Unload Me
    IntervenantsForm.Show
    End If
    End Sub
     
    ==========================================
    ==========================================
     
    Private Sub BtnAddIntervenant_Click()
    If IntervenantsForm.TboNom.Value <> "" Then
        ThisWorkbook.Worksheets(3).Select
        Application.Goto Reference:="TableauIntervenants"
        Range("A2:G2").Select
        Selection.ListObject.ListRows.Add (1)
        Range("A2").Select
        ActiveCell.Value = IntervenantsForm.TboNom
        ActiveCell.Offset(0, 1).Value = IntervenantsForm.TboPrenom
        ActiveCell.Offset(0, 2).Value = IntervenantsForm.TboTxH
        ActiveCell.Offset(0, 3).Value = IntervenantsForm.TboTxJ
        ActiveCell.Offset(0, 4).Value = IntervenantsForm.TboRole
        ActiveCell.Offset(0, 5).Value = IntervenantsForm.TboEmail
        ActiveCell.Offset(0, 6).Value = IntervenantsForm.TboTel
        Unload Me
        IntervenantsForm.Show
    Else
    Unload Me
     
    ==========================================
    ==========================================
     
    Private Sub BtnSupprIntervenant_Click()
     With Liste_Intervenants
        Application.Goto Reference:="Plage"
        Selection.ListObject.ListRows(.ListIndex + 1).Delete
        Unload Me
        IntervenantsForm.Show
      End With
    End Sub
    IntervenantsForm.Show
    End If
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Listobject n'est pas défini.
    Doit être un élément de la collection ListObjects.
    Exemple :
    dim toto as listobject
    set toto = listobjects(1) ' ou 1 est l'index de toto dans la collection Listobjects.

  3. #3
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Par défaut yes but ?
    Citation Envoyé par unparia Voir le message
    Bonjour
    Listobject n'est pas défini.
    Doit être un élément de la collection ListObjects.
    Exemple :
    dim toto as listobject
    set toto = listobjects(1) ' ou 1 est l'index de toto dans la collection Listobjects.
    Bonjour et merci pour cet éclairage, cependant ici non plus ListOject n'est pas défini :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub BtnSupprIntervenant_Click()
     With Liste_Intervenants
        Application.Goto Reference:="Plage"
        Selection.ListObject.ListRows(.ListIndex + 1).Delete
        Unload Me
        IntervenantsForm.Show
      End With
    End Sub
    IntervenantsForm.Show
    End If
    End Sub
    et ici non plus :

    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
    Private Sub BtnAddIntervenant_Click()
    If IntervenantsForm.TboNom.Value <> "" Then
        ThisWorkbook.Worksheets(3).Select
        Application.Goto Reference:="TableauIntervenants"
        Range("A2:G2").Select
        Selection.ListObject.ListRows.Add (1)
        Range("A2").Select
        ActiveCell.Value = IntervenantsForm.TboNom
        ActiveCell.Offset(0, 1).Value = IntervenantsForm.TboPrenom
        ActiveCell.Offset(0, 2).Value = IntervenantsForm.TboTxH
        ActiveCell.Offset(0, 3).Value = IntervenantsForm.TboTxJ
        ActiveCell.Offset(0, 4).Value = IntervenantsForm.TboRole
        ActiveCell.Offset(0, 5).Value = IntervenantsForm.TboEmail
        ActiveCell.Offset(0, 6).Value = IntervenantsForm.TboTel
        Unload Me
        IntervenantsForm.Show
    Else
    Unload Me
    et pourtant ça marche...

    Je ne comprends pas.

  4. #4
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Par défaut précision sur le 'bug'
    Si j'ajoute n intervenants tout va bien
    Si je supprime n intervenants tout va bien

    Mais:

    Si je supprime 1 ou n intervenants puis que j'en ajoute 1 -> alors je plante Excel

    Mon erreur de code provient donc certainement de la façon dont j'ajoute un intervenant à la plage nommée de mon tableau mais je ne comprends toujours pas où elle se situe.

    Help please

  5. #5
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour à vous,

    Je ne puis que vous conseiller de supprimer toute action de sélection de votre code, qui contient actuellement de nombreuses lignes inutiles.
    Ces lignes compliquent la lecture du code pour ceux qui souhaiteraient vous aider et représentent un risque important d'erreur.

    Cordialement

  6. #6
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Par défaut
    Citation Envoyé par Ben_L Voir le message
    Bonjour à vous,

    Je ne puis que vous conseiller de supprimer toute action de sélection de votre code, qui contient actuellement de nombreuses lignes inutiles.
    Ces lignes compliquent la lecture du code pour ceux qui souhaiteraient vous aider et représentent un risque important d'erreur.

    Cordialement
    Bonjour et Merci Ben_L
    Vous avez raison, je n'arrivais plus à me relire non plus.

    Voici le code simplifié au maximum et le bug qui persiste...

    1 - je peux ajouter des enregistrements
    2 - je peux supprimer des enregistrements

    3 - supprimer puis ajouter un enregistrement => plante Excel

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Private Sub AddIntervenantBtn_Click()
        If UserForm1.NomTextBox.Value <> "" Then
            Range("A2").Select
            Selection.ListObject.ListRows.Add (1)
            ActiveCell.Value = UserForm1.NomTextBox
            ActiveCell.Offset(0, 1).Value = UserForm1.PrenomTextBox
            Unload Me
            UserForm1.Show
        Else
            Unload Me
            UserForm1.Show
        End If
    End Sub
     
     
    Private Sub SupprIntervenantBtn_Click()
     With ComboBox1
        li = .ListIndex + 2
        Rows(li & ":" & li).Select
        Selection.Delete Shift:=xlUp
        Unload Me
        UserForm1.Show
      End With
    End Sub
     
     
    Private Sub ComboBox1_Change()
      With ComboBox1
        PrenomLabel.Caption = .Column(1, .ListIndex)
      End With
    End Sub
     
    Private Sub UserForm_Initialize()
      ComboBox1.RowSource = "=Plage"
    End Sub
    Quelques captures écran :
    Nom : Capture.PNG
Affichages : 2396
Taille : 27,0 KoNom : Capture2.PNG
Affichages : 2380
Taille : 34,5 KoNom : Capture3.PNG
Affichages : 2425
Taille : 31,4 KoNom : Capture4.PNG
Affichages : 2432
Taille : 22,8 Ko

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    C'est sur quelle ligne, l'erreur?

    Et en fonctionnant en pas à pas, ça donne quoi?

    L'erreur se produit-elle sur des lignes particulières du combobox (première, dernière, ligne située directement avant ou après celle qui vient d'être sélectionnée)?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Pas le temps pour l'instant d'ouvrir tes fichiers et de tester...

    Mais si, sur chacun des fichiers, tu démarres le process en pas à pas, tu vas forcément tomber sur le code qui initie la variable sur l'un et pas sur l'autre...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Perso, avec les tableaux, j'utilise beaucoup les plages nommées.

    Sur base du tableau suivant, on peut utiliser un code de remplissage qui n'utilise pratiquement pas le listobject (juste pour tester s'il est vide ou pas)
    Nom : Capture.PNG
Affichages : 355
Taille : 23,7 Ko

    Voici un code qui remplit le tableau en testant qu'il est vide ou pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub AddContact(FirstName As String, LastName As String)
      Dim RowIndex As Long
     
      If Range("t_contacts").ListObject.DataBodyRange Is Nothing Then
        RowIndex = 1
      Else
        RowIndex = Range("t_Contacts").Rows.Count + 1
      End If
      Range("t_contacts[prénom]")(RowIndex).Value = FirstName
      Range("t_contacts[nom]")(RowIndex).Value = LastName
    End Sub
    Sur un tableau vide, tu peux tester et entrer les deux contacts suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Test()
      AddContact "Pierre", "Durand"
      AddContact "Martine", "Dupont"
    End Sub
    Personnellement, je trouve que c'est plus simple que de travailler avec les listobject.

    De plus, j'essaie de ne jamais effectuer les traitements directement dans les userform. Je préfère découpler et utiliser le userform pour ce qu'il est, à savoir un auxiliaire de saisie. Lorsque les données sont saisies, on les passe en paramètres à une fonction hors userform qui réalise le process. On utilise cette méthode tant pour l'ajout que pour la suppression. Ca permet de tester chaque fonctionnalité en dehors d'un contexte où elle utilise peut-être des mauvaises valeurs de variables (cas typique d'une ligne supprimée qui décale un objet Range). Tu supprimes une ligne en lui passant son numéro, et tu ajoutes sur une ligne en lui passant des données via une autre fonction. Les fonctions utilisant chacune leurs propres variables, aucun risque de se mélanger les pinceaux... (C'est ma façon psychorigide de coder )
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Par défaut merci Pierre mais si tu avais pu jeter un oeil plus haut... j'essayais le plages nommées->01/09 14h40
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut.

    Perso, avec les tableaux, j'utilise beaucoup les plages nommées.

    Sur base du tableau suivant, on peut utiliser un code de remplissage qui n'utilise pratiquement pas le listobject (juste pour tester s'il est vide ou pas)
    Nom : Capture.PNG
Affichages : 355
Taille : 23,7 Ko

    Voici un code qui remplit le tableau en testant qu'il est vide ou pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub AddContact(FirstName As String, LastName As String)
      Dim RowIndex As Long
     
      If Range("t_contacts").ListObject.DataBodyRange Is Nothing Then
        RowIndex = 1
      Else
        RowIndex = Range("t_Contacts").Rows.Count + 1
      End If
      Range("t_contacts[prénom]")(RowIndex).Value = FirstName
      Range("t_contacts[nom]")(RowIndex).Value = LastName
    End Sub
    Sur un tableau vide, tu peux tester et entrer les deux contacts suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Test()
      AddContact "Pierre", "Durand"
      AddContact "Martine", "Dupont"
    End Sub
    Personnellement, je trouve que c'est plus simple que de travailler avec les listobject.

    De plus, j'essaie de ne jamais effectuer les traitements directement dans les userform. Je préfère découpler et utiliser le userform pour ce qu'il est, à savoir un auxiliaire de saisie. Lorsque les données sont saisies, on les passe en paramètres à une fonction hors userform qui réalise le process. On utilise cette méthode tant pour l'ajout que pour la suppression. Ca permet de tester chaque fonctionnalité en dehors d'un contexte où elle utilise peut-être des mauvaises valeurs de variables (cas typique d'une ligne supprimée qui décale un objet Range). Tu supprimes une ligne en lui passant son numéro, et tu ajoutes sur une ligne en lui passant des données via une autre fonction. Les fonctions utilisant chacune leurs propres variables, aucun risque de se mélanger les pinceaux... (C'est ma façon psychorigide de coder )
    Voici le code qui me posait souci (Tableau et Plage nommée)

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Private Sub AddIntervenantBtn_Click()
        If UserForm1.NomTextBox.Value <> "" Then
            Range("A2").Select
            Selection.ListObject.ListRows.Add (1)
            ActiveCell.Value = UserForm1.NomTextBox
            ActiveCell.Offset(0, 1).Value = UserForm1.PrenomTextBox
            Unload Me
            UserForm1.Show
        Else
            Unload Me
            UserForm1.Show
        End If
    End Sub
     
     
    Private Sub SupprIntervenantBtn_Click()
     With ComboBox1
        li = .ListIndex + 2
        Rows(li & ":" & li).Select
        Selection.Delete Shift:=xlUp
        Unload Me
        UserForm1.Show
      End With
    End Sub
     
     
    Private Sub ComboBox1_Change()
      With ComboBox1
        PrenomLabel.Caption = .Column(1, .ListIndex)
      End With
    End Sub
     
    Private Sub UserForm_Initialize()
      ComboBox1.RowSource = "=Plage"
    End Sub
    Cdt, Eric

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Pour continuer dans les exemples de manip, tu peux créer également une fonction qui supprime. Le code suivant, issu du tableau illustré ci-dessous, supprime une ligne puis en ajoute une. Ici, les fonctions ne gèrent pas les erreurs. C'est normalement au code appelant (le clic sur un des boutons) à gérer les erreurs qui remontent des autres couches de l'appli. Par exemple, si l'ID n'existe pas, ça plante. C'est donc la fonction qui appelle DeleteContact qui doit gérer l'erreur avec une gestionnaire d'erreur adéquat. On pourrait aussi gérer l'erreur en interne et renvoyer soit 0 (tout est ok) soit un code d'erreur qui serait traité par la suite dans la fonction appelante.

    Mais à nouveau, en procédant de la sorte, tu crées des fonctions qui ne font qu'une seule chose, et tu peux tester et retester ces fonctions dans tous les sens... Ca donne l'impression d'être plus complexe, mais c'est au final beaucoup plus simple à écrire, à tester et à maintenir.
    Nom : Capture.PNG
Affichages : 242
Taille : 24,8 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub DeleteContact(ID As String)
      Dim RowIndex As Long
     
      RowIndex = Application.Match(ID, Range("t_contacts[ID]"), 0)
      Range("t_contacts").ListObject.ListRows(RowIndex).Delete
    End Sub
     
    Sub Test()
      DeleteContact "X485"
      AddContact "Alain", "Térieur", "Z111"
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Pour continuer dans les exemples de manip[...]
    Bonjour Pierre
    J'aurais eu grand besoin de tes lumières plus haut 01/09 14h40 pour me dire ce qui cloche dans ce code (plage nommée)

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Private Sub AddIntervenantBtn_Click()
        If UserForm1.NomTextBox.Value <> "" Then
            Range("A2").Select
            Selection.ListObject.ListRows.Add (1)
            ActiveCell.Value = UserForm1.NomTextBox
            ActiveCell.Offset(0, 1).Value = UserForm1.PrenomTextBox
            Unload Me
            UserForm1.Show
        Else
            Unload Me
            UserForm1.Show
        End If
    End Sub
     
     
    Private Sub SupprIntervenantBtn_Click()
     With ComboBox1
        li = .ListIndex + 2
        Rows(li & ":" & li).Select
        Selection.Delete Shift:=xlUp
        Unload Me
        UserForm1.Show
      End With
    End Sub
     
     
    Private Sub ComboBox1_Change()
      With ComboBox1
        PrenomLabel.Caption = .Column(1, .ListIndex)
      End With
    End Sub
     
    Private Sub UserForm_Initialize()
      ComboBox1.RowSource = "=Plage"
    End Sub

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Pour être sûr de travailler sur le bon tableau, quelle que soit la feuille active, tu peux utiliser
    set tbl = range("Intervenants").ListObject sans te tracasser de la feuille sur laquelle il se trouve ou que ce soit la bonne feuille qui soit activée.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  14. #14
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Par défaut
    re,
    cool !!..

    direct je modifie..

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par mjpmjp Voir le message
    re,
    cool !!..[...]
    J'illustrais cette possibilité dans les codes que j'ai donnés, pour l'ajout ou pour le delete
    If Range("t_contacts").ListObject.DataBodyRange Is Nothing Then pour voir si le tableau est vide

    Range("t_contacts").ListObject.ListRows(RowIndex).Delete pour supprimer la ligne du tableau (en se limitant donc aux colonnes dudit tableau)

    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Par défaut "pause dej"
    Excuse-moi JP, j'étais OFF

    Pour ce cas je suis sur un seul onglet pour rester simple, j'ai assez de comme ça
    Donc de toute façon à l'ouverture c'est bien Feuil1 qui est active

    Pour Pierre (pour lui montrer que j'ai un peu creusé la plage nommée sur ses recommandations)
    Oui si la plage n'est pas nommée pour la Feuille dont elle est issue, alors elle s'applique à tout le classeur actif

    Eric

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    En fait, le nom d'un tableau est unique dans le classeur. Dès lors, le nom utilisé est unique aussi, et donc la plage nommée avec un nom de tableau s'applique à la zone de données du tableau et s'applique donc à tout le classeur actif.

    De sorte que si tu as un tableau nommé t_Contacts, tu peux utiliser la plage nommée t_Contacts partout dans ton code, elle fera toujours référence à la zone de données dudit tableau.
    Entre autres avantages, utiliser Range("t_Contacts") pour pointer vers la zone de données du tableau, et notamment utiliser range("...").ListObject pour récupérer le listobject, permet que ton code ne doit pas être modifié si tu déplaces ton tableau sur une autre feuille ou si tu renommes ta feuille. Tu n'as en fait même pas besoin de savoir sur quelle feuille ton tableau se trouve ni comment elle se nomme, et ton code passe au travers de tous les déplacements, sur la feuille même, et vers une autre feuille également.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2017
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 58
    Par défaut je repose ma question car je suis breton...
    Pourquoi le fichier origine de JP fonctionne-t-il

    (XL-2013) La méthode 'Add' de l'objet 'ListRows' a échoué.xlsm

    et pas la copie ?

    (XL-2013) La méthode 'Add' de l'objet 'ListRows' a échoué - Copie.xlsm

    modification portant uniquement sur le lancement du userform

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par 1357VBA Voir le message
    Pourquoi le fichier origine de JP fonctionne-t-il


    et pas la copie ?



    modification portant uniquement sur le lancement du userform
    Perso, je n'ai pas eu de soucis particuliers dans les fichiers donnés, hormis le plantage si absence de sélection dans la combo ou si tableau vide. Peut-être serait-il intéressant de bien examiner les conditions dans lesquelles les classeurs se trouvent avant chaque clic sur le bouton...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  20. #20
    Membre extrêmement actif Avatar de mjpmjp
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    1 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Alpes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2012
    Messages : 1 133
    Par défaut
    bonjour,
    par rapport au code de Pierre,
    j'ai donc revu le code , pour éviter les contraintes de la "localisation de l'onglet"

    mais je me suis heurté à ce problème de localisation (qui reste un mystère) avec la RowSource de la ComboBox
    code qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        'initialise ComboBox1
        ComboBox1.RowSource = Tb.DataBodyRange.Parent.Name & "!" & Tb.DataBodyRange.Address
    j'ai donc indiqué le "Parent" de Tb --> tableau

    pour ce qui est de .Add et .Delete , là aussi , c'est pas clair...

    .Add , je comprend que : on modifie "physiquement" un peu comme select qui vise "physiquement" une cellule..

    alors j'utilise la solution proposée par Pierre , qui est de ajouter mais pas "directement" et donc "physiquement" ,
    mais "automatiquement" en modifiant la valeur de la cellule , qui va , par le mécanisme du tableau , être "ajouter"

    je reste ainsi "géolocalisé" dans mon tableau et je n'est pas besoin d'indiquer l'onglet

    .Delete , je comprend que : le raisonnement doit être le même que "Add" ,
    mais pourtant , çà fonctionne ...et puis , sans aucune raison (?) çà ne fonctionne plus

    voila le code
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    Dim Tb As ListObject
    Dim TbRows As ListRows
    Dim TbCols As ListColumns
    Dim EffaceEnCours As Boolean
     
    Private Sub UserForm_Initialize()
        Call Initialise
    End Sub
     
    Private Sub ComboBox1_Change()
        If EffaceEnCours Then
            EffaceEnCours = False
        Else
            With ComboBox1
              UserForm1.PrenomLabel.Caption = .Column(1, .ListIndex)
            End With
        End If
    End Sub
     
    Private Sub AddIntervenantBtn_Click()
        Call Initialise
        If UserForm1.NomTextBox.Value <> "" Then
            'derniere ligne
            TbLigne = TbRows.Count + 1
            'ecrire nom
            TbCols("Nom").DataBodyRange(TbLigne).Value = UserForm1.NomTextBox.Value
            'ecrire prenom
            TbCols("Prénom").DataBodyRange(TbLigne).Value = UserForm1.PrenomTextBox.Value
            'initialise ComboBox1
            ComboBox1.RowSource = Tb.DataBodyRange.Parent.Name & "!" & Tb.DataBodyRange.Address
            Call EffaceControle
        End If
    End Sub
     
    Private Sub SupprIntervenantBtn_Click()
        Call Initialise
        'ligne à supprimer
        TbLigne = UserForm1.ComboBox1.ListIndex + 1
        'supprime ligne
        Tb.ListRows(TbLigne).Delete
        'initialise ComboBox1
        ComboBox1.RowSource = Tb.DataBodyRange.Parent.Name & "!" & Tb.DataBodyRange.Address
        Call EffaceControle
    End Sub
     
    Private Sub Initialise()
        'tableau
        Set Tb = Range("Intervenants").ListObject
        'contient les lignes
        Set TbRows = Tb.ListRows
        'contient les colonnes
        Set TbCols = Tb.ListColumns
        'ComboBox
        If Not Tb.DataBodyRange Is Nothing Then
            ComboBox1.RowSource = Tb.DataBodyRange.Parent.Name & "!" & Tb.DataBodyRange.Address
        End If
        EffaceEnCours = False
    End Sub
    Private Sub EffaceControle()
        EffaceEnCours = True
        With UserForm1
            .PrenomLabel.Caption = ""
            .NomTextBox.Value = ""
            .PrenomTextBox.Value = ""
            .ComboBox1.Value = ""
        End With
    End Sub
    et voila le fichier ,
    qui contient 2 onglet et qui démarre sur le 2 eme onglet (vide)
    et qui lance le form
    [XL-2013] La méthode 'Add' de l'objet 'ListRows' a échoué v2.xlsm

    quand je charge ce fichier et que j'active la modification ,
    il y a une erreur , qui n'est plus à l' utilisation suivante ?

    Nom : Capture4.PNG
Affichages : 352
Taille : 43,9 Ko

    @+JP
    Caractéristiques (WEB) phpMyAdmin 4-74 , PHP 5-631 , Apache 2-427 , MySQL 5-719
    Présentation NAS DS-3615xs + 20Go , DSM 6.1.6-15266 Up1 , 12 * WD 4To WD4000F9YZ (10 raid 6+ )+(2 raid 1+) , LinkSys comutateur-switch lgs528p-eu , Onduleur UPS 720W Power Boxx Lcd (4*UPS + 4*MOD)
    Mes contributions (EXCEL) Form GRAPHIQUE: Gestion des boutons , Liste Onglet dynamique...GESTION de FILM

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Méthode add() de l'objet select
    Par webrider dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/01/2008, 14h01
  2. Méthode add de l'objet AllowEditRange fonctionne... maintenant
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/09/2007, 12h58
  3. erreur La méthode 'Range' de l'objet '_Global' a échoué
    Par mahboub dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/11/2006, 20h46
  4. la méthode 'connection' de l'objet '_currentProject' a échoué
    Par floysand dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/09/2006, 12h14
  5. [VBA-E]La méthode 'Range' de l'objet '_Global' a échoué
    Par repié dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/02/2006, 16h00

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