Userform et moteur de recherche

Bonjour,

POur faciliter la recherche dans un classeur Excel comportant plusieurs onglets

j'ai créé un moteur de recherche en utilisant les userforms

Je me suis inspiré d'un moteur de recherche trouvé sur le net en l'adaptant à mes besoins

mais il reste encore des points que je ne parviens pas à comprendre ou à résoudre par manque de connaissance du VBA

- Je souhaiterais: supprimer les Labels 3 et 6 et les textbox 3 et 6

comment m'y prendre?

quand je le fais en éditant le userform et en supprimant les labels et les textbox, Excel me met un message d'erreur quand je lance le formulaire de recherche

- L'affichage de l'onglet métier ne fonctionne pas

 UserForm1.ListView1.ListItems(G).ListSubItems.Add , , ActiveSheet.Name

- J'ai un peu de mal à comprendre précisément à quoi correspondent les variables

D, F, C, G, firstAddress, Plage

je souhaiterais avoir une explication + détaillée

- ET ENFIN, Je souhaiterais que s'affiche un Message erreur quand aucune occurrence est trouvée

quelqu'un peut me guider?

Salut Zbee,

Trop de questions = pas de réponse

Alors commençons avec ta première question. Ton code inscrit les titres des Labels du UserForm à chaque fois, au lieu que ces titres soient inscrits une fois pour toute. Est-ce quelque chose que tu désires vraiment ou est-ce que l’on pourrait nommer ces Labels directement dans la forme ?

Ton code comporte effectivement une boucle de 6 passages qui renomme à chaque fois tes 6 labels en fonction du titre des 6 colonnes de la feuille 2 ; il est donc normal que ça bloque lorsque tu supprimes l’un ou l’autre label et que le code ne le(s) trouve plus afin de lui(leur) administrer un titre.

Alors qu’est-ce qu’on fait ? On réduit le nombre de labels à 4 et on modifie la boucle afin qu’elle n’inscrive que 4 titres à chaque fois (si possible selon 4 colonnes qui se suivent) ou est-ce que l’on donne un titre aux 4 labels que tu désires garder directement dans la forme et on supprime cette boucle dont je ne vois pas encore l'utilité ?

Cordialement.

Bonsoir Zbee, Yvouille

fichier modifié

pour la colonne des noms de feuille, voir macro initialise de l'userform

pour les labels, explications inscrites dans un label a supprimer

pour les variables,voir macro recherche

940zbee.zip (23.39 Ko)

Bonsoir à vous 2,

Merci pour vos réponses rapides

La solution de BOB71AU fonctionne parfaitement et correspond à mon besoin

le code y est commenté de manière très détaillé

ce qui me permet de comprendre le mécanisme

mais la proposition de Yvouille de donner un titre aux 4 labels que je souhaite garder me conviendrait mieux et me semble + simple

notamment si je veux faire évoluer le userform

Yvouille tu peux me proposer quelquechose?

PS:

Je réponds à ton autre post

Bonjour à tout le monde,

@ Bob,

Parfois il vaut mieux attendre les précisions du demandeur plutôt que de se lancer tête baissée dans la réalisation d'une solution quelconque. Maintenant que tu connais bien ce code, veux-tu continuer à répondre à la demande de Zbee ? Autrement j'y réponds moi dès ce soir ou demain matin (mardi).

A te relire.

Bonsoir Yvouille, zbee

a voir si cela convient

955copie-de-zbee.zip (23.54 Ko)

Ah, le code a été épuré

il m'est + simple à décrypter

Écoute BOB71AU, cela correspond parfaitement à mon besoin initial

Juste une remarque:

UserForm1.ListView1.ListItems(G).ListSubItems.Add , , ActiveSheet.Name

le nom de l'onglet ne se reporte pas dans le userform

le code semble bon?

RE

dans le dernier fichier que j'ai posté, il n'y a plus ni G ni ActiveSheet.Name

remplacé par listview.count et sheets(F).name

c'est dans la macro initialise que l'on configure la colonne des noms de feuille

.Add , , "FEUILLE", 100, lvwColumnLeft

OK j'ai trouvé pourquoi la colonne METIER ne se remplissait pas

Dernière chose:

possible de me traduire de manière + détaillé le code ci-dessous:

Merci d'avance de vous mettre à la portée d'un débutant en VBA et de faire preuve de pédagogie

'
For F = Sheets.Count To 1 Step -1
  With Sheets(F) 'ThisWorkbook.ActiveSheet

     For Each C In .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)

        If C.Text Like "*" & UserForm1.TextBox1.Text & "*" And C.Offset(0, 1) Like "*" & UserForm1.TextBox2.Text & "*" And C.Offset(0, 3) Like "*" & UserForm1.TextBox3.Text & "*" _
            And C.Offset(0, 4) Like "*" & UserForm1.TextBox4.Text & "*" Then
                If C.Address <> "$A$1" And C <> "" Then

                    UserForm1.ListView1.ListItems.Add , , .Range(C.Address)

                    For D = 1 To 4
                        UserForm1.ListView1.ListItems(UserForm1.ListView1.ListItems.Count).ListSubItems.Add , , C.Offset(0, D)
                    Next D

                    UserForm1.ListView1.ListItems(UserForm1.ListView1.ListItems.Count).ListSubItems.Add , , Sheets(F).Name
                End If
            End If
     Next C
  End With
Next F

Sinon, pour tout le reste

un grand merci à vous 2

Bonsoir zbee

la pédagogie et moi ,on n'est jamais d'accord

'F représente le nombre de feuilles du fichier

'on peut traduire comme ceci
'pour toutes les feuilles de la dernière feuille (count=nombre de feuilles) a la première feuille (feuille 1) step -1=soit ici en ordre de 'la plus grande a la plus petite pas de -1
For F = Sheets.Count To 1 Step -1
'utilisation de with afin de ne pas répéter a chaque intruction le nom de feuille ou d'objet ou de variable se situant après with
'dans notre cas sheets(F) = sheets(4) puis sheets(3) puis sheets(2) puis sheets(1)
  With Sheets(F) 
   'ensuite a chaque fois que l'on veut faire référence a sheets(F) alors on commence l'instrcution par un point "."
   ' exemple  .Range(C.Address)

'C est une variable quelconque qui dans notre cas représente une cellule de la feuille F
'on traduit la ligne de code suivante comme ceci
'pour toutes les cellules C de la plage de cellules allant de A2 à A et la dernière ligne non vide de la colonne A en partant du bas de la feuille
     For Each C In .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)

' si le text de la cellule C contient "*" ( * remplace n'importe quels caractères) & le text du textbox1 & "*" (n'importe quels caractères)  and= et que  C.offset(0,1)=la cellule offset=décalage (0=la ligne donc on reste sur même ligne , 1=décalage de colonne +1 soit colonne B   et on continu
        If C.Text Like "*" & UserForm1.TextBox1.Text & "*" And C.Offset(0, 1) Like "*" & UserForm1.TextBox2.Text & "*" And C.Offset(0, 3) Like "*" & UserForm1.TextBox3.Text & "*" _
            And C.Offset(0, 4) Like "*" & UserForm1.TextBox4.Text & "*" Then

             'si l'adresse de la cellule est différente de A1 =ligne de titre et que C n'est pas vide alors
                If C.Address <> "$A$1" And C <> "" Then

                    'pour remplir une listview, on ajoute (ADD) une ligne dans la listview sur la colonne 1 de la listview , , puis le contenu
                    UserForm1.ListView1.ListItems.Add , , .Range(C.Address)

                  'ensuite, D détermine le nbre de colonnes a remplir sur la ligne de la listview1 
                  ' donc UserForm1.ListView1.ListItems.Add est la première colonne puis je rajoute 4 colonnes 1 to 4
                    For D = 1 To 4 ' est une boucle ou D va prendre succéssivement la valeur 1 puis 2 puis 3 puis 4
                        'je rajoute sur la dernière ligne de la listview (count) pour D=1 ,C.Offset(0, D) soit la cellule de la ligne trouvée et de colonne B(décalage de +1 sur la colonne de la feuille
                        UserForm1.ListView1.ListItems(UserForm1.ListView1.ListItems.Count).ListSubItems.Add , , C.Offset(0, D)
                    Next D
                   'puis on ajoute une colonne a la listview pour y mettre le nom de la feuille 
                    UserForm1.ListView1.ListItems(UserForm1.ListView1.ListItems.Count).ListSubItems.Add , , Sheets(F).Name
                End If
            End If
     Next C   'puis on passe a la cellule suivante de la feuille dans la colonne A
  End With
'puis l'on change de feuille et on recommence a scruter la colonne A de la nouvelle feuille
Next F 

allez, à toi de jouer par toi même

Bonsoir BOB71AU,

Pour quelqu'un qui pense n' avoir aucun sens pédagogique,

mon jugement sera tout autre

belle traduction VBA en français

J'ai compris je pense suffisamment pour pouvoir me débrouiller et l'adaper à mon projet final

Bonne continuation et à bientôt!

Bonjour,

je me permet de solliciter votre aide car j'ai adapté le code mais j'ai message d'erreur lors de l’exécution suite à la modification d'une valeur dans la macro "Recherche METIER"

'On rempli les autre colonnes de la listview par le décalage D représentant l'offset 1,2,3 etc

' donne les colonnes à afficher

For D = 1 To 12 ( je ne peux pas aller au dessus de 12 sinon j'ai un message d'erreur )

Erreur d’exécution '13' : Incompatibilité de type

Pourriez vous m'aider

Merci

Bonsoir Romjé41

le problème ne vient pas du code mais de la feuille

les colonnes indiques des #REF

j'ai donc ajouté un on error resume next pour palier le défaut

Je te remercie infiniment BOB71AU.

Bonne soirée.

BOB71AU a écrit :

Bonsoir Romjé41

le problème ne vient pas du code mais de la feuille

les colonnes indiques des #REF

j'ai donc ajouté un on error resume next pour palier le défaut

Excellent ce moteur de recherche. Pile poil ce dont j'avais besoin. Merci

Rechercher des sujets similaires à "userform moteur recherche"