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.
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 Subsecond 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- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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 SubEnsuite, 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.
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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 SubBonjour,
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
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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.