Bonjour,
je souhaite rechercher une feuille dans un classeur excel à l'aide de VBA, en fonction du texte recherché dans combobox1 .
vous trouverez ci-joint un model.
Merci d'avance pour vos réponses
Cordialement
M.S
Bonjour,
je souhaite rechercher une feuille dans un classeur excel à l'aide de VBA, en fonction du texte recherché dans combobox1 .
vous trouverez ci-joint un model.
Merci d'avance pour vos réponses
Cordialement
M.S
Salut,
Je vais te proposer quelque chose de "plus compliqué" à mettre en place que ce qu'Eric t'a proposé, même si sa solution fonctionne très bien.
Je te la propose pour insister sur ce qui me paraît être "les bonnes pratiques" en matière d'utilisation de userform.
Ton userform initial, tel que tu l'as conçu, pose plusieurs problèmes:
- La plage qui alimente le usf est spécifiée dans les propriétés du usf. Cela veut dire que si tu la modifies (déplacement, ajout, suppression), tu devras modifier ton usf pour qu'il fonctionne correctement;
- La valeur par défaut est reprise elle aussi en "hard coding" dans les propriétés du userform. Cela veut dire que si tu renommes ta feuille (ajout d'un accent, par exemple), ton userform ne fonctionnera plus correctement et risque de lever une erreur;
- Ton userform n'est pas déchargé en fin d'utilisation, ce qui fait que c'est le dernier choix qui sera apparent dans la liste et non "fiche medical" que tu as défini par défaut en cas d'appels successifs du userform;
- Tes contrôles ne sont pas nommés de façon explicite.
Personnellement, je conçois le usf comme une "fonction" un peu spéciale qui retourne une valeur (comme n'importe quelle fonction) sauf que cette valeur est choisie par l'utilisateur. Il convient donc de le créer pour qu'il soit effectivement "cette fonction". Normalement, le userform "ne fait rien"... Ce n'es pas à lui qu'incombe la responsabilité d'activer la feuille. Sa seule tâche consiste à permettre la sélection d'une feuille et d'éventuellement, tester qu'une feuille a été sélectionnée. Le reste (alimentation de la liste, valeur par défaut de la liste déroulante, activation de la feuille choisie) n'est pas son affaire. Ce n'est pas son rôle.
C'est à une procédure qu'il convient de passer les bonnes valeurs au usf, puis, si les données saisies dans le userform sont valides, de récupérer le choix fait par l'utilisateur et d'activer la feuille souhaitée.
Comme vu aux points 1 et 2 ci-dessus, ton usf est fortement couplé à ton appli. Une modification de la liste des feuilles, du nom d'une des feuilles, le déplacement de la liste ailleurs fait capoter ton usf.
En premier lieu, on supprime la valeur de la RowSource ainsi que la valeur de Text du combobox.
Ensuite, on nomme les contrôles: cboSheetName pour la liste déroulante et btnValidate pour le bouton de commande.
On nomme une plage qui contient les noms des feuilles à sélectionner. Mieux, on travaille avec un tableau structuré.
Ensuite, on crée le code du userform
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Option Explicit Public Choice As String Private Sub btnValidate_Click() If DataAreOk() Then Choice = "Validate" Me.Hide Else MsgBox "Vous devez choisir une feuille", vbExclamation, "Mon application" End If End Sub Function DataAreOk() As Boolean If cboSheetName <> "" Then DataAreOk = True End Function
Ce code est donc très simple et en fait, "ne fait rien". Si on décortique, on voit d'abord Option Excplicit: Cela veut dire que tu seras obligé de déclarer toute variable utilisée dans le code.
Ensuite, nous déclarons une variable Choice qui contiendra l'action décidée par l'utilisateur (clic sur ok).
Notre bouton btnValidate va permettre de tester que les saisies sont valides, grâce à la fonction DataAreOk. Tant que DataAreOk renvoie False, on ne peut pas valider (mais on peut fermer le usf avec la croix). Si Ok, Choice prendra la valeur Validate et le usf sera masqué. A ce moment-là, la main sera rendue au code qui a ouvert le userform.
On remarque donc que le usf "ne fait rien". Il ne sélectionne pas la feuille. Il affiche les choix possibles, détermine si on a choisi une feuille ou pas et Choice contiendra Validate si tout est ok et que le code appelant peut poursuivre sa mission.
Voyons donc maintenant le code appelant (la macro qui sera déclenchée par clic sur le bouton situé sur la feuille mm).
La macro ActivateSheet, lié au bouton de la feuille de calcul va charger le usf et lui passer la liste des valeurs à ajouter. Ces valeurs sont reprises dans une plage nommée, de sorte que tu peux la faire grandir, la déplacer, etc, sans devoir modifier ton code. Idéalement, il faut utiliser un tableau structuré qui est vraiment l'outil à utiliser pour cela. Il n'y a alors rien à faire côté code et structure du classeur lors de l'ajout de données dans la liste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Option Explicit Sub ActivateSheet() With usfActivateSheet .cboSheetName.List = Range("ListeFeuilles").Value .cboSheetName.Value = "fiche medical" .Show If .Choice = "Validate" Then Worksheets(.cboSheetName.Value).Activate End With Unload usfActivateSheet End Sub
Le code passe ensuite la valeur à afficher par défaut dans la liste déroulante du usf.
Ensuite, le usf est affiché.
Lorsque le usf est masqué, on récupère la valeur de "Choice". Si le usf a été masqué par clic sur btnValidate, Choice vaudra "Validate" et on pourra activer la feuille. Si l'utilisateur a cliqué sur la croix pour "fermer" le usf, il est alors déchargé. Dès lors, Choice vaut "" (c'est un peu plus compliqué que cela à expliquer, mais dans les faits, c'est ce qui se produit).
[EDIT]
Et je te parlais de fonction tout à l'heure. Le code donné ci-dessus est limité dans le fait que la feuille est forcément activée en fin de parcours. Mais avec peu de transformations, tu crées une fonction générique à stocker dans tes outils Excel dont le but est simplement de récupérer non plus le nom choisi, mais la feuille, le code qui appelle la fonction en faisant ce qu'il doit en faire. Ainsi, ta fonction ne sert plus uniquement à activer une feuille, mais tu peux l'utiliser pour tout code ayant besoin d'une feuille définie par l'utilisateur en cours de macro (en ajoutant un peu de sécurité pour éviter certains plantages). Bien sécurisée, tu la places dans ta libraire Tools...
Par exemple, pour activer la feuille, tu utilises la fonction comme ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Function GetSheetByUser(NameList As Variant, Optional Default As String) As Object With usfActivateSheet .cboSheetName.List = NameList .cboSheetName.Value = Default .Show If .Choice = "Validate" Then Set GetSheetByUser = Sheets(.cboSheetName.Value) End With Unload usfActivateSheet End Function
[/EDIT]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Sub ActivateSheet() Dim sh As Object Set sh = GetSheetByUser(Range("ListeFeuilles").Value, "h2") If Not sh Is Nothing Then sh.Activate End Sub
Tout ça pour ça? Oui. Si tu prends l'habitude de coder de cette façon en respectant ce que je viens d'expliquer, tu pourras évoluer dans ton code beaucoup plus facilement. Et en systématisant cette façon de fonctionner avec les userforms, tu développeras des "applications" de façon beaucoup plus rapide et évolutive, en plus de te créer des briques logicielles réutilisables dans d'autres contextes... Car je gage que ton exemple n'illustre que le commencement de quelque chose de plus costaud et ambitieux.
Bon travail, quel que soit ton choix
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Bonjour,
Un grand merci à Pierre Fauconnier, pour la qualité de son intervention et la clarté de ses explications.
Avec une distinction particulière pour la phrase ci-dessous:
CordialementBon travail, quel que soit ton choix.
On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
Confucius
Un grand Merci Pierre Fauconnier, est ce que vous avez un tuto qui explique tout ça?
Cordialement
Je suis dessus pour le moment (il pleut dehors, donc rédiger un tuto dvp est une bonne occupation )
Mais tu as déjà de la très bonne lecture avec le tuto d'Arkham sur le sujet...
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager