"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
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.



A voir également:

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
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750 > 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