Recherche d'un texte dans trois feuilles et renvoyer la liste

J

JCA06

Guest
Bonjour à tous,

J'aimerais retrouver un modèle à adapter pour un problème qui a certainement été traité.
Dans un même classeur, j'ai trois feuilles avec deux colonnes :
- Colonne A avec le nom patronymique, nom de naissance, prénom, alias...
- Colonne B avec un numéro de classeur.

Le but du jeu étant de savoir dans quelle classeur de quelle armoire chercher le dossier, il faudrait obtenir une liste des données qui correspondent avec trois informations :
- le nom de page qui donne le nom de l'armoire ;
- la valeur de la colonne A ;
- la valeur de la colonne B.

Je pense qu'un userform serait adapté, activé par un CommandButton "Lancer une Recherche" avec une textbox dans laquelle on saisirait le texte à rechercher et une listbox de résultat.
Je vois bien l'instruction InStr proposée à C@thy et probablement l'utilisation d'un tableau pour gérer les résultats (salut Yeahou §).

Mais bon, je retire la citation que j'ai faite à @+Thierry sur sa démo de rudiments sur les listbox ou je disais "grace à vous j'ai l'impression d'être intelligent"...

Je me rends bien compte que c'était juste une illusion, à peine une sensation, etc...

Je ne suis pas encore prêt à me lacher sans vous, mais je ne désespère pas d'y arriver !

Merci pour votre aide.
 
@

@+Thierry

Guest
Bonjour Jean Charles, le Forum

Voici une démo spécialement pour toi qui travaille aujourd'hui ;-) !

Tu noteras que le UserForm est généré à la Volée par Programmation. Si tu veux le Conserver il suffira d'aller dans le Module2 et de mettre une Strophe ' devant "KillMe"...

Pour ce qui est du reste tout est en tableau indexé séquentiellement et j'espère que celà ne te donnera pas trop de mal à digérer !

D'ailleurs pour les tableaux je t'ai mis des explication basics dans ce Fil :

=> Lien supprimé car tu avais dit être interressé...

Voilà bonne découverte et surtout n'hésite pas à poser des questions si besoin.

Bon Aprèm
@+Thierry
 
J

JCA06

Guest
C'est re-moi !

J'essaye de déchiffrer tout cela, en commençant par le plus facile évidemment !

J'ai une question pour voir si je progresse : le Private Sub CommandButton1_Click() des feuilles 1, 4 et 5 étant le même code, peut-on en copier le contenu dans un module dans une Sub appelée par les Private Sub des 3 feuilles ?

Autre question sur une instruction que j'ai déjà vu mais que j'ai du mal à comprendre à cause de la double négation : dans ton module 1 tu testes le range C comme cela : If Not C Is Nothing Then...
Est-ce-que tu pourrais me traduire avec tes mots à toi ?

A plus...
 
@

@+Thierry

Guest
Bonsoir JC, le Forum

Pour la question 1, oui oui tout à fait (Thierry !! lol), en fait je t'ai mis là un remix de démo adapté pour trois feuilles car à l'origine il n'y en vait qu'une. Mais on pourriat avoir le Code en module Standard et l'appeler dans chaque CommndButton1_Click (bien Vu)


Pour la question 2, en fait c'est souvent utilisé en programmation
If Not Toto is No Nothing
Pour des Variable Object (Ici "C" est un Objet Range)....

Si le Set d'Objet => Set C = .Find(Text, LookIn:=xlValues)
N'est pas fait (Find Ne retourne rien) alors l'Oject C is Nothing...

Donc il faut tester qu'il NE soit PAS Nothing.... Is it clear ?

Je suis à la bourre au boulot, je repasse + Tard
@+Thierry
 
J

JCA06

Guest
Salut Thierry,

Moi aussi j'étais à la bourre, du coup je viens juste de voir ton message maintenant.

Ton histoire de Toto n'est pas très drôle !

Est-ce-que cela sert à éviter une erreur et un plantage ?

Bon, je vais creuser un peu l'aide...

A plus
 
@

@+Thierry

Guest
Bonjour Jean Charles, le Forum

Je ne pense pas que tu trouveras de l'aide sur la Syntax complète d'usage du "Not" avec "Nothing"...

Ce n'est pas évident à expliquer autrement que ce que j'ai essayé de faire plus haut... Disons que C est un Objet
Cet Objet n'existe que si la String "Text" a été trouvé par la méthode "Find"...

Tu me suis jusque là ?

Je vais essayé d'être plus clair encore...

Si tu cherches la fraction de chaine de caractère "OT" et que dans la cellule "A1" il y a écrit "TOTO"... L'objet "C" (Qui est déclaré As Range) va être crée par le Set d'Objet que constitue cette ligne :
Set C = .Find(Text, LookIn:=xlValues)

Par conséquent "Text" étant "OT" et la valeur de la cellule "A1" étant TOTO" la méthode Find trouvant "OT" dans "TOTO" et retournant systématiquement un Objet Range permet au "Set" d'établir que mon Object C est la Cellule "Range("A1")...

Or il est primordial, même pas en tant que test pour éviter un plantage, que C soit un Objet Range, sinon je n'ai rien, ma boucle Loop While s'arrête et point barre... Bien sûr aussi il y aura plantage si il n'y a pas ce test dès cette ligne :
FirstAddress = C.Address

Puisque C est SDF si Find ne l'a pas retrouvé pour l'héberger Set Lui !! lol
Et si FindNext ne l'a pas trouvé non plus alors il le Loop dehors, donc C triste !!! (ouf c'est Vendredi , Thanks God Its Friday !)

Voilà je ne sais pas si tu as tout compris mais au moins tu devrais avoir un sourir en face de ton écran !!

Bon Week End
@+Thierry
 
@

@+Thierry

Guest
Salut Pat5, re JC, le Forum

Content de te croiser dans un Fil, Pat (Fil à la Patte !!! lol ) !!! Non sans delirer, ça fait un bail que je ne te croisais pas et je me demandais si tu étais parti en vacances... Quoique tu habites dans un endroit où l'on doit se sentir en vacances toute l'année...

et sait-on jamais... à bientôt peut-être pour un apéro "Casa" avec un peu de charcuterie Corse !

Et Bon Week End à tous et toutes
@+Thierry
 
J

JCA06

Guest
Bonjour Pat, re Thierry,

Un peu tôt pour partir en week-end, en plus, ton bateau n'est pas prêt, je le vois bien : il est juste devant la fenêtre de mon bureau le A......s II !

Merci pour le If not is nothing, j'ai compris !! (alléluia !)

J'essaye d'adapter tes procédures à mes besoins, mais il y a un soucis que je ne sais pas comment attraper : mes feuilles s'appellent PAYE, RETRAITE et RENTE et je ne peux donc utiliser ta boucle For S avec le nom "Base".

Il y a certainement un tas de techniques pour cela, mais je ne sais pas quelle est la bonne.
J'ai essayer d'extraire le code de recherche dans une Sub et de l'appeler après avoir défini la feuille, mais une fois de plus je me rends compte que je ne suis qu'un débutant :-(
Pour conserver une boucle, j'ai aussi pensé charger les noms de mes feuilles dans une variable tableau (o) et les boucler par leur n° d'index.

Enfin, en gros, j'ai bien quelques idées mais quant à les mettre en oeuvre...

Mais je ne désespère pas encore... enfin, tant que vous êtes là !

Bon week end en tout cas
 
J

JCA06

Guest
C'est re-moi !

Parce que je vous jure que je cherche !
LA solution est peut être à base de For Each !
Le problème est que même ça je n'arrive pas à le rédiger...

Je vais regarder de plus près le bouquin conseillé par Thierry, d'une part parce que je me rend compte que le titre de la collection me va parfaitement, et parce que le bouquin que j'ai (le tout en poche) me fait penser à l'aide du programme : j'ai l'impression que l'on comprend bien ce qui est écrit si on maîtrise déjà le problème, ou autrement dit, l'aide est bien faite pour ceux qui n'en n'ont pas besoin...
Vous voyez ce que je veux dire ? Sinon j'ai un autre exemple : un peu comme avec un banquier qui veut bien prêter de l'argent, mais à quelqu'un qui n'en a pas besoin et de qui on dit : il vous prête un parapluie, mais uniquement si il fait beau.

Bon, allez, j'arrête là et j'embarque le bouquin pour le week-end !

A bientôt
 
@

@+Thierry

Guest
Re Bonsoir JC

Sorry j'étais occupé et pas vu tes questions...

C'est assez simple tu peux remplacer cette ligne :
If Left(Worksheets(S).Name, 4) = "Base" Then

Par celle-ci :
If Worksheets(S).Name = "PAYE" Or Worksheets(S).Name = "RENTE" Or Worksheets(S).Name = "RETRAITE" Then

Et le tour est joué... On peut aussi faire un boucle sur une array, mais là les modifs seront plus conséquentes :

Sub Recherche()
Dim C As Range
Dim tablo() As String
Dim Text As String, Titre As String
Dim S As Variant '<<<< Attention Ici !!
Dim Firstaddress As String
Dim I As Integer, X As Integer, L As Integer

Text = InputBox("Taper le Text Recherché", Thierry, "JCA06")
If Text = "" Then Exit Sub

For Each S In Array("PAYE", "RENTE", "RETRAITE")
'Attention Ici plus besoin de If

With Sheets(S).UsedRange
Set C = .Find(Text, LookIn:=xlValues)
If Not C Is Nothing Then
Firstaddress = C.Address
Do
ReDim Preserve tablo(5, I)
tablo(0, I) = C.Value
tablo(1, I) = C.Offset(0, 1).Text
tablo(2, I) = C.Row
tablo(3, I) = Sheets(S).Name
tablo(4, I) = C.Address
I = I + 1
Set C = .FindNext(C)
Loop While Not C Is Nothing And C.Address <> Firstaddress
End If
End With
'Attention Ici plus besoin de End If
Next S

Voilà ce n'est pas non plus trop compliqué.

Bon Week End
@+Thierry
 

Discussions similaires

Statistiques des forums

Discussions
312 467
Messages
2 088 676
Membres
103 915
dernier inscrit
VT14907