Userform - Label contenant Vlookup en référence à une textbox

Bonjour à tous

Novice en VBA, je suis fier d'avoir pu insérer dans un formulaire sous VBA une fonction vlookup dans un label en fonction de la saisie d'une textbox

J'ai donc deux feuilles dans un classeur. La première est un tableau, sur lequel j'ai un bouton clic qui m'ouvre un formulaire userform à remplir. Lorsque je valide le formulaire, cela alimente mon tableau. Sur la seconde feuille (BDD), j'ai donc une base de données dans laquelle mon formulaire de la feuille 1 va chercher ses éléments.

Voici mon code :

'Alimentation automatique du Label en fonction de textbox

End Sub

Mais je souhaite faire évoluer cette formule de la facon suivante :

1- Si la saisie que j'opère dans ma textbox ne figure pas dans ma feuille BDD, il me renvoi un message d'erreur VBA et je passe en mode débogage ... Je préférerais une messagebox qui me demande de vérifier ma saisie dans la textbox car ce fichier est destiné à des utilisateurs qui ne doivent surtout pas fouiner dans les lignes de code !!! Il doit y avoir une solution en intégrant un truc du genre If/Then mais je séche sur la syntaxe ...

2 - Je souhaiterais sortir ma feuille BDD du classeur. En effet, cette feuille BDD sera mise à jour régulièrement et disponible sur un serveur (le même que celui qui héberge mon fichier à alimenter mais pas forcément dans le même répertoire). J'ai donc besoin qu'il soit dissocier dans un fichier seul mais cela change tout mon code plus haut n'est ce pas ... Alors comment dois je le modifier ?

Merci pour votre aide

Bonsoir,

au lieu de donner le résultat directement au Label, passez par une variable. Ensuite testez cette variable, si elle est "égale" à NoThing alors il y a erreur, et vous faites un MsgBox puis un RAZ de la TextBox avec un Set Focus.

Si la variable est "égale" à quelque chose, alors le label sera égal à la variable...

@ bientôt

LouReeD

Bonjour,

Pour la première question, essayer cette instruction

    val_cherchée = Application.VLookup(TextBox.Value, Worksheets("BDD").Range("a:d"), 4, False)
    If CVErr(val_cherchée) = CVErr(xlErrNA) Then MsgBox "Vérifiez votre saisie": Exit Sub
    Me.Label.Caption = val_cherchée

Voilà !

C'est ce que je vous proposais de faire

Merci thev

@ bientôt

LouReeD

Merci Thev pour cette proposition. Ca fonctionne.

Mais du coup, ca soulève une autre question :

Je souhaite qu'après une saisie erronée dans cette textbox, le curseur reste positionné dans cette textbox (plutôt que la tabulation l'amène sur la textbox suivante) et que la saisie précédente erronée soit effacée (en somme, tant qu'une saisie n'aboutie à aucun résultat, que la textbox reste vierge). Je suis déjà parvenu à le faire dans le passé mais je ne retrouve plus trace de la syntaxe ...

Bonjour,

Ceci devrait fonctionner (non testé)

    val_cherchée = Application.VLookup(TextBox.Value, Worksheets("BDD").Range("a:d"), 4, False)
    If CVErr(val_cherchée) = CVErr(xlErrNA) Then
        TextBox.Value = Empty: TextBox.SetFocus
        MsgBox "Vérifiez votre saisie"
        Exit Sub
    End If
    Me.Label.Caption = val_cherchée

Bonjour Thev,

Ca fonctionne parfaitement ! Merci. C'est TOP !

Il me manque plus qu'une réponse pour sortir ma feuille Base de Données (BDD) dans un autre classeur. Ca a l'air coton ... Certains me parle de la méthode Find mais, outre le fait que ça me fasse complètement revoir la syntaxe de la solution proposée plus haut, je ne comprends pas du tout comment ca fonctionne ... N'y a t il pas un moyen, comme pour RechercheV sous excel, de définir le chemin d'accès de la base de données qui alimente ma recherche ... ?

Merci par avance

Bonsoir,

Je peux vous proposer une solution. A vous de voir si elle ne vous parait pas trop difficile à mettre en œuvre.

Etape 1 : créer une liaison entre votre classeur et celui du serveur contenant la BDD

1- ouvrir les 2 classeurs

2- copier avec liaison une cellule du classeur du serveur vers une cellule de votre classeur qui ne sera jamais modifiée.

Etape 2 : au niveau du code de votre formulaire

1- à l'initialisation du formulaire, ouvrir en lecture seule le classeur du serveur à partir de la liaison créée, via une 2ème instance d'Excel pour que cette ouverture reste invisible

2- à la fermeture du formulaire, clore la 2ème instance d'Excel, ce qui fermera automatiquement le classeur du serveur.

ci-dessous exemple de code :

Dim xl As Excel.Application
Dim classeur_BDD As Workbook

Private Sub UserForm_Initialize()
    Dim liaisons()

    'création 2ème instance Excel
    Set xl = New Application
    'récupération tableau liaisons Excel
    liaisons = ThisWorkbook.LinkSources(xlExcelLinks)
    'ouverture en lecture seule et assignation du classeur contenant la BDD
    Set classeur_BDD = xl.Workbooks.Open(Filename:=liaisons(1), ReadOnly:=yes)
End Sub

Private Sub UserForm_Terminate()
    'fermeture 2ème instance Excel
    xl.Quit
End Sub

Private Sub TextBox_AfterUpdate()
    Dim val_cherchée As Variant

    val_cherchée = Application.VLookup(Me.TextBox.Value, classeur_BDD.Worksheets("BDD").Range("a:d"), 4, False)
    If Application.IsText(val_cherchée) Or IsNumeric(val_cherchée) Then Me.Label.Caption = val_cherchée: Exit Sub

    If CVErr(val_cherchée) = CVErr(xlErrNA) Then
        TextBox.Value = Empty: TextBox.SetFocus
        MsgBox "Vérifiez votre saisie"
        Exit Sub
    End If

End Sub
Rechercher des sujets similaires à "userform label contenant vlookup reference textbox"