La méthode 'Add' de l'objet 'ListRows' a échoué

Bonjour, Bonsoir.

Je fais appel à vos connaissances pour m'éclairer sur un souci que je rencontre sur mon application excel.

J'ai développé sous excel 2007 un gestionnaire de commandes (articles, clients, facturation...).

Après un mois de développement, j'ai donc transmis l'application au client afin qu'il puisse déjà se faire la main et tester cette dernière et qu'après ses retours, je puisse poursuivre le développpement. Mon client est sous excel 2016. N'ayant pas cette version, j'ai développé sous excel 2007. Mon application fonctionnant parfaitement sous 2007, j'ai donc installé, confiant, l'application sur le poste du client et surprise, enfin mauvaise surprise... une erreur est survenue sur deux onglets lorsqu'on essaie d'ajouter un client ou un article. J'ai donc installé une version d'essai 2016 pour me rendre compte du problème et effectivement même souci que chez le client.

ano excel2016 2

Jamais je n'ai rencontré cette erreur lors de mes tests sous 2007.

Je me suis donc documenté en cherchant sur internet des réponses à cette erreur. J'ai lu beaucoup de choses mais à force ça m'a perdu... J'ai modifié mon code par rapport aux explications que je lisais à droite et à gauche. Rien n'y fait, l'erreur subsiste toujours et fait crasher excel. Je n'ai pas cette erreur sous 2007 et 2010. Seulement sur excel 2016.

A noter que lorsque le tableau est vide, il n'y a pas de problème à l'insertion de la ligne. Mais au bout d'un moment, après quelques lignes, ça plante...

Je vous mets ci-dessous mon code d'origine et mon second code correctif pour tenter de résoudre le problème.

Afin de réaliser mes tests, j'ai réduit mon classeur qu'à un seul onglet et un tableau (clients). J'ai donc le strict minimum sur mon classeur mais je ne m'explique pas cette erreur. Devant livrer mon application avant les fêtes de fin d'année, j'avoue avoir pris un petit coup au moral. Je débute en vba, c'est ma première application.

Merci d'avance pour votre aide et échanges à venir.

Code d'origine.

Private Sub CommandButton1_Click()
Dim DL As Integer

If Me.txt_client_nom <> "" And Me.txt_client_prenom <> "" And Me.txt_client_telephone <> "" Then

    If Sheets("clients").Range("B6") = "" Then
    'ajouter dans le tableau clients
    Sheets("clients").Range("B6") = Me.label_client.Caption
    Sheets("clients").Range("C6") = Me.txt_client_nom
    Sheets("clients").Range("D6") = Me.txt_client_prenom
    Sheets("clients").Range("E6") = Me.txt_client_adresse
    Sheets("clients").Range("G6") = Me.txt_client_ville
    Sheets("clients").Range("H6") = Me.txt_client_telephone
        'champ CP
        If Me.txt_client_CP <> "" Then
            Sheets("clients").Range("F6") = CLng(Me.txt_client_CP) 'texte au format nombre
            Else: Sheets("clients").Range("F6") = ""
        End If

    Else

    Sheets("clients").ListObjects(1).ListRows.Add
    DL = Sheets("clients").Range("b9999").End(xlUp).row

    'ajouter dans le tableau clients
    Sheets("clients").Range("B" & DL) = Me.label_client.Caption
    Sheets("clients").Range("C" & DL) = Me.txt_client_nom
    Sheets("clients").Range("D" & DL) = Me.txt_client_prenom
    Sheets("clients").Range("E" & DL) = Me.txt_client_adresse
    Sheets("clients").Range("G" & DL) = Me.txt_client_ville
    Sheets("clients").Range("H" & DL) = Me.txt_client_telephone

        'champ CP
        If Me.txt_client_CP <> "" Then
            Sheets("clients").Range("F" & DL) = CLng(Me.txt_client_CP) 'texte au format nombre
            Else: Sheets("clients").Range("F" & DL) = ""
        End If
    End If

MsgBox "Le client a été créé dans la base de données.", vbInformation + vbOKOnly, "Ajout client."

Unload Me
add_client.Show

Else
    MsgBox "La création n'est pas possible. Une ou des informations obligatoires sur le client sont manquantes :" & Chr(13) & Chr(10) & "- nom." & Chr(13) & Chr(10) & "- prénom." & Chr(13) & Chr(10) & "- numéro de téléphone.", vbInformation + vbOKOnly, "Confirmer commande."

End If

End Sub

second code après corrections pour tests.

Private Sub CommandButton1_Click()
Dim nbLignes As Long
Dim lstObj As ListObject, lstRow As ListRow

Set lstObj = Worksheets("clients").ListObjects("Tableau_clients")
With Worksheets("clients")
    Set lstRow = lstObj.ListRows.Add

    nbLignes = lstObj.DataBodyRange.Rows.Count + 1

    'ajouter dans le tableau clients
    .Range("B" & nbLignes) = "client"
    .Range("C" & nbLignes) = Me.txt_client_nom
    .Range("D" & nbLignes) = Me.txt_client_prenom
    .Range("E" & nbLignes) = Me.txt_client_adresse
    .Range("G" & nbLignes) = Me.txt_client_ville
    .Range("H" & nbLignes) = Me.txt_client_telephone

MsgBox "Le client a été créé dans la base de données.", vbInformation + vbOKOnly, "Ajout client."

End With

Set lstObj = Nothing
Set lstRow = Nothing

End Sub

Bonjour,

Déjà, il serait préférable d'utiliser les instructions spécifiques au tableau structuré (ListObject)

Private Sub CommandButton1_Click()
    Dim i As Long
    Dim lstObj As ListObject, lstRow As ListRow

    Set lstObj = Range("Tableau_clients").ListObject
    With lstObj
        Set lstRow = .ListRows.Add
        i = lstRow.Index

        'ajouter dans le tableau clients
        .ListColumns(2).DataBodyRange.Rows(i) = "client"
        .ListColumns(3).DataBodyRange.Rows(i) = Me.txt_client_nom
        .ListColumns(4).DataBodyRange.Rows(i) = Me.txt_client_prenom
        .ListColumns(5).DataBodyRange.Rows(i) = Me.txt_client_adresse
        .ListColumns(7).DataBodyRange.Rows(i) = Me.txt_client_ville
        .ListColumns(8).DataBodyRange.Rows(i) = Me.txt_client_telephone

        MsgBox "Le client a été créé dans la base de données.", vbInformation + vbOKOnly, "Ajout client."
    End With

    Set lstObj = Nothing
    Set lstRow = Nothing

End Sub

Ensuite, je vous suggérerai de vérifier que votre tableau clients n'est pas utilisé comme "rowsource" dans une ComboBox ou une ListBox car changer son contenu en cours d'exécution provoque toujours un plantage d'Excel.

Bonjour thev et merci pour cette réponse.

J'ai essayé rapidement hier soir ce que vous m'avez dit et votre piste a été fortement concluante.

J'ai essayé votre code une première fois et j'ai eu la même erreur et plantage Excel. Puis je me suis donc penché sur le rowsource. Effectivement dans ma feuille clients, j'ai un autre formulaire qui a une combobox faisant appel à une colonne de ce tableau clients. J'ai donc supprimé ce formulaire pour tester et l'ajout de mon client s'est bien déroulé.

Jamais je n'aurai pensé à chercher par là...

Pourtant cette combobox n'est pas utilisée dans le formulaire actif mais dans un autre formulaire qui n'a pas été lancé. Pourquoi excel réagit-il comme ça ? J'essaie de comprendre

Votre hypothèse en plus se confirmerai car sur les deux tableaux qui me posent problème (articles et clients), d'autres formulaires utilisent des données de ces tableaux via une combobox. Alors que pour ma feuille commandes, aucune combobox n'utilise les infos du tableau commandes et je n'avais aucun problème pour y insérer mes données.

Je vais donc poursuivre mes tests dans ce sens là ce soir.

Par contre, comme fait-je pour conserver ces combobox sans générer d'erreurs excel ?

En effet, rien que dans mon formulaire "commandes", ce dernier fait appel à une combobox pour sélectionner le client et une autre combobox pour sélectionner l'article à commander. Quelle solution ais-je pour conserver cette façon de faire ?

Enfin, question que je me pose sur le pourquoi qu'Excel 2016 ne tolère pas cette façon de faire alors que sur 2010 et 2007 aucun problème ?

Merci en tout cas pour votre réponse qui m'éclaire un peu déjà (beaucoup) !

Bonne journée.

Par contre, comme fait-je pour conserver ces combobox sans générer d'erreurs excel ?

En ne chargeant pas vos combobox à la compilation (rowsource) mais à l'exécution (list) via la procédure événementielle Userform_Initialize.

En supposant que la colonne des noms de votre tableau client est "nom client", exemple :

Private Sub UserForm_Initialize()

    Dim tb_clients As ListObject

    Set tb_clients = Range("Tableau_clients").ListObject
    With tb_clients
        Me.ComboBox1.List = .ListColumns("nom client").DataBodyRange.Value
    End With

End Sub

Bonjour,

Merci beaucoup pour votre aide. Vos recommandations ont l'air effectivement d'avoir solutionné l'anomalie.

J'ai retravaillé le code et j'ai pu sans problème faire mes insertions de tableau sous excel 2016.

Je trouve par contre dommage que la méthode rowsource soit privilégiée dans des tutoriaux vidéos sur internet et que cette anomalie n'y soit pas mentionnée.

En tout cas encore merci!

Je considère à ce jour le problème résolu

Je trouve par contre dommage que la méthode rowsource soit privilégiée dans des tutoriaux vidéos sur internet

La méthode rowsource est pertinente si les données auxquelles elle fait référence ne sont pas modifiées en cours d'exécution.

Rechercher des sujets similaires à "methode add objet listrows echoue"