Organisation de procédure (recherche)
Résolu
1Globule
Messages postés
62
Statut
Membre
-
michel_m Messages postés 18903 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 18903 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
J'ai du mal à organiser ma macro, qui n'est pourtant pas si compliquée.
Je recherche une valeur (stockée en variable) dans mon classeur actif qui contient trois feuilles.
Si je la trouve dans une des feuille, je récupère les informations qui se trouvent sur la même ligne, je les indique en msgbox et je termine ma macro.
Si je ne la trouve pas je vais chercher dans un autre classeur, qui contient un nombre indéterminé de feuilles.
Si je la trouve, idem, je récupère les données de la ligne, je les affiche et je termine.
Si je ne la trouve pas du tout, dans aucun des deux classeurs, j'indique dans un msgbox une info de type "Valeur non trouvée".
Simple non ?
J'ai essayé avec des boucles et des if multiples, au final ça fonctionne très bien mais c'est une véritable usine à gaz.
Pourriez-vous m'indiquer la structure la plus simple à adopter ?
Merci beaucoup !
J'ai du mal à organiser ma macro, qui n'est pourtant pas si compliquée.
Je recherche une valeur (stockée en variable) dans mon classeur actif qui contient trois feuilles.
Si je la trouve dans une des feuille, je récupère les informations qui se trouvent sur la même ligne, je les indique en msgbox et je termine ma macro.
Si je ne la trouve pas je vais chercher dans un autre classeur, qui contient un nombre indéterminé de feuilles.
Si je la trouve, idem, je récupère les données de la ligne, je les affiche et je termine.
Si je ne la trouve pas du tout, dans aucun des deux classeurs, j'indique dans un msgbox une info de type "Valeur non trouvée".
Simple non ?
J'ai essayé avec des boucles et des if multiples, au final ça fonctionne très bien mais c'est une véritable usine à gaz.
Pourriez-vous m'indiquer la structure la plus simple à adopter ?
Merci beaucoup !
A voir également:
- Organisation de procédure (recherche)
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Rechercher ou entrer l'adresse mm - recherche google - Guide
- Recherche image - Guide
- Je recherche une chanson - Guide
- Roxane cherche des informations pour écrire un rapport sur la diversité. avec un moteur de recherche généraliste, elle souhaite limiter les résultats de sa recherche aux pages de l’organisation internationale de la francophonie. quelle requête doit-elle taper dans le champ de recherche ? - Forum Réseaux sociaux
4 réponses
yg_be
Messages postés
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 585
bonjour, cela me semble une bonne idée d'utiliser des boucles et des IF.
une moins bonne idée d'en faire une usine à gaz.
une moins bonne idée d'en faire une usine à gaz.
Bonjour;
on peut certainement éviter la boucle dans les feuilles
Exemple à adapter
on peut certainement éviter la boucle dans les feuilles
If Application.CountIf(Columns("B"), "*" & Var) = 1 Then
lig = Columns("B").Find(what:=Var, LookIn:=xlValues).Row
MsgBox Range(Cells(lig, "A"), Cells(lig, "G"))
End If
Exemple à adapter
Merci à vous deux,
J'ai adapté le code mais comme il ne fonctionnait pas j'ai essayé de reprendre déjà tel quel celqui de yg_be.
Je ne parviens pas à lancer la macro, à moins d'enlever l'argument ("quoi", dans l'exemple).
Est-ce que je fais quelque chose de travers ?
Pour l'instant je suis dans un module simple...
J'ai adapté le code mais comme il ne fonctionnait pas j'ai essayé de reprendre déjà tel quel celqui de yg_be.
Je ne parviens pas à lancer la macro, à moins d'enlever l'argument ("quoi", dans l'exemple).
Est-ce que je fais quelque chose de travers ?
Pour l'instant je suis dans un module simple...
En enlevant l'argument, j'arrive à trouver ma variable quand elle se trouve sur la première page uniquement. Si elle est sur la deuxième ou sur une autre, la macro ne la détecte pas.
De plus, si elle se trouve en première page jj'ai une erreur d'exécution 91 sur la ligne suivante :
lig = Columns("B").Find(what:=Var, LookIn:=xlValues).Row
De plus, si elle se trouve en première page jj'ai une erreur d'exécution 91 sur la ligne suivante :
lig = Columns("B").Find(what:=Var, LookIn:=xlValues).Row
peut-être ainsi:
Private Function cherchedansunfichier(wb As Workbook, Var As String) As Boolean
Dim sh As Worksheet, lig As Range
For Each sh In wb.Sheets
If Application.CountIf(sh.Columns("B"), "*" & Var) = 1 Then
Set lig = sh.Columns("B").Find(what:=Var, LookIn:=xlValues).EntireRow
'trouvé
MsgBox lig.Cells(1, 2).Value
cherchedansunfichier = True
Exit Function
End If
Next sh
cherchedansunfichier = False
End Function
Bonjour à vous deux, et merci encore pour votre aide.
Je crains que la solution de yg_be (set lig) ne soit pas efficace : Si la valeur se trouve en deuxième feuille on ne la détecte toujours pas.
Quant à la proposition de Michel, malheureusement je ne peux pas y accéder : Le lien est bloqué depuis mon bureau, je pense pour des raisons de sécurité.
Je crains que la solution de yg_be (set lig) ne soit pas efficace : Si la valeur se trouve en deuxième feuille on ne la détecte toujours pas.
Quant à la proposition de Michel, malheureusement je ne peux pas y accéder : Le lien est bloqué depuis mon bureau, je pense pour des raisons de sécurité.
avec ceci, je trouve en deuxième feuille:
Private Function cherchedansunfichier(wb As Workbook, Var As String) As Boolean
Dim sh As Worksheet, lig As Range
For Each sh In wb.Sheets
If Application.CountIf(sh.Columns("B"), "*" & Var) = 1 Then
Set lig = sh.Columns("B").Find(what:=Var, LookIn:=xlValues).EntireRow
'trouvé
MsgBox lig.Cells(1, 2).Value
cherchedansunfichier = True
Exit Function
End If
Next sh
cherchedansunfichier = False
End Function
For p = 1 To 2 ' Boucler sur 2 classeurs
If p = 1 Then ' Savoir s'il y a 3 feuilles ou un nombre indéterminé
a = 3
Else
a = Sheets.Count
End If
For i = 1 To a ' Boucler sur les x feuilles
Sheets(i).Select
For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row ' Boucler sur toutes les lignes
If Cells(j, 2).Value Like "*" & VAR Then ' Chercher la variable
r = 1 ' Mettre un indicateur si valeur est trouvée
' Récupérer toutes les infos
End If
Next
Next
If r = 1 Then ' Si la valeur est trouvée, sortir de la boucle
Exit For
Else
s = 1 ' Sinon mettre un indicateur quand le deuxième classeur s'ouvre
Workbooks.Open Filename:="Documents/Archives.xlsx", ReadOnly:=True' Ouvrir le deuxième classeur
End If
Next
If s = 1 Then ' Si le deuxième classeur est ouvert, le fermer
Windows("Archives.xlsx").Close
End If
option explicit Sub cherchepartout(quoi As String) Dim wb As Workbook If Not cherchedansunfichier(ThisWorkbook, quoi) Then Set wb = Workbooks.Open("Documents/Archives.xlsx", , True) If Not cherchedansunfichier(wb, quoi) Then 'rien trouvé End If wb.Close End If End Sub Private Function cherchedansunfichier(wb As Workbook, Var As String) As Boolean Dim sh As Worksheet, lig As Range For Each sh In wb.Sheets For Each lig In sh.Rows If lig.Cells(1, 2).Value Like "*" & Var Then 'trouvé cherchedansunfichier = True Exit Function End If Next lig Next sh cherchedansunfichier = False End FunctionJe vais tester et je te tiens informé.
C'est très gentil en tout cas.
A première vue, il me semble qu'il faudrait boucler sur les lignes non vides pour gagner du temps, et ensuite j'aurais besoin de sélectionner la cellule concernée quand la valeur est trouvée.
Je vais essayer de chercher un peu ce qui pose problème.