RechercheV en VBA
Bonjour
Je me lance en VBA sur un cas concret.
Pour la petite histoire, je suis prof (de math) et je suis en train d'essayer de transférer certaines choses que je fais sur papier vers excel. Si il y a d'autre prof ici, je suis preneur de leur expérience. Je connais un peu excel et ses formules, mais je n'ai encore jamais fait de VBA.
Ma question : Comment faire l'équivalent d'un recherche verticale en VBA ?
Mon cas concret (simplifié) en pièce jointe.
Dans les feuilles 4 et 5, j'ai des listes. Devant certains nom, il y a des WAIT (ces derniers sont le résultats de tests, mais j'ai enlevé tous les test)
Sur la feuille Tableau de Bord, j'aimerais avoir que les noms de ceux qui ont un WAIT devant eux (j'ai simulé le résultat. Je sais le faire en recherV mais c'est fastidieux.
Comment faire ? j'ai fais des essais avec
'Range("C8:C30").Value = Application.VLookup("WAIT", Sheets("4").Range("C2:D31"), 2, False), mais cela ne me renvoie que des ADELYS ...
J'ai bien l'idée d'un IF THEN ELSE ... mais cela bug
Merci
Bonjour,
Tu trouveras une proposition en pièce jointe.
En retour, dis-moi si tu as besoin d'explications sur le code.
A+
Merci
J'examine cela ce soir ...
En fait, concrètement j'aurais des recherches dans 5 ou 6 feuilles différentes et des zones différentes ..
La macro sera plutôt dans une
Private Sub Worksheet_activate()
puisque je veux une mise à jour uniquement si je sélectionne la feuille et je pense faire donc 5 ou 6 petites macro, une pour chaque feuille, car les recherches ne se font pas exactement dans les même zones.
Pourrais tu me donner dans ce cas-là le code pour uniquement une recherche dans une feuille ...
Et j'examine tout ce soir ....
Merci
Voici un exemple utilisant l’évènement Activate de la feuille "4".
Note bien que tu peux éviter de créer autant de procédure que de feuilles en utilisant l'évènement SheetActivate du classeur (module Workbook). Il faudrait alors que tu définisses les plages à examiner pour chacune des feuilles concernées.
A+
Bonjour
J'avance un petit peu. Voici une partie de mon fichier excel. (il y a beaucoup d'autres éléments mais je vais les "développer" au fur et à mesure)
Je pense avoir compris comment cela fonctionne et j'ai donc fait la même chose pour une deuxième feuille "5A"... En fait il y a de 4 à 6 feuilles possibles.
Comme tu peux le voir, dans chaque feuille il y a aussi des "macro". Mon but est de faire un feuille "type" qui fonctionne complètement et que je pourrais dupliquer comme je veux...
Mais je suis preneur pour savoir comment utiliser "l'évènement SheetActivate du classeur (module Workbook)."
J'en profite pour poser d'autres questions ...
En fait dans la feuille "données", le nom de la cellule qui contient Wait est Punition_Attente. En effet, je ne sais pas encore quel est le libellé exact : WT ou WAIT ou Wait ou .... j'en sais rien...
J'essaye de faire une recherche non pas sur "Wait", mais sur le contenu de la cellule C14 ou sur Punition_Attente mais ça marche pas ...
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
J'ai trouvé : En fait le texte était mis en Majuscule
J'ai défini :
Dim Label As String
Label = Sheets("Données").[Punition_Attente].Text
et j'ai remplacé If UCase(Cel.Offset(0, 1).Value) = Label Then
par If Cel.Offset(0, 1).Value = Label Then
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
J'en profite pour te demander autre chose. J'ai découvert, que lorsque l'on faisait une mise en forme conditionnelle, le critère devait être dans la feuille active. Dans 4E et 5A, j'ai donc recopié le contenu de Punition_Attente dans une cellule à droite pour que les Wait soient en couleur rouge.. Y a t-il moyen de "programmer cela" autrement ?
Merci
Bonjour à tous,
Y a t-il moyen de "programmer cela" autrement ?
utilise le nom :
=B3=Punition_Attenteeric
Bonjour,
Mais je suis preneur pour savoir comment utiliser l'évènement SheetActivate du classeur (module Workbook)."
Dans le cas que tu présentes, la procédure est lancée lorsque la feuille "Tableau de Bord" est activée. L’utilisation de l'évènement SheetActivate du classeur n’apporterait pas d’amélioration puisque la détection porte sur une seule feuille. Elle aurait été intéressante si tu avais voulu lancer la procédure lorsque les feuilles correspondant aux classes sont activées.
Par contre, tu peux simplifier ton code en utilisant une seule procédure de traitement avec des arguments pour spécifier le nom de la feuille concernée et la colonne où sont copiées les données.
A+
eriiic a écrit :Bonjour à tous,
Y a t-il moyen de "programmer cela" autrement ?
utilise le nom :
=B3=Punition_Attenteeric
Heu, je ne vois pas ce que tu veux dire .... mais bon je vais y réfléchir ...
frangy a écrit :Bonjour,
Par contre, tu peux simplifier ton code en utilisant une seule procédure de traitement avec des arguments pour spécifier le nom de la feuille concernée et la colonne où sont copiées les données.
A+
Merci... J'ai un peu changer une partie
J'ai mis
>>>>>If Sh.Name = "4E" Or Sh.Name = "5A" Then
Mais j'aime beaucoup cette notion de variable, etc ... donc je vais en "abuser" ....
Merci pour ton aide ... Je vais continuer mes recherches .... Je suis en train de chercher à remplacer les "commentaires" par des infos bulles.
Merci pour tout
Heu, je ne vois pas ce que tu veux dire .... mais bon je vais y réfléchir .
C'est la réponse à ta question : comment faire une MFC utilisant une valeur sur une autre feuille ?
Nomme la cellule (déjà fait) et utilise son nom dans la formule de MFC qui devient :
=B3=Punition_Attente
eric
eriiic a écrit :C'est la réponse à ta question : comment faire une MFC utilisant une valeur sur une autre feuille ?
Nomme la cellule (déjà fait) et utilise son nom dans la formule de MFC qui devient :
=B3=Punition_Attente
eric
En fait, ce que je ne comprends pas, c'est pourquoi tu parles de B3. En effet, la zone de la mise en forme est B3:B61
En fait, si je fais !:
Mise en forme conditionnelle
regle de mise en surbrillance des cellules
egal à
... je rentre quoi dans la zone ?
Si je mets "=Punition_Attente" cela ne marche pas ...
En fait ce que j'aurais aimé apprendre, c'est comment le programmer en VBA, parce que je voudrais aussi programmer la mise en couleur des dates...
Si lors du double clique la date est entre le 01/05/2014 et le 01/12/2014 alors la cellule devient verte ect .. et les dates se récupérerai dans la feuille données ... ... Ainsi les colonnes AQ et AR pourraient disparaître ...
Merci
En fait ce que j'aurais aimé apprendre, c'est comment le programmer en VBA
Commencer par connaitre les fonctionnalité d'excel pour éviter vba est plus important.
Le meilleur code est celui qu'on ne fait pas.
Tu sélectionnes B3:B61 et en formule de MFC tu mets :
=B3=Punition_Attente
et rien d'autre. Pourquoi changer et ne pas tester les réponses ?
=B3=Punition_Attente te retourne VRAI ou FAUX selon le résultat du test
Met le dans une cellule et recopie vers le bas pour visualiser le résultat, en B4 il contrôlera B4 etc puisque la référence est fournie en relatif.
eric
eriiic a écrit :En fait ce que j'aurais aimé apprendre, c'est comment le programmer en VBA
Commencer par connaitre les fonctionnalité d'excel pour éviter vba est plus important.
Le meilleur code est celui qu'on ne fait pas.
Tu sélectionnes B3:B61 et en formule de MFC tu mets :
=B3=Punition_Attente
et rien d'autre. Pourquoi changer et ne pas tester les réponses ?
=B3=Punition_Attente te retourne VRAI ou FAUX selon le résultat du test
Met le dans une cellule et recopie vers le bas pour visualiser le résultat, en B4 il contrôlera B4 etc puisque la référence est fournie en relatif.
eric
Je comprends ce que tu me dis et je suis d'accords sur l'idée ...
Par contre si je rentre =B3=Punition_Attente, ce sont les cases qui ne contiennent pas Wait qui deviennent rouge ... Celles qui contient Wait ne change pas ..
Bon je vais faire dodo et je verrais cela demain ..
Merci de ta patience.
eriiic a écrit :Ben je ne sais pas.
Regarde l'exemple.
eric
Hello
Je crois que j'ai compris ....
en fait tu as choisis :
Utiliser une formule pour déterminer pour quelles cellules le format sera appliqués...
Or moi je suis dans
Appliquer une mise en forme uniquement aux cellules qui contiennent.
Là je vais dormir
Bonne nuit
frangy a écrit :Bonjour,
Par contre, tu peux simplifier ton code en utilisant une seule procédure de traitement avec des arguments pour spécifier le nom de la feuille concernée et la colonne où sont copiées les données.
Bonjour Frangy ...
Ma partie de code est devenu :
>>>>>
Private Sub Worksheet_Activate()
Dim Sh As Worksheet
Dim Col As Integer
Dim Plage_a_modifier As Range
Set Plage_a_modifier = Range("C6:G30")
Plage_a_modifier.ClearContents
For Each Sh In Worksheets
If Sh.Name = "4E" Or Sh.Name = "5A" Then
Select Case Sh.Name
Case "4E": Col = 3
Case "5A": Col = 4
End Select
Recherche_Punition_en_attente Sh.Name, Col
End If
Next Sh
End Sub
>>>>>>
Mais j'aimerais aller plus loin ... notamment pour apprendre aussi à mieux coder avec des variables.
Dans tableau de bord, en effet, il va y a voir plein d'autres choses (et même des choses auxquelles je n'ai pas pensé lol).
J'ai donc reporté le code dans une nouvelle "macro" qui s'appelle listing_punition_en_attente
Le code est écrit pour 2 classes, mais s'il y a 4 ou 5 ou 6 classes il faut que je rallonge le if et que je fasse les lignes cases correspondantes. Ce n'est pas la mort, mais je me demande si je ne pourrais pas écrire cela sous la forme d'un "tableau".. j'ai continué dans le code du fichier joint ....
Merci à toi .. ou aux autres ...
Bonjour,
Tu peux même améliorer notablement la procédure en balayant l'ensemble des feuilles de ton classeur pour déterminer quelles sont celles qui correspondent à une classe (il suffit pour cela de ne pas retenir celles qui ne correspondent pas à une classe, à savoir "Tableau de Bord" et "Données"). Le tableau de bord pourra ainsi être renseigné automatiquement, quel que soit le nombre de classes.
Note : il faut quand même que les tableaux de ces feuilles "classe" aient la même structure, ce qui semble être le cas.
A toi de dire si cette solution t'intéresse.
A+
frangy a écrit :Bonjour,
Tu peux même améliorer notablement la procédure en balayant l'ensemble des feuilles de ton classeur pour déterminer quelles sont celles qui correspondent à une classe (il suffit pour cela de ne pas retenir celles qui ne correspondent pas à une classe, à savoir "Tableau de Bord" et "Données"). Le tableau de bord pourra ainsi être renseigné automatiquement, quel que soit le nombre de classes.
Note : il faut quand même que les tableaux de ces feuilles "classe" aient la même structure, ce qui semble être le cas.
A toi de dire si cette solution t'intéresse.
A+
Hello
Non, ce n'est pas ce que je recherche. En effet, tu ne vois qu'une partie du fichier excel .. En fait, il y aura entre 15 et 20 feuilles quand je pose les questions, je supprimes tous le reste pour ne pas perturber la réflexion ...
J'ai même pensé que le nombre de classe pourrait être une cellule de la feuille "Tableau de bord"... Ainsi je n'aurais pas à rentrer dans le code ...
Merci
Bonjour,
Dans l’exemple joint, j’ai créé une plage dynamique nommée "Classes" qui correspond aux classes renseignées dans la plage C5:H5.
Le programme prenant en compte cette plage pour renseigner le tableau de bord, tu n’as pas à rentrer dans le code pour indiquer le nom ou le nombre de classes. Il suffit que tu renseignes la plage C5:H5 avec le nom des classes.
J’ai également ajouté une fonction pour vérifier l’existence de la feuille correspondant à la classe.
A+
frangy a écrit :Bonjour,
Dans l’exemple joint, j’ai créé une plage dynamique nommée "Classes" qui correspond aux classes renseignées dans la plage C5:H5.
Le programme prenant en compte cette plage pour renseigner le tableau de bord, tu n’as pas à rentrer dans le code pour indiquer le nom ou le nombre de classes. Il suffit que tu renseignes la plage C5:H5 avec le nom des classes.
J’ai également ajouté une fonction pour vérifier l’existence de la feuille correspondant à la classe.
A+
Bonjour
Merci beaucoup. J'ai récupéré la majeure partie de ton code en y ajoutant quelques petites choses (liste déroulante, etc )
J'avance petit à petit dans mon projet ... J'aurais deux petites questions:
1) Peux tu m'en dire plus sur la fonction DECALER
=DECALER('Tableau de Bord'!$C$5;;;;NBVAL('Tableau de Bord'!$C$5:$H$5))
Quel est son intérêt ? Pourquoi ne pas avoir simplement mis
=('Tableau de Bord'!$C$5:$H$5))
2) J'ai un peu de mal avec les lignes
LigneAjout = Cells(Rows.Count, Col).End(xlUp).Offset(1).Row 'détermine le numéro de la ligne où doit s'effectuer l'ajout
Cells(LigneAjout, Col) = Cellule.Offset(0, 2).Value 'effectue la copie
Merci beaucoup ...