Erreur dans code - propriété Match ou erreur 2042

pnlop

XLDnaute Occasionnel
Bonjour le Forum,

Voici le code qui me pose parfois problème...

Code:
Private Sub ListBox1_Change()

With Sheets("articles")
    If ListBox1.ListIndex = -1 Then Exit Sub
    lig = Application.WorksheetFunction.Match(ListBox1.Value, .Range("B1:B65536"), 0)
    TextBox6 = .Cells(lig, 2) 'place dans textbox6 l'art qui figure en col 1 de la feuille "articles"
    TextBox7 = .Cells(lig, 3)
    TextBox8 = .Cells(lig, 4)
    TextBox9 = .Cells(lig, 5)
    TextBox10 = .Cells(lig, 6)
    

End With

End Sub

Explication du code pour comprendre...: Ma listBox1 est alimentée en fonction du choix fait dans la Combobox1 (jusque là, tout ok!) Puis, selon le choix dans ma ListBox1, les données correspondantes (dans ma feuille "articles") viennent s'afficher dans des textbox. (là aussi, tout ok!)
MAIS! bien sûr, sinon je serais pas là!!!
Parfois, pour certains choix dans la Combobox1, lorsque je sélectionne une ligne dans ma ListBox1, le message d'erreur suivant apparaît :Erreur d'exécution 1004 - impossible de lire la propriété Match de la classe WorksheetFunction
J'ai fait quelque recherche sur le forum, ce qui m'a amené à enlever "WorksheetFunction" dans mon code...
Bien. MAIS l'erreur s'est déplacée! le code se bloque du coup au moment d'alimenter le 1er textBox avec ce message:Erreur d'exécution 13 - incompatibilité de type et lorsque je met le curseur sur la ligne de code, il me met lig=erreur 2042

Je me demande si cela n'a pas à voir avec ma "base de donnée" qui alimente a) ma listBox puis b) mes textbox...
Les informations sont dans la feuille "articles": colonne A = fournisseurs (qui permet le choix puis le tri dans la combobox) - colonne B = n° d'articles (ces n° se retrouvent dans la listBox1, puis dans le textBox) Colonne C à F, données qui seront transcrites dans les textBox suivant selon chois dans listBox1...
MAis, dans ma colonne B qui contient les ° d'articles, je dois préciser qu'ils ne sont pas tous pareils, (chaque fournisseur a ses propres n° d'articles!!!) donc parfois il n'y a que des chiffres (par ex. 701600), parfois ce sont des lettres (par ex. BPWE), parfois lettre+chiffre (par ex. OIU10) parfois il y a des point (par ex. 800.100.05) !!!

D'où mon interrogation... Mais je n'arrive pas à faire le lien entre les erreurs et fini par croire qu'il n'y en a pas...
Une idée???
Merci!
 
G

Guest

Guest
Re : Erreur dans code - propriété Match ou erreur 2042

Re,

Utiliser simplement Application.Match 'Beaucoup de fonctions de bases de feuilles de calcul sont directement accessibles par l'objet Application

Le résultat doit être contenu dans une variable de Type VARIANT car c'est une fonction de feuille qui peut retournée une valeur d'erreur ( ex: la valeur d'erreur correspondant à #NA dans les feuilles de calcul): Dim Lig as Variant

Pour savoir si la fonction a retourné un resultat correct: If Not IsError(Lig)

A+
 

pnlop

XLDnaute Occasionnel
Re : Erreur dans code - propriété Match ou erreur 2042

Bonjour Hasco,
J'ai modifier le code et utiliser simplement Application.Match ce qui m'ôte l'erreur y relative.
J'ai ajouter Dim Lig as Variant. Je ne sais pas oû mettre "If Not IsError(Lig)" donc pas mis et fait essai. toujours la même erreur qui revient... incompatibilité de type...??
Est ce c'est parcequ'il n'arrive pas à alimenter le textbox avec cette donnée précise? Pour la majorité des articles, cela fonctionne... Il me semble (en faisant des pointages, car il y a environ 2000 articles...) que ça bug lorsque le n°d'art. n'est composé que de chiffres, sans point ou autre... Donc ma réflexion me dirige vers le textbox qui n'accepte pas de recevoir des chiffres tout simples..??
 
G

Guest

Guest
Re : Erreur dans code - propriété Match ou erreur 2042

Re,

If Not IsError(Lig)

Est à mettre après la ligne Application.Match et avant la ré-utilisation de la variable Lig

Lig= Application.Match(........)
Code:
If Not IsError(Lig) Then 
TextBox6 = .Cells(lig, 2) 'place dans textbox6 l'art qui figure en col 1 de la feuille "articles"
TextBox7 = .Cells(lig, 3)
TextBox8 = .Cells(lig, 4)
TextBox9 = .Cells(lig, 5)
TextBox10 = .Cells(lig, 6)
Else
MsgBox ListBox1.Value & " non trouvée dans la plage de cellule"
End if



A+
 

pnlop

XLDnaute Occasionnel
Re : Erreur dans code - propriété Match ou erreur 2042

Ok Hasco, la première étape est faite et fonctionne, étant donné que ton message " non trouvée dans la plage de cellule"
apparaît quand je sélectionne un de ces fameux articles composés qu'avec des chiffres...
C'est donc dans ma feuille que je dois intervenir? mais de quelle manière? je ne peux pas changer ces n°...
 
G

Guest

Guest
Re : Erreur dans code - propriété Match ou erreur 2042

re,

Joint nous un exemple sur un fichier avec des données anonymisées. Sinon nous allons tourner en rond.

D'autant que tu n'as peut-être pas besoin de Application.Match pour retrouver le numéro de ligne si tes codes articles de la ListBox sont dans le même ordre d'apparition que dans la feuille.

A+
 
Dernière modification par un modérateur:

pnlop

XLDnaute Occasionnel
Re : Erreur dans code - propriété Match ou erreur 2042

Voilà le fichier quelque peu modifier dans ses données, mais les canevas restent exactement les mêmes.

Donc le problème ce situe dans l'UserForm1... pour visualiser l'erreur, lancer le bouton "nouvelle commande" en feuille "accueil" - dans l'UserForm qui s'affiche, sélectionner RFX - valider - Dans le nouvel UserForm (1) choisir n'importe quel article dans la ListBox de gauche...

Ce que je comprend pas, c'est que si je choisi via la listbox de droite, càd par désignation (en principe mots normaux!) pas de problème...???
 

Pièces jointes

  • exemple pnlop.xlsm
    266.8 KB · Affichages: 99
  • exemple pnlop.xlsm
    266.8 KB · Affichages: 291
  • exemple pnlop.xlsm
    266.8 KB · Affichages: 245
G

Guest

Guest
Re : Erreur dans code - propriété Match ou erreur 2042

Re,


Trop d'erreurs dans tes codes empêchent de valider les nouveaux changements.
Mets 'Option Explicit' en haut de tes modules, le moteur vb te dira les erreurs de contrôles manquants et ou variables non déclarées.

Fais le ménage dans tes contrôles, ils en manquent.

Avant de lancer tes modifications: menu Débogage/compiler le projet VBA

Et tant que la compilation te signale une erreur, essaie d'apporter les corrections idoines.

Sinon l'idée pour résoudre ton problème:

Sélectionner ListBox1 en mode design
modifier les propriétés suivantes pour rajouter une colonne cachée qui contiendra le n° de ligne:

ColumnCount: 2
ColumnWidth: 0; 'En validant cela se transformera en "0 pt"
BoundColumn: 1

Puis charger les valeurs comme suit:

Code:
For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row
     If .Cells(i, 1).Value = Me.ComboBox1.Value Then
         ListBox1.AddItem .Cells(i, 2).Row
         ListBox1.List(ListBox1.ListCount - 1, 1) = .Cells(i, 2).Value
     End If
 Next

Puis ton évènement Change deviendra:

Code:
Private Sub ListBox1_Change()
With Sheets("articles")
    If ListBox1.ListIndex = -1 Then Exit Sub
    
    Dim Lig As Long
    
    
    Lig = ListBox1.Value
    TextBox6 = .Cells(Lig, 2) 'place dans textbox6 l'art qui figure en col 1 de la feuille "articles"
    TextBox7 = .Cells(Lig, 3)
    TextBox8 = .Cells(Lig, 4)
    TextBox9 = .Cells(Lig, 5)
    TextBox10 = .Cells(Lig, 6)
    
End With
End Sub

A+
 
Dernière modification par un modérateur:

pnlop

XLDnaute Occasionnel
Re : Erreur dans code - propriété Match ou erreur 2042

Chapeau bas, ça fonctionne tip top. Juste dû ajouter l'objet (UserForm1) devant ListBox1, vu que la Combo n'est pas dans le même UF! Mais ça, j'y arrive!!!
Donc top. MAIS... j'ai pas très bien saisi l'utilité de la 2ème colonne dans la ListBox...?! Ce serait le bonus de comprendre!:p
Encore Merci Hasco!
 
G

Guest

Guest
Re : Erreur dans code - propriété Match ou erreur 2042

Re,

La deuxième colonne est une colonne cachée qui contient le numéro de ligne de l'article idoine.

Regarde l'aide excel pour les propriétés concernées. ColumnCount: nombre de colonnes, BoundColumn: colonne qui contient la valeur renvoyée par la listBox (pas forcément celle de la première colonne), ColumnWidth: chaine contenant les largeurs des colonnes; "0 pt" la largeur de la première aura 0 point (cachée) et la colonne 2 prendra la largeur restante.

A+



A+
 

Discussions similaires

Réponses
8
Affichages
355

Statistiques des forums

Discussions
311 741
Messages
2 082 055
Membres
101 882
dernier inscrit
XaK_