"erreur d’exécution 13 Incompatibilité de Type" dans VBA. [Résolu/Fermé]

Signaler
-
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
-
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

Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 467
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 58212 internautes nous ont dit merci ce mois-ci

Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 467 >
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

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

AIN!!!!!! ;)
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 467 >
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

Chez nous on dit "HEIIINNN???"
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016
>
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020

Tu te trouve dans quel ville?
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 467 >
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

Nous sommes maintenant vraiment Hors Sujet.
Donc je te souhaite une bonne continuation.
A++
Messages postés
29219
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 août 2020
2 693
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.
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016
>
Messages postés
29219
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 août 2020

Tu me parle un peu Chinois Jordane. :/
Quand je suis sur l'Userform "Actif".Je suis obligé d'être sur la bonne feuille pour remplir mes combo et texbox.
"ex: Private Sub CommandButton5_Click()
Sheets("Licenciés").Select
End Sub"

Sinon je bug!
Voici la ligne qui me donne le problème.
Ligne = Application.Match(Me.ComboBox2.Value, [A:A], 0)
Messages postés
29219
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 août 2020
2 693 >
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

Bon....
On va faire plus simple...

Peux tu nous mettre à disposition un fichier Excel d'exemple contenant quelques données et tes macros ?
Tu peux les déposer sur le site cijoint.com
=> https://www.commentcamarche.net/faq/29493-utiliser-cjoint-pour-heberger-des-fichiers
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

Le PB! C'est que j'ai plein d'info perso sur ce classeur. :/
Messages postés
29219
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 août 2020
2 693 >
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

Et bien tu nous en fait une version sans les infos perso !
Vu ton niveau de connaissances ( ne serait-ce que des bases ....) du VBA ... il nous sera difficile de t'aiguiller sans savoir comment ton fichier fonctionne !
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016
>
Messages postés
29219
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 août 2020

ViliVoila! ;)
http://www.cjoint.com/c/FBzoUSnUfUt
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 467
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...
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

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
Messages postés
29219
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 août 2020
2 693 >
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016


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......
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 467 >
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

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...
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016

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
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 467
Cela dépend entres autres de tes données...

Il nous faut le classeur exemple pour continuer...
Messages postés
48
Date d'inscription
jeudi 19 décembre 2013
Statut
Membre
Dernière intervention
26 février 2016
>
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020

Il est un peu plus haut. ;)