Erreur sur retour fonction VLOOKUP

Bonjour,

j'ai une macro dans laquelle il a un userform.

Dans ce userform, j'a placé des combobox et des textbox.

Les données à afficher dans les différents combobox et textbox me satisfont. Peut etre que quelqu'un pourrait m'expliquer comment boucler avec la fonction case mais pour l'instant mon problème est le suivant :

Les données entrées dans les box sont bien validées et inscrites sur un onglet récapitulatif appelé "règlement".

Malheureusement, j'aurai aimé voir la user form se reinitialiser après validation mais j'ai un message m'avertissant qu'il y a un probleme avec vlookup.

De plus, lorsque je regarde les donnes enregistrées sur la feuille, récapitulatif "reglement", il semble que les données "numeriques" importées depuis la userform soit en mode texte... Bizarre car dans la userform, j'ai reussi à faire un calcul à partir de prix unitaire, quantité et total.

Mes combobox sont nommées cbomachin

et les textbox, tbomachin...

si quelqu'un comprend pourquoi je bloque, je suis grave preneur. Merci de votre aide.

Jean-Louis

47jl4seb.xlsm (62.58 Ko)

Bonsoir,

C'est parce que tu vides le combo cbogroupe et ensuite tu vide cborepas, l'évenement "cborepas_Change()" se déclanche et exécute VLookUp... Mais comme cbogroupe est vide VLookUp ne trouve aucune donnée et affiche un message d'erreur.

Plusieurs solutions :

Tu gères l'erreur :

On Error Resume Next
tbopu = Application.WorksheetFunction.VLookup(cbogroupe, Sheets("Listes").Range("groupes_et_tarifs"), 2, False)
On Error Goto 0

Ou tu testes si cbogroupe est vide avant de faire le VLookUp

         If cbogroupe <> "" Then tbopu = Application.WorksheetFunction.VLookup(cbogroupe, 

Sheets("Listes").Range("groupes_et_tarifs"), 2, False)

Tu vides d'abord cborepas puis cbogroupe

cbogroupe.Value = ""
cborepas.Value = ""

Il faut aussi tester tboquantite :

 If tboquantite <> "" Then tboreglement.Value = tbopu.Value * tboquantite.Value

En fait quand tu fais des opérations avec des objets de type combobox, listbox, textbox, il faut bien paramétrer ces contrôles et faire des tests pour prévoir toutes les situations, par exemple le cas des divisions par zéro...

Bonjour Benoit

merci pour le retour,

je teste ce que tu me proposes dans la matinée mais à la simple lecture de ton retour, j'ai comme l'impression que tu as bien pris le temps de comprendre le problème.

Merci beaucoup.

Vois tu une solution pour boucler sur les differents "case de 1 à 16" quand cbogroupe change plutot que de les refaire un par un?

Bonne jounée.

Bonjour Benoit

je viens d'effectuer les tests suite à tes explications.

Cela fonctionne parfaitement.

Merci beaucoup.

Bonsoir Jeanlouisj,

Pour répondre à ta question sur l'optimisation des tes Case 1 à 16, remplace l'évènement "cbogroupe_Change()" par celui-ci :

Private Sub cbogroupe_Change()
   Dim Index As Integer, PremCol As Long, DernLig As Long, Lig As Long, Ws As Worksheet

   Set Ws = Worksheets("Listes")
   Index = cbogroupe.ListIndex
   cbopersonne.Clear
   PremCol = 6 ' Colonne F
   DernLig = Ws.UsedRange.Rows.Count ' 19 lignes normalement dans ton cas 

   For Lig = 2 To DernLig
      If Ws.Cells(Lig, PremCol + Index) <> Empty Then cbopersonne.AddItem Ws.Cells(Lig, PremCol + Index)
   Next Lig

End Sub

En résumé, Cells() est beaucoup mieux adapté pour naviguer dans les listes, les tables, les feuilles (d'une manière générale) parce qu'on navigue par le numéro de la colonne plutôt que par sa lettre... On navigue comme dans un Array à plusieurs dimensions.

On sait que la première colonne est F. F+l'index charge automatiquement la colonne souhaitée.

Quant à Ws.UsedRange, c'est un peu plus compliqué, il faut de la rigueur dans la gestion des tables et autres listes. UsedRange, c'est la plage (l'ensemble des cellules utilisées) totale utilisée de la feuille, partant de la première cellule en haut et à gauche (Ctrl+home) jusqu'à la dernière en bas à gauche (Quand tu fais Ctrl+Fin), il faut donc que la cellule A1 soit utilisée. UsedRange se fiche que des lignes ou des colonnes soient masquées, contrairement à d'autres fonctions intégrées d'Excel qui y sont sensibles. Si tu as cette rigueur là, ce n'est que du bonheur pour la gestion des bases de données.

Je me suis justement aperçu que la feuille 'Listes' comprend 330 lignes, tu peux facilement le voir en regardant ton ascenseur vertical, il est trop petit. Supprimes les lignes inutiles, enregistre le classeur et l'ascenseur va se redimensionner.

Dans la mesure du possible, évite d'utiliser des variables qui sont très proches des expressions utilisées dans Excel comme Cell, Texte... Par exemple iff, ressemble beaucoup à la fonction IIf, il peut donc avoir confusion dans la lecture du code. Et si je puis te donner un dernier conseil, quand tu déclares tes variables, saisis systématiquement au moins une lettre en majuscule, de cette manière lorsque tu saisis ton code, tu vois automatiquement si la variable est déclarée ou si tu as fait une erreur de frappe (le mot reste en minuscule).

Rechercher des sujets similaires à "erreur retour fonction vlookup"