Faire une recherche dans le classeur excel

Résolu
shadowskill067 Messages postés 28 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 13 janvier 2014 - 30 déc. 2013 à 12:13
shadowskill067 Messages postés 28 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 13 janvier 2014 - 13 janv. 2014 à 08:48
Bonjour,

je souhaite à partir d'un bouton, effectuer une recherche de mot/nombre apparaissant dans tout le classeur.

je m'explique.
mon classeur comporte plusieurs feuilles (DATA, 1, 2, 3, 4, 5). sachant que la feuille DATA servira à mettre notre bouton.

j'ai trouvé ce type de code sur le web:
rivate Sub CommandButton2_Click()
Dim cel As Range, plage As Range
Dim CommandButton2 As String
Dim dlg As Long, i As Long

    dlg = ActiveSheet.UsedRange.Rows.Count
    CommandButton2 = Sheets(1).Range("D4").Value

For i = dlg To 1 Step -1
    If Not Cells(i, 1) Like "*" & CommandButton2 & "*" Then
    Cells(i, 1).EntireRow.Hidden = True
    End If
Next i

End Sub

Private Sub CommandButton3_Click()
Cells.EntireRow.Hidden = False
End Sub


j'aimerais un petit coup de main qui me permettrais de masquer les lignes dans tout le classeur sauf de la feuille DATA.

merci de votre aide.

9 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
3 janv. 2014 à 10:25
tiens:



Function FindAll(ByVal sText As String, ByRef oSht As Worksheet, ByRef sRange As String, ByRef arMatches() As String) As Boolean
' --------------------------------------------------------------------------------------------------------------
' FindAll - To find all instances of the1 given string and return the row numbers.
' If there are not any matches the function will return false
' --------------------------------------------------------------------------------------------------------------
On Error GoTo Err_Trap
Dim rFnd As Range ' Range Object
Dim iArr As Integer ' Counter for Array
Dim rFirstAddress ' Address of the First Find
' -----------------
' Clear the Array
' -----------------
Erase arMatches
Set rFnd = oSht.Range(sRange).Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart)

If Not rFnd Is Nothing Then
 rFirstAddress = rFnd.Address
 Do Until rFnd Is Nothing
  iArr = iArr + 1
  ReDim Preserve arMatches(iArr)
  arMatches(iArr) = rFnd.Row 'rFnd.Address pour adresse complete ' rFnd.Row Pour N° de ligne
  Set rFnd = oSht.Range(sRange).FindNext(rFnd)
  If rFnd.Address = rFirstAddress Then Exit Do ' Do not allow wrapped search
 Loop
   FindAll = True
  Else
   ' ----------------------
   ' No Value is Found
   ' ----------------------
   FindAll = False
  End If
  ' -----------------------
  ' Error Handling
  ' -----------------------
Err_Trap:
  If Err <> 0 Then
    MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All"
    Err.Clear
    FindAll = False
    Exit Function
  End If
End Function



Sub Exemple_util_Findall()
'Recherche dans la feuille Feuil1 de toutes les cellules contenant
' le mot : test


 'variable tableau pour la fonction Findall
Dim arTemp() As String

'Valeur cherchée
Dim ValCherchee As String
ValCherchee = "test"

'Nom de la feuille où se fait la recherche
Dim Nom_Feuil As String
Nom_Feuil = "Feuil1"

'---------------------------------------------------------------
bFound = FindAll(ValCherchee, Sheets(Nom_Feuil), ma_plage, arTemp())
'---------------------------------------------------------------

If bFound = True Then 'si on a trouvé des valeurs...
  Debug.Print "Nb occurences : " & UBound(arTemp)
  For X = 1 To UBound(arTemp)
    'Numéros de lignes ou le text a été trouvé:
    Debug.Print arTemp(X)
  Next
End If

End Sub



Il te reste à boucler sur tes différentes feuilles et à adapter la sub Exemple_util_Findall à tes besoins (valeur cherchée, l'inclure dans ta boucle sur les feuilles..)

Bonne Prog.
1
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
Modifié par jordane45 le 30/12/2013 à 14:37
Bonjour,
pourquoi masquer les lignes de TOUTES les feuilles (sauf DATA) ?
Pourquoi ne pas plutôt masquer les feuilles directement ?

exemple:
Sub masquerFeuilles()
Dim Sh As Worksheet
'On boucle sur les feuilles du classeur
For Each Sh In ThisWorkbook.Sheets
 'on ne peut masquer les feuilles que si il en reste au moins une..
 ' Et si le nom de la feuille différent de DATA
 If Sh.Name <> "DATA" And NbFeuilVisible > 1 Then
    Sh.Visible = xlSheetHidden
 End If
Next

End Sub

Function NbFeuilVisible()
'fonction permettant de connaitre le nombre de feuilles visibles
Dim Sh As Worksheet
Dim nbF As Integer
'On boucle sur les feuilles du classeur
For Each Sh In ThisWorkbook.Sheets
 If Sh.Visible = xlSheetVisible Then
   nbF = nbF + 1
 End If
Next
NbFeuilVisible = nbF
End Function


Cordialement,
Jordane
0
shadowskill067 Messages postés 28 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 13 janvier 2014
Modifié par shadowskill067 le 2/01/2014 à 09:18
merci pour ta réponse jordan45.

pour te répondre, mon classeur est composé de 6 feuilles (comme expliqué dans le premier message).
la feuille DATA ne comporte aucuns renseignement, seulement (pour l'instant) un bouton don l'action est d'ouvrir un userform et de part ce dernier choisir le thème A, B, ... en fonction des informations a remplir dans les feuilles 1, 2, ...
dans chacune des feuille il y a des paramètre "qui peuvent" réapparaître, comme par exemple le nom d'un client.
voilà pourquoi je souhaite effectuer ce genre de chose. ou alors récupérer ces information dans une feuille supplémentaire suite à ce trie.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
2 janv. 2014 à 09:32
Donc ta question n'est pas (comme je l'avais comprise au départ) "comment masquer 'toutes' les lignes dans les feuilles du classeur"
mais : "comment masquer certaines lignes dans les feuilles" ?

Donc, en reprenant l'exemple que je t'ai donné... Tu boucles sur tes feuilles... et si le nom n'est pas DATA tu caches les lignes en utilisant ton bout de code.


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
shadowskill067 Messages postés 28 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 13 janvier 2014
2 janv. 2014 à 09:41
oui effectivement tu as bien compris.

merci pour les informations je vais voir de ce pas.
0
shadowskill067 Messages postés 28 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 13 janvier 2014
3 janv. 2014 à 09:57
hello,
excuse moi je ne suis pas très bon en programmation...
j'ai donc un peu de mal d'appliquer ton application à mon besoin.

la manière la p lus simple serais d'utiliser la fonction ctrl+F et rechercher dans tout le classeur. Existe-t-il une fonction VB pour ce même principe?
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
3 janv. 2014 à 10:16
Je viens de relire ta demande initiale.. Donc en fait tu ne souhaites pas JUSTE masquer les lignes dans le classeur (sauf de la feuille DATA) mais celles qui correspondraient à des mots/nombres précis... c'est bien ça ?
(COmme quoi .. la rédaction des questions de façon clair et compréhensible argumentées éventuellement d'exemples est indispensable....! ).

Enfin bon... le CTRL+F dans Excel peut se traduire par la méthode FIND ( ton aide VBA t'en donnera les explication et un exemple).

Pour ta macro il va te falloir :

1 - Boucler sur toutes les feuilles de ton classeur (tu peux t'appuyer sur mon code)
2 - Rechercher les valeurs qui t'interessent ( via FIND)
3 - Masquer tes lignes
4 - Poursuivre ta boucle sur la feuille suivante.

Si tu veux plus d'aide :
-Commence par essayer d'écrire ton code
-Reviens expliquer en détail ce que tu souhaites faire ( valeurs cherchées, dans quelles colonnes/lignes, Pour en faire quoi..etc...)
- indique nous où tu coince dans ton code...


0
shadowskill067 Messages postés 28 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 13 janvier 2014
8 janv. 2014 à 15:26
Excusez moi pour le temps de réponse assez long.
J'était sur un autre problème.

J'ai étudier le programme et je pense que j'ai émis des informations. je vais donc re-formuler ma demande.

Mon fichier excel contient maintenant 9 onglets.
seulement 7 onglet serons accessible pour l'utilisateur X.
Dans chacun des onglets on retrouve le nom du client, le numéro de série du produits et du projet, ...

Lorsque le classeur Excel s'ouvre, on retrouve un intitulé en B1 nommé : Utilisator. Cet "Utilisator", ne peux seulement naviguer dans les différents onglets et à accès au options filtres.

La première feuille de mon classeur s'appel : DATA.
De cette feuille, l'"Utilisator" pourra cliquer sur un bouton "Search DATA", pour qu'il puisse rechercher une information X souhaité dans tout le classeur.
Le X est une variable définie par la personne souhaitant rechercher un mot ou une référence en particulier.

Je sais très bien que l'option filtre étant activé cela facilite déjà pas mal l'utilisateur sachant que le nombre de feuille ne dépasse pas 6. Sa recherche est déjà bien accrus par le billet de ce classeur.
On sais tous que les personnes, sachant utiliser Excel, connaissent la fonction ctrl+F. Je souhaite toute fois l'activer depuis un "commandbutton" (d'où mon Search DATA) si possible.

Merci d'avance et en espérant avoir était beaucoup plus claire.

PS: J'ai déjà tenter d'enregistrer une macro pour en récupérer le code, mais rien n'y fait.
0
shadowskill067 Messages postés 28 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 13 janvier 2014
13 janv. 2014 à 08:48
l'utilisateur mon certifié qu'il n'était pas nécessaire et qu'une option de "filtre" disponible dans les tableau excel est satisfaisante et suffisant.

merci pour le coup de main.
0
Rejoignez-nous