VBA : recherche valeur par combobox ET masquer colonnes [Résolu/Fermé]

Signaler
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
-
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
-
Bonsoir à toutes et tous !
Je viens vers vous car je bloque complètement depuis toute la journée malgré mes recherches, ça dépasse mes compétentes d'apprenti VBA ....

J'ai un tableau, je cherche plusieurs choses :
- dans les lignes B4 à LX4 (idem pour B6 à LX6 et B8 à LX8) a chercher une valeur prise depuis une combobox (cliquer sur le bouton AFFICHER > ce qui lance la macro rechercherEquipe (Valeur = A ou B ou C ou D ou E))
- ne garder d'afficher QUE les colonnes où la valeur est détecter

Donc admettons que je cherche à savoir ce qu'à fait l'équipe A, ça recherche dans les lignes B4 à LX4, B6 à LX6 et B8 à LX8 et si ça trouve l'équipe A ça affiche la colonne jusqu'à ne plus rien trouver.
Le bouton TERMINE affiche toutes les colonnes masquées.

Je bloque déjà sur la fonction find .... vous verrez un code qui ne fonctionne pas ...

Merci pour votre aide !!!

https://www.cjoint.com/?DDzbOgMkysj

Joko

14 réponses

Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
15
Salut à toutes et tous !
A nouveau dans mes recherches, je progresse un peu mais je n'arrive pas trop à comprendre le résultat. Partie de code composé de ce que j'ai trouvé sur le net et mis pour mon besoin. Le résultat est 3. Je ne sais pas si je travail dans la bonne direction mais au moins on a un début.


Sub rechercherEquipe()

Dim equipe As Variant
Dim recherche As Range
equipe = UserForm1.ComboBox1.Value
Set recherche = Range("B4:LX4").Find(equipe, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=True)
If recherche Is Nothing Then
MsgBox ("Equipe non trouvée (ou non renseignée).")
Else
MsgBox ("Equipe trouvé en colonne") & recherche.Column
End If


Unload UserForm1
End Sub


Merci pour votre aide (si elle arrive ?? :p)
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
15
Hello petit UP au passage ...
Je bloque toujours sur la recherche et la phase où il faut cacher les colonnes ou afficher les colonnes.
Merci !

Sub rechercherEquipe()

Dim equipe As Variant
Dim recherche As Range
equipe = UserForm1.ComboBox1.Value

Set recherche = Range("B5:LX5").Find(equipe, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=True)

If recherche Is Nothing Then
MsgBox ("Equipe non trouvée (ou non renseignée).")
Else
recherche.Columns.Select
End If

Unload UserForm1
End Sub
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
15
bonsoir,
je poursuis d'alimenter mon sujet .... j'espère qu'il y aura des réponses un jour ...?
J'ai trouvé un code sur le net que j'ai mis à mon problème (à priori assez identique , pas de l'écriture mais dans le résultat qui ne me permet pas d'avancer mais légèrement de progresser et de cibler le problème ...). J'ai juste fais pour afficher dans un msgbox le résultat de la recherche.
Or je m'aperçois que la recherche sur la ligne complète s'arrête dès qu'il a trouvé 1 fois la valeur de la combobox, s'il y en a d'autres il ne les cherche pas .... des idées pour poursuivre la recherche au range défini ???

Voici le code :


Sub rechercherEquipe()
'déclaration des variables :
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String

'********* à adapter ***********
'affectation de valeurs aux variables :
'on cherche le mot "Trouve"
''REMPLACER''Valeur_Cherchee = "Trouve"
Valeur_Cherchee = UserForm1.ComboBox1.Value
'dans la première colonne de la feuille active
''REMPLACER''Set PlageDeRecherche = ActiveSheet.Columns(1)
Set PlageDeRecherche = Sheets("Année").Range("B5:LX5")
'*******************************

'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)

'traitement de l'erreur possible : Si on ne trouve rien :
If Trouve Is Nothing Then
'ici, traitement pour le cas où la valeur n'est pas trouvée
AdresseTrouvee = Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address
Else
'ici, traitement pour le cas où la valeur est trouvée
AdresseTrouvee = Trouve.Address
End If
MsgBox AdresseTrouvee
'AdresseTrouvee.Columns.Select
'vidage des variables
Set PlageDeRecherche = Nothing
Set Trouve = Nothing
End Sub

Voici le fichier :
https://www.cjoint.com/c/DDzxdcsXzwQ

Merci
Messages postés
15609
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 février 2021
1 460
Bonjour,


votre fichier modifie pour recherche multiples:

https://www.cjoint.com/c/DDAjbl2a0bi

code qui m'a servi de reference:

https://www.commentcamarche.net/faq/18696-vba-recherche-find-avec-retour-multiple
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
15
Bonjour,
Il en vallait la peine d'attendre le résultat.
Un énorme merci, j'avais bien été sur cette page, mais comme je disais, ça dépassait un peu beaucoup mes compétences. J'avais des erreurs que je ne comprenais pas ... débutant ! ;)
Encore merci je vais poursuivre mon fichier cet après midi, ça m'a donné un coup de boost.
Si à l'occasion tu peux m'expliquer quelques petites choses ....
> je ne comprends pas où tu mets la plage de recherche voulue ?! idem pour feuille ....
> qu'est ce qu'un xla ?
J'en aurais d'autres comme la fonction function mais là c'est de la documentation que je dois faire .... m'enfin !!

M E R C I
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
15
Bon je confirme bien ... ne rien comprendre au code si tu pouvais m'expliquer ?
> module public ?
> je ne trouve pas la phase où s'il ne trouve pas l'équipe il fait le msgbox
> idem s'il trouve ....
> déclarer les plages (oui car là je dois faire pareil pour B7:LX7 et B9:LX9), le nom de la feuille, du classeur ...
>> du coup je ne peux pas poursuivre ... Eh oui je cherche à cacher les colonnes dont l'équipe ne correspond pas à la recherche et ne laisser que l'équipe recherchée ...

merci pour les explications futures ...!!!!
Messages postés
15609
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 février 2021
1 460
Re,

> je ne trouve pas la phase où s'il ne trouve pas l'équipe il fait le msgbox----> Module1: Sub rechercherEquipe() (comme avant)

du coup je ne peux pas poursuivre ... Pourquoi pas !!!!

- ne garder d'afficher QUE les colonnes où la valeur est détecter Petit probleme, je ne saisie pas la chose, si E5=A et E7=B, equipe recherchee B

plage B5:LX5------>Colonne E sera cachee puisque A

plage B7:LX7-------> Comment faire pour afficher E7=B

A+
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
15
Ouiiiiiii j'ai trouvé ! j'ai dû tout reprendre et comprendre que le code est "coupé" en deux partie, une avec un sub et la seconde avec une function .... je me documentais sur ces parties en ayant enfin trouvé pour déterminer le range ou le reste puis coup de fatigue (effet des postes et du travail de nuit donc sieste car au boulot ce soir .....).

L'idée finale est simplement de chercher à voir ce que l'équipe recherchée à fait.
Donc si je veux voir l'équipe B, ça recherche dans les 3 lignes et si B apparait la colonne entière s'affiche, sinon les colonnes se cachent.
Ah mais en te marquant ça je me rends compte qu'on va se confronter au problème que si dans la ligne 5 il y a B ça voudra rester afficher, mais qu'en ligne 7 et 9 ça sera forcément pas B, donc ça voudra s'effacer ....

Aïe aïe aïe ...
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
15
je pense qu'en fait il faut faire une recherche par colonne et donc se dire que s'il trouve l'équipe dans la colonne il l'affiche, sinon il la masque ...
je vais me pencher sur la question cette nuit ...
On doit donc agir sur le range pour le remplacer par columns ou quelque chose dans le genre ...
merci
Messages postés
15609
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 février 2021
1 460
Re,

C'est vous qui voyez.
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
15
RE !
Bon en fait modification du tableau ... donc mise à jour du code que vous m'aviez fait, jusque là rien d'extraordinaire, je tente de comprendre la manière dont c'est codé mais en vain ....
Je cherche à supprimer le msgbox et mettre à la place que si l'équipe recherchée est trouvée elle affiche la colonne entière sinon si ce n'est pas trouvé ça cache la colonne entière.
Nouveau fichier : https://www.cjoint.com/?DDAx4nXkAAa
Merci pour l'aide !
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
15
Hello !
Peu à peu en train de comprendre comment ce code est fait, je suis arrivé à modifier deux petites choses pour tenter d'arriver au final : cacher les colonnes dont la recherche ne correspond pas.
Par contre dans un premier temps pour arriver à mes fins, je tente de cacher la colonne recherchée, mais si vous trouvez comment cacher celles qu'on ne recherche pas, tant mieux !!!!!
Cependant ça plante après le 1: (voir commentaires) ... si explications !!

Merci !



Sub rechercherEquipe()
'déclaration des variables :
Dim Trouve As Integer, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤ modif recherche multiples
Dim Tb() 'Adresse(s) de retour si trouvee(s)
Dim i As Integer

'affectation de valeurs aux variables :
Valeur_Cherchee = UserForm1.ComboBox1.Value
Set PlageDeRecherche = Sheets("Année").Range("B5:LX5")

'appelle de la fonction recherche multiples
Trouve = RechFind(Valeur_Cherchee, ThisWorkbook.Name, "Année", PlageDeRecherche.Address, Tb())
'traitement de l'erreur possible : Si on ne trouve rien :
If Trouve > 0 Then
'ici, traitement pour le cas valeur(s) trouvée(s)
For i = 0 To UBound(Tb)
' AdresseTrouvee = AdresseTrouvee & "-" & Tb(i)
AdresseTrouvee = AdresseTrouvee & Tb(i)
Next i
GoTo 1: 'trouvée

Else
'ici, traitement pour le cas où la valeur n'est pas trouvée
' AdresseTrouvee = Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address
GoTo 2:

End If
'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

'MsgBox AdresseTrouvee

'trouvée
1:
'Columns(AdresseTrouvee).Hidden = True 'plante : affiche "$D$5$B$5"
'MsgBox AdresseTrouvee '>MARCHE
'nouvat = Replace(AdresseTrouvee, "$", "") ''>MARCHE
'MsgBox ("Trouvé dans ") & nouvat ''>MARCHE



Unload UserForm1
Exit Sub

'non trouvée
2:
MsgBox ("Equipe non trouvée ou non renseignée.")
Unload UserForm1
Exit Sub

'vidage des variables
Set PlageDeRecherche = Nothing
End Sub


Messages postés
15609
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
24 février 2021
1 460
Bonjour,

regardez ceci:

https://www.cjoint.com/?DDBljqd9cRL

Affichage/masquage colonne(s) en fonction du choix
Messages postés
163
Date d'inscription
lundi 7 mai 2007
Statut
Membre
Dernière intervention
19 juillet 2019
15
f84009 :
Vous êtes la seule personne ayant répondu, sûrement que le sujet ne convenait pas aux autres .... ;)

Un énorme merci car je n'aurais pas pu le faire tout seul !!!!!!
C'est fantastique, je vais y plonger le nez dedans et voir pour poursuivre.

[RESOLU]