1 pièce(s) jointe(s)
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:
Pièce jointe 307966
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:
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 |
je ne reproduis plus le bug mais je ne sais pas pourquoi ?
A priori avoir ôté tous les select a arrangé les choses.
Cher Ben_L, que préconisez-vous pour minimiser les " SELECT " dans le code ?
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
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)
Pièce jointe 308946
Voici un code qui remplit le tableau en testant qu'il est vide ou pas.
Code:
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:
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:
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