"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
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
- 26 févr. 2016 à 14:45
Bonjour,
HELP!!!!!!!!
Je craque sur "erreur d’exécution 13 Incompatibilité de Type" dans VBA.
Je trouve ça bizarre que d'autres ComboBox_Change fonctionnent. Mais celui-ci me donne cette erreur.
GRRRRRR!
Merci d'avance
Biloute!
Private Sub ComboBox1_Change()
    Dim Ligne1 As Long
  Ligne = Application.Match(Me.ComboBox1.Value, [A:A], 0)
    Me.TextBox9.Text = Application.Index([D:D], Ligne, 1)
    Me.TextBox3.Text = Application.Index([C:C], Ligne, 1)
    Me.TextBox8.Text = Application.Index([B:B], Ligne, 1)
    Me.TextBox5.Text = Application.Index([H:H], Ligne, 1)
End Sub

Private Sub ComboBox2_Change()
Dim Ligne1 As Long
Ligne = Application.Match(Me.ComboBox2.Value, [A:A], 0)
Me.TextBox7.Text = Application.Index([B:B], Ligne, 1)
Me.TextBox10.Text = Application.Index([E:E], Ligne, 1)
Me.TextBox6.Text = Application.Index([J:J], Ligne, 1)
End Sub

Private Sub ComboBox3_Change()
Dim Ligne1 As Long
Ligne = Application.Match(Me.ComboBox3.Value, [A:A], 0)
Me.TextBox11.Text = Application.Index([C:C], Ligne, 1)
End Sub


Private Sub ComboBox4_Change()
Dim Ligne1 As Long
Ligne = Application.Match(Me.ComboBox4.Value, [A:A], 0)
Me.TextBox12.Text = Application.Index([D:D], Ligne, 1)
Me.TextBox13.Text = Application.Index([C:C], Ligne, 1)
Me.TextBox14.Text = Application.Index([F:F], Ligne, 1)
End Sub

Private Sub CommandButton8_Click()
Sheets("Stab").Select
End Sub


Private Sub CommandButton9_Click()
Sheets("Détendeur").Select
End Sub


Private Sub CommandButton7_Click()
Sheets("Bloc").Select
End Sub


Private Sub CommandButton4_Click()
Sheets("Gestion").Select
End Sub

Private Sub CommandButton5_Click()
Sheets("Licenciés").Select
End Sub



Private Sub UserForm_Initialize()
ComboBox1.List = Worksheets("Licenciés").Range("A1:A400").Value
ComboBox2.List = Worksheets("Bloc").Range("A1:A400").Value
ComboBox3.List = Worksheets("Stab").Range("A1:A400").Value
ComboBox6.List = Worksheets("Stab").Range("H1:H400").Value
ComboBox4.List = Worksheets("Détendeur").Range("A1:A400").Value
End Sub

 


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.



4 réponses

pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 700
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 :
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
1
Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

26 févr. 2016 à 08:15
Grand Merci Pijaku & Jordane.
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
0
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 700 > Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

26 févr. 2016 à 08:21
Bon week end à toi également le "Ch'ti savoyard"...
0
Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

26 févr. 2016 à 14:23
AIN!!!!!! ;)
0
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 700 > Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

26 févr. 2016 à 14:27
Chez nous on dit "HEIIINNN???"
0
Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016
> pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021

26 févr. 2016 à 14:32
Tu te trouve dans quel ville?
0
jordane45
Messages postés
35765
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
30 juin 2022
4 200
25 févr. 2016 à 13:35
Bonjour,


Je trouve ça bizarre que d'autres ComboBox_Change fonctionnent. Mais celui-ci me donne cette erreur.

...heu... celui-ci dis tu... mais... c'est LEQUEL ?

Sur quelle ligne te marque t'il l'erreur ?

Que vaut ta variable Ligne quand tu as cette erreur.
0
Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

Modifié par jordane45 le 25/02/2016 à 13:53
OUPS! Sorry
Private Sub ComboBox2_Change() 
Dim Ligne1 As Long 
Ligne = Application.Match(Me.ComboBox2.Value, [A:A], 0) 
Me.TextBox7.Text = Application.Index([B:B], Ligne, 1) 
Me.TextBox10.Text = Application.Index([E:E], Ligne, 1) 
Me.TextBox6.Text = Application.Index([J:J], Ligne, 1) 
End Sub


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.
0
jordane45
Messages postés
35765
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
30 juin 2022
4 200 > Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

25 févr. 2016 à 13:55
Première chose qui me "choque"...
Tu déclares Ligne1 ... mais ensuite dans ton code tu utilises Ligne....

Ensuite... tu ne m'as pas répondu quant à la valeur de ta variable Ligne lorsque tu rencontres l'erreur....
Pourrais tu également nous préciser sur quelle ligne de code l'erreur apparait ?
0
Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016
> jordane45
Messages postés
35765
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
30 juin 2022

25 févr. 2016 à 13:57
Me.TextBox7.Text = Application.Index([B:B], Ligne, 1)
0
jordane45
Messages postés
35765
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
30 juin 2022
4 200 > Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

25 févr. 2016 à 14:01
1 - **** Attention ****
Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code


2 - Tu ne m'as toujours pas répondu concernant la valeur de ta variable au moment où tu rencontres l'erreur !
0
Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

25 févr. 2016 à 14:22
Pas sur de comprendre "valeur de ta variable". J'ai quand même omis que j'y connais pas grand chose. :(
0
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 700
25 févr. 2016 à 15:51
Bonjour tous les deux,

Quand je suis sur l'Userform "Actif".Je suis obligé d'être sur la bonne feuille pour remplir mes combo et texbox.
Non.
Regarde du côté des blocs With End With...
Exemple :
Private Sub ComboBox2_Change() 
Dim Ligne As Long 
With Sheets("Licenciés")
    Ligne = Application.Match(Me.ComboBox2.Value, .[A:A], 0) 

    'Affichage de la valeur de Ligne
    msgbox "Ligne = "& Ligne

    Me.TextBox7.Text = Application.Index(.[B:B], Ligne, 1) 
    Me.TextBox10.Text = Application.Index(.[E:E], Ligne, 1) 
    Me.TextBox6.Text = Application.Index(.[J:J], Ligne, 1) 
End With
End Sub

A noter, dans ce code, outre le bloc With End With référençant la feuille, les points devant tes "range". Ils servent à indiquer que ces plages de cellules font partie de l'objet WorkSheet (feuille) référencé dans le With...
0
Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

Modifié par pijaku le 25/02/2016 à 17:49
Salut Pijaku
Le pb reste le même. Explique moi le truc: Pourquoi les autres combo fonctionnent-ils?
Private Sub ComboBox2_Change()
Dim Ligne As Long
With Sheets("Bloc")
Ligne = Application.Match(Me.ComboBox2.Value, [A:A], 0)

'Affichage de la valeur de Ligne
MsgBox "Ligne = " & Ligne

Me.TextBox7.Text = Application.Index([B:B], Ligne, 1)
Me.TextBox10.Text = Application.Index([E:E], Ligne, 1)
Me.TextBox6.Text = Application.Index([J:J], Ligne, 1)
End With
End Sub
0
jordane45
Messages postés
35765
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
30 juin 2022
4 200 > Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

25 févr. 2016 à 16:17

le pb reste le même

En même temps... tu n'as pas correctement recopié le code donné par Pika !
Toi tu as écris :
Ligne = Application.Match(Me.ComboBox2.Value, [A:A], 0)

Et lui avait mis :

Ligne = Application.Match(Me.ComboBox2.Value, .[A:A], 0) 

....tu as oublié le POINT devant la plage de cellules......
0
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 700 > Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

25 févr. 2016 à 16:28
1- je n'aime pas utiliser [A:A]. C'est un raccourci vers la fonction excel EVALUATE, de mémoire.

2- tu cibles une colonne entière au lieu de ne cibler que la partie contenant des données

Pourquoi les autres combo fonctionnent-ils?
Seuls toi et ton fichier pouvaient répondre à la question : pourquoi EVALUATE("A:A") (équivalant à [A:A]) ne fonctionne pas?
Cela dépend entres autres de tes données...
ComboBox2 contient une valeur stockée sous un type String (chaine de caratère). Si dans ta colonne A tu as des nombres, et que Combobox2 te renvoie également un nombre, celui-ci sera stocké sous type String.

3- je t'ai parlé, dans ma réponse précédente, de points devant tes plages. Ils sont ou dans ton code?

4- Essaie ceci avec la bonne feuille dans le With:
Private Sub ComboBox2_Change() 
Dim Ligne As Long 
With Sheets("Bloc") 
    Ligne = Application.Match(Me.ComboBox2.Value, .Range("A1:A100"), 0) 

    'Affichage de la valeur de Ligne 
    MsgBox "Ligne = " & Ligne 

    Me.TextBox7.Text = Application.Index( .Range("B1:B100"),  Ligne, 1) 
    Me.TextBox10.Text = Application.Index( .Range("E1:E100"), Ligne, 1) 
    Me.TextBox6.Text = Application.Index( .Range("J1:J100"), Ligne, 1) 
End With 
End Sub


5- tu as fait un effort pour mettre les balises code, mais ce n'est pas suffisant...
Il convient d'entourer la totalité de ton code, pas une seule ligne...
0
Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

Modifié par pijaku le 25/02/2016 à 17:49
Je suis perdu!! Toujours la même erreur 13.
Je m'en vais de se pas m'ouvrir une bière. ;)

Private Sub ComboBox2_Change()
Dim Ligne As Long
With Sheets("Bloc")
    Ligne = Application.Match(Me.ComboBox2.Value, .Range("A1:A100"), 0)

    'Affichage de la valeur de Ligne
    MsgBox "Ligne = " & Ligne

    Me.TextBox7.Text = Application.Index(.Range("B1:B100"), Ligne, 1)
    Me.TextBox10.Text = Application.Index(.Range("E1:E100"), Ligne, 1)
    Me.TextBox6.Text = Application.Index(.Range("J1:J100"), Ligne, 1)
End With
End Sub
0
pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 700
25 févr. 2016 à 17:48
Cela dépend entres autres de tes données...

Il nous faut le classeur exemple pour continuer...
0
Chti 01
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016
> pijaku
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021

25 févr. 2016 à 17:55
Il est un peu plus haut. ;)
0