Ce n'est pas déconcertant... Le problème de la suppression de données, c'est qu'elle décale les lignes. On se trouve donc à un moment donné à plonger hors du tableau, par exemple. Si on supprime la cellule vers laquelle pointe rng, rng ne peut plus pointer vers une cellule valide (c'est le problème du #REF! en Excel) et donc, on se prend une erreur.
C'est pour cela qu'il faut passer en pas à pas en ayant un œil sur la fenêtre des variables locales, voire avec des variables espion pour voir ce qui se passe et comment bougent les variables.
Si on observe le code suivant:
il affichera $A$2, car lors de la suppression de A2, A3 a glissé vers le haut, et donc l'objet qui pointait vers A3 a suivi et pointe maintenant vers A2. C'est pourquoi il est utile de découpler et d'utiliser des fonctions isolées car on peut beaucoup plus facilement tester les arguments qu'on leur passe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Sub TestDelete() Dim rng As Range Set rng = Range("a3") Range("a2").EntireRow.Delete Debug.Print rng.Address 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...
---------------
re ,
fichier modifieé : [XL-2013] La méthode 'Add' de l'objet 'ListRows' a échoué v4.xlsm
après la modif (code UserForm1) :
code module :
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 Private Sub UserForm_Initialize() 'ComboBox If Not Tb.DataBodyRange Is Nothing Then ComboBox1.RowSource = Tb.DataBodyRange.Parent.Name & "!" & Tb.DataBodyRange.Address End If 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 EffaceControle() EffaceEnCours = True With UserForm1 .PrenomLabel.Caption = "" .NomTextBox.Value = "" .PrenomTextBox.Value = "" .ComboBox1.Value = "" End With End Sub
code WorkBook
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 Public Tb As ListObject Public TbRows As ListRows Public TbCols As ListColumns Public EffaceEnCours As Boolean Public Sub Initialise() 'tableau Set Tb = Range("Intervenants").ListObject 'contient les lignes Set TbRows = Tb.ListRows 'contient les colonnes Set TbCols = Tb.ListColumns EffaceEnCours = False End Sub
le même message :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Private Sub Workbook_Open() Call Initialise UserForm1.Show End Sub
qui pointe sur Set Tb :
les amis , je vais...
@+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
Partager