"erreur d’exécution 13 Incompatibilité de Type" dans VBA.
Résolu/Fermé
Biloute
-
Modifié par jordane45 le 25/02/2016 à 13:33
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 26 févr. 2016 à 14:45
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 26 févr. 2016 à 14:45
A voir également:
- Incompatibilité de type vba
- Erreur d'exécution 13 incompatibilité de type - Meilleures réponses
- Erreur d'execution 13 vba - Meilleures réponses
- Erreur d'exécution 13 Incompatibilité de type ✓ - Forum Programmation
- Erreur d'exécution '13': Incompatibilité de Type ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Erreur exécution 13 : incompatibilité de type ✓ - Forum VB / VBA
- Incompatibilité de type ✓ - Forum VB / VBA
4 réponses
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 750
Modifié par pijaku le 26/02/2016 à 07:53
Modifié par pijaku le 26/02/2016 à 07:53
Bonjour,
Bon...
J'ai regardé le fichier, mais... Tu n'y mets aucune donnée!
Je t'ai dis, par deux fois, que le souci venait des données et... Il n'y en a aucune dans le fichier...
Ok, il faut anonymiser les classeurs passés sur Internet, mais, s'agissant de tes ID par exemple dans la feuille bloc, je suppose qu'il s'agit de numéros...
Lorsque des noms apparaissent, il est aisé de les remplacer par d'autres (Victor HUGO, Nicolas ANELKA, etc...)
Mais bon, tu as de la chance, j'ai activé ma boule de cristal spéciale CCM.
1- Ce qui bloque, c'est ta ligne :
Qu'est ce qui peut te bloquer?
Les données contenues dans le Range("A1:A100")
2- Comment y remédier?
Simplement.
Tu remplis la combobox (tes comboboxes) à partir des plages de ton classeur :
Nota (au passage) :
ce n'est pas judicieux car tu as plein de lignes vides dans le bas de la liste de ta combobox... Il faudrait y préférer ceci :
A noter qu'un clic sur une ligne vide de ta combobox entraine systématiquement le crash de ton application. Toujours se préserver de cette possibilité en ajoutant, à chaque code de tes combobox :
Je disais donc que tu remplis ta ComboBox avec la colonne A de la feuille Bloc.
Donc, dans ta combo, l'ordre des "lignes" est la même que dans la feuille.
Donc, lorsque tu clic sur le premier nom dans ta combobox (ListIndex = 0) cela correspond à ta ligne 1 dans la feuille.
Par conséquent, ta variable Ligne peut être calculée comme ceci :
3- décalage de colonnes
Ensuite, tu utilises une fonction Excel (Index) pour "décaler" :
Il y avait carrément plus simple :
4- événement déclencheur
L'événement que tu as choisi pour déclencher ces actions est l'événement Change() de tes combobox.
L'événement Change() se produit et s'utilise lorsqu'il y a une saisie dans une ComboBox.
Or, si je me réfère à ton classeur, cela ne doit pas se produire. L'utilisateur ne fait que des choix dans ces Combo. Des choix, par un clic. Donc, à mon sens, l'événement à retenir est l'événement Click() des comboBox.
5- Tes commandButton :
S'ils servent juste à activer les feuilles pour le bon déroulement de tes procédures événementielles des combobox, vire les ils sont devenus inutiles.
Il n'est pas, en effet, utile d'activer une feuille pour interférer avec. Un bloc With...End With remplit à merveille cette tâche.
6- ton code complet
Modifié selon toutes les indications données précédemment devient :
A NOTER :
> La variable Ligne est déclarée publique car elle est utile dans plusieurs Sub
> Le code n'est-il pas plus agréable à lire correctement indenté?
EDIT : je n'avais pas tenu compte, dans mes remarques, de tes entêtes de colonnes. Elles n'ont, à mon avis, rien à faire dans tes List de ComboBox car sources de plantage...
Donc, je les ai supprimées dans le code ci dessus.
D'ou les :
ComboBox1.List = .Range("A2:A" & Ligne).Value
et les :
Ligne = ComboBox4.ListIndex + 2
Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
Bon...
J'ai regardé le fichier, mais... Tu n'y mets aucune donnée!
Je t'ai dis, par deux fois, que le souci venait des données et... Il n'y en a aucune dans le fichier...
Ok, il faut anonymiser les classeurs passés sur Internet, mais, s'agissant de tes ID par exemple dans la feuille bloc, je suppose qu'il s'agit de numéros...
Lorsque des noms apparaissent, il est aisé de les remplacer par d'autres (Victor HUGO, Nicolas ANELKA, etc...)
Mais bon, tu as de la chance, j'ai activé ma boule de cristal spéciale CCM.
1- Ce qui bloque, c'est ta ligne :
Ligne = Application.Match(Me.ComboBox2.Value, .Range("A1:A100"), 0)
Qu'est ce qui peut te bloquer?
Les données contenues dans le Range("A1:A100")
2- Comment y remédier?
Simplement.
Tu remplis la combobox (tes comboboxes) à partir des plages de ton classeur :
ComboBox2.List = Worksheets("Bloc").Range("A1:A400").Value
Nota (au passage) :
ce n'est pas judicieux car tu as plein de lignes vides dans le bas de la liste de ta combobox... Il faudrait y préférer ceci :
Dim DLig As Long With Worksheets("Licenciés") DLig = .Columns(1).Find("*", , , , , xlPrevious).Row ComboBox1.List = .Range("A1:A" & DLig).Value End With With Worksheets("Bloc") DLig = .Columns(1).Find("*", , , , , xlPrevious).Row ComboBox2.List = .Range("A1:A" & DLig).Value End With 'ETC...
A noter qu'un clic sur une ligne vide de ta combobox entraine systématiquement le crash de ton application. Toujours se préserver de cette possibilité en ajoutant, à chaque code de tes combobox :
If ComboBox2.Value = "" Then Exit Sub
Je disais donc que tu remplis ta ComboBox avec la colonne A de la feuille Bloc.
Donc, dans ta combo, l'ordre des "lignes" est la même que dans la feuille.
Donc, lorsque tu clic sur le premier nom dans ta combobox (ListIndex = 0) cela correspond à ta ligne 1 dans la feuille.
Par conséquent, ta variable Ligne peut être calculée comme ceci :
Ligne = ComboBox2.ListIndex + 1
3- décalage de colonnes
Ensuite, tu utilises une fonction Excel (Index) pour "décaler" :
Me.TextBox7.Text = Application.Index(.Range("B1:B100"), Ligne, 1)
Il y avait carrément plus simple :
Me.TextBox7.Text = .Range("B" & Ligne).Value
4- événement déclencheur
L'événement que tu as choisi pour déclencher ces actions est l'événement Change() de tes combobox.
L'événement Change() se produit et s'utilise lorsqu'il y a une saisie dans une ComboBox.
Or, si je me réfère à ton classeur, cela ne doit pas se produire. L'utilisateur ne fait que des choix dans ces Combo. Des choix, par un clic. Donc, à mon sens, l'événement à retenir est l'événement Click() des comboBox.
5- Tes commandButton :
S'ils servent juste à activer les feuilles pour le bon déroulement de tes procédures événementielles des combobox, vire les ils sont devenus inutiles.
Il n'est pas, en effet, utile d'activer une feuille pour interférer avec. Un bloc With...End With remplit à merveille cette tâche.
6- ton code complet
Modifié selon toutes les indications données précédemment devient :
Option Explicit Dim Ligne As Long '********************************* événements de l'UserForm Private Sub UserForm_Initialize() With Worksheets("Licenciés") Ligne = .Columns(1).Find("*", , , , , xlPrevious).Row ComboBox1.List = .Range("A2:A" & Ligne).Value End With With Worksheets("Bloc") Ligne = .Columns(1).Find("*", , , , , xlPrevious).Row ComboBox2.List = .Range("A2:A" & Ligne).Value End With With Worksheets("Stab") Ligne = .Columns(1).Find("*", , , , , xlPrevious).Row ComboBox3.List = .Range("A2:A" & Ligne).Value Ligne = .Columns(8).Find("*", , , , , xlPrevious).Row ComboBox6.List = .Range("H2:H" & Ligne).Value End With With Worksheets("Détendeur") Ligne = .Columns(1).Find("*", , , , , xlPrevious).Row ComboBox4.List = .Range("A2:A" & Ligne).Value End With End Sub '********************************* événements des Combobox Private Sub ComboBox1_Click() If ComboBox1.Value = "" Then Exit Sub Ligne = ComboBox1.ListIndex + 2 With Worksheets("Licenciés") Me.TextBox9.Text = .Range("D" & Ligne).Value Me.TextBox3.Text = .Range("C" & Ligne).Value Me.TextBox8.Text = .Range("B" & Ligne).Value Me.TextBox5.Text = .Range("H" & Ligne).Value End With End Sub Private Sub ComboBox2_Click() If ComboBox2.Value = "" Then Exit Sub Ligne = ComboBox2.ListIndex + 2 With Worksheets("Bloc") Me.TextBox7.Text = .Range("B" & Ligne).Value Me.TextBox10.Text = .Range("E" & Ligne).Value Me.TextBox6.Text = .Range("J" & Ligne).Value End With End Sub Private Sub ComboBox3_Click() If ComboBox3.Value = "" Then Exit Sub Ligne = ComboBox3.ListIndex + 2 With Worksheets("Stab") Me.TextBox11.Text = .Range("C" & Ligne).Value End With End Sub Private Sub ComboBox4_Click() If ComboBox4.Value = "" Then Exit Sub Ligne = ComboBox4.ListIndex + 2 With Worksheets("Détendeur") Me.TextBox12.Text = .Range("D" & Ligne).Value Me.TextBox13.Text = .Range("C" & Ligne).Value Me.TextBox14.Text = .Range("F" & Ligne).Value End With End Sub
A NOTER :
> La variable Ligne est déclarée publique car elle est utile dans plusieurs Sub
> Le code n'est-il pas plus agréable à lire correctement indenté?
EDIT : je n'avais pas tenu compte, dans mes remarques, de tes entêtes de colonnes. Elles n'ont, à mon avis, rien à faire dans tes List de ComboBox car sources de plantage...
Donc, je les ai supprimées dans le code ci dessus.
D'ou les :
ComboBox1.List = .Range("A2:A" & Ligne).Value
et les :
Ligne = ComboBox4.ListIndex + 2
Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
26 févr. 2016 à 08:15
J'avoue que je reste bourricot dans certain domaines.
C'est en forgeant que devient forgeron. Mais pas sur dans le développeur excel.
Bon weekend
26 févr. 2016 à 08:21