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

20tips-recherv.zip (10.95 Ko)

Bonjour,

Tu trouveras une proposition en pièce jointe.

En retour, dis-moi si tu as besoin d'explications sur le code.

A+

43tips-recherv.zip (18.68 Ko)

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_Attente

eric

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_Attente

eric

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.

Ben je ne sais pas.

Regarde l'exemple.

eric

11classeur3.zip (31.30 Ko)
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

Merci

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 ...

Rechercher des sujets similaires à "recherchev vba"