Macro de recherche et sélection cellule par valeur
Bonjour à vous.
Etant trésorier d'une association je tiens un classeur de "comptabilité".
Dans ce classeur d'une bonne vingtaine de feuilles il y en a deux dans lesquelles sont renseigné les numéro de facture et les numéros de chèque.
Plutôt que de passer par "CTRL+F" j'ai souhaité ajouter un bouton de recherche. Ce bouton ouvre un MsgBox qui invite à entrer le numéro à rechercher (il peut être numérique ou alphanumérique).
Dans l'idéal un message d'erreur indique que le numéro recherché n'existe pas, dans ce cas il faut entrer à nouveau la valeur à rechercher.
Si la valeur existe plusieurs fois j'aimerais qu'il soit indiqué par exemple avec un MsgBox la liste des cellules dans quelle feuille puis après avoir cliqué sur "OK" la première cellule soit activée.
Si tout se passe bien et que la valeur recherchée existe et une seule fois alors sélectionner la cellule.
Etant débutant et SURTOUT autodidacte j'ai commencé à bidouiller des codes avec des choses trouvées un peu partout mais je bloque.
Je ne sais pas comment attribuer la valeur recherchée à ma variable avec la "InputBox". (Je pense que le premier problème vient de là).
J'aimerais, si possible, être aidé par étape. En gros, un coup de main sur ce qui me bloque dès le départ et ensuite petit à petit je tenterai d'avancer pour obtenir la macro que je désire.
En pièce jointe un fichier fait pour partage avec vous, j'alimenterai le fichier de l'asso une fois la macro opérationnelle.
Un grand MERCI par avance.
Bonjour,
La macro n'est pas liée à une feuille particulière, il faut la mettre dans un module standard.
Sub Cherche()
'déclaration des variables :
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Dim Trouve As Range, PlageDeRecherche As Range
'********* à adapter ***********
'affectation de valeurs aux variables :
Valeur_Cherchee = InputBox("Saisir le N° recherché", "Recherche de la ligne crédit ou débit")
'*******************************
'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)
With ActiveSheet.Range("A2:A14") 'dans la première colonne de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
If Trouve Is Nothing Then 'traitement de l'erreur possible : Si on ne trouve rien :
AdresseTrouvee = Valeur_Cherchee & " n'est pas présent dans " & PlageDeRecherche.Address 'ici, traitement pour le cas où la valeur n'est pas trouvée
Else
AdresseTrouvee = Trouve.Address 'ici, traitement pour le cas où la valeur est trouvée
End If
End With
MsgBox AdresseTrouvee
'vidage des variables
Set Trouve = Nothing
End SubCdlt
Bonjour Arturo83,
Je te remercie, plus qu'à tenté d'agrémenter la macro comme je l'entends.
Bonne journée.
Bien à toi.
Bonjour Arturo83, bonjour les lecteurs.
J'ai déjà pas mal avancé (pour moi) mais je bloque.
Comme indiqué plus haut, je pourrais me tromper dans la feuille dans laquelle chercher, c'est pour quoi j'ai voulu ajouter une feuille en recherche en cas de non résultat sur l'active.
Il y a également une erreur si la recherche est infructueuse et que je souhaite arrêter la recherche.
Voici le code:
Sub Cherche()
Ligne1:
'déclaration des variables :
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Dim Trouve As Range, PlageDeRecherche As Range
'********* à adapter ***********
'affectation de valeurs aux variables :
Valeur_Cherchee = InputBox("Saisir le N° recherché", "Recherche de la ligne crédit ou débit")
'*******************************
'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)
With ActiveSheet.Range("A2:D14") 'zone de recherche de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
If Trouve Is Nothing Then 'traitement de l'erreur possible : Si on ne trouve rien recherche sur l'autre feuille :
Else: Sheets("feuil2").Select
With ActiveSheet.Range("A2:D14") 'zone de recherche de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
If Trouve Is Nothing Then 'traitement de l'erreur possible : Si on ne trouve rien :
MsgBox (Valeur_Cherchee & " n'existe pas") 'ici, traitement pour le cas où la valeur n'est pas trouvée
Message = "Lancer une nouvelle recherche?"
Style = vbYesNo
Titre = "Recherche infructueuse"
reponse = MsgBox(Message, Style, Titre)
If reponse = 6 Then GoTo Ligne1 Else GoTo Ligne2
Ligne2:
ElseIf reponse = 7 Then
'vidage des variables
Set Trouve = Nothing
Else
AdresseTrouvee = Trouve.Address 'ici, traitement pour le cas où la valeur est trouvée
End If
End With
Range(AdresseTrouvee).Activate
'vidage des variables
Set Trouve = Nothing
End SubBon dimanche.
Bonjour,
Une chose extrêmement importante à mes yeux est l'indentation du code, insérer des décalages des lignes dans le code pour une meilleure lisibilité et détecter les éventuelles erreurs, si vous faites cela correctement, vous vous apercevez qu'il manque un "END WITH" quelque part.
Revoici votre code avec l'indentation respectée
Sub Cherche()
Ligne1:
'déclaration des variables :
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Dim Trouve As Range, PlageDeRecherche As Range
'********* à adapter ***********
'affectation de valeurs aux variables :
Valeur_Cherchee = InputBox("Saisir le N° recherché", "Recherche de la ligne crédit ou débit")
'*******************************
'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)
With ActiveSheet.Range("A2:D14") 'zone de recherche de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
If Trouve Is Nothing Then 'traitement de l'erreur possible : Si on ne trouve rien recherche sur l'autre feuille :
Else: Sheets("feuil2").Select
With ActiveSheet.Range("A2:D14") 'zone de recherche de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
If Trouve Is Nothing Then 'traitement de l'erreur possible : Si on ne trouve rien :
MsgBox (Valeur_Cherchee & " n'existe pas") 'ici, traitement pour le cas où la valeur n'est pas trouvée
Message = "Lancer une nouvelle recherche?"
Style = vbYesNo
Titre = "Recherche infructueuse"
reponse = MsgBox(Message, Style, Titre)
If reponse = 6 Then GoTo Ligne1 Else GoTo Ligne2
Ligne2:
ElseIf reponse = 7 Then
'vidage des variables
Set Trouve = Nothing
Else
AdresseTrouvee = Trouve.Address 'ici, traitement pour le cas où la valeur est trouvée
End If
End With
Range(AdresseTrouvee).Activate
'vidage des variables
Set Trouve = Nothing
End SubLe END WITH , quelle boucle ferme-t-il?
Cdlt
Bonjour Arturo83,
Je vous remercie pour ces nouveaux conseils.
Je n'avais pas bien saisi ce qu'englobait le "With".
Sub Cherche()
Ligne1:
'déclaration des variables :
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Dim Trouve As Range, PlageDeRecherche As Range
'********* à adapter ***********
'affectation de valeurs aux variables :
Valeur_Cherchee = InputBox("Saisir le N° recherché", "Recherche de la ligne crédit ou débit")
'*******************************
'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)
With ActiveSheet.Range("A2:D14") 'zone de recherche de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
End With
If AdresseTrouvee = Trouve.Address Then 'ici, traitement pour le cas où la valeur est trouvée
Range(AdresseTrouvee).Activate
'vidage des variables
Set Trouve = Nothing
GoTo Ligne3
If Trouve Is Nothing Then 'traitement de l'erreur possible : Si on ne trouve rien, recherche sur l'autre feuille :
Sheets("feuil2").Select
With ActiveSheet.Range("A2:D14") 'zone de recherche de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
End With
If Trouve Is Nothing Then 'traitement de l'erreur possible : Si on ne trouve rien :
MsgBox (Valeur_Cherchee & " n'existe pas") 'ici, traitement pour le cas où la valeur n'est pas trouvée
Message = "Lancer une nouvelle recherche?"
Style = vbYesNo
Titre = "Recherche infructueuse"
reponse = MsgBox(Message, Style, Titre)
If reponse = 6 Then GoTo Ligne1
Else: GoTo Ligne2
End If
End If
End If
Ligne2:
If reponse = 7 Then
'vidage des variables
Set Trouve = Nothing
Else
AdresseTrouvee = Trouve.Address 'ici, traitement pour le cas où la valeur est trouvée
Range(AdresseTrouvee).Activate
'vidage des variables
Set Trouve = Nothing
End If
Ligne3:
End SubJe passe mon temps à décaler les problèmes mais je comprends quelque chose de nouveau à chaque fois alors ça m'évite les découragements.
Merci en tout cas de me guider étape par étape.
Je pense qu'il y a moyen de faire plus simple en écrivant moins de lignes mais j'essaie de fractionner, séparer le déroulement de la macro.
En cas de valeur non trouvée la MsgBox ne s'affiche plus et je ne comprends pas pourquoi. 🤔
Bonsoir,
Essayez ceci
Sub Cherche()
'déclaration des variables :
Dim f1 As Worksheet, f2 As Worksheet
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Dim Trouve As Range, PlageDeRecherche As Range
Set f1 = Sheets("Feuil1")
Set f2 = Sheets("Feuil2")
Ligne1:
'********* à adapter ***********
'affectation de valeurs aux variables :
Valeur_Cherchee = InputBox("Saisir le N° recherché", "Recherche de la ligne crédit ou débit")
'*******************************
'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)
With f1.Range("A2:D14") 'zone de recherche de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
If Not Trouve Is Nothing Then 'ici, traitement pour le cas où la valeur est trouvée
AdresseTrouvee = Trouve.Address
Range(AdresseTrouvee).Activate
'vidage des variables
Set Trouve = Nothing
Exit Sub
Else
' Si on ne trouve rien, recherche sur l'autre feuille :
With f2.Range("A2:D14") 'zone de recherche de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
End With
If Trouve Is Nothing Then 'traitement de l'erreur possible : Si on ne trouve rien :
MsgBox (Valeur_Cherchee & " n'existe pas") 'ici, traitement pour le cas où la valeur n'est pas trouvée
Message = "Lancer une nouvelle recherche?"
Style = vbYesNo
Titre = "Recherche infructueuse"
reponse = MsgBox(Message, Style, Titre)
If reponse = 6 Then GoTo Ligne1
End If
End If
End With
If reponse <> 7 Then
AdresseTrouvee = Trouve.Address 'ici, traitement pour le cas où la valeur est trouvée
Range(AdresseTrouvee).Activate
End If
'vidage des variables
Set Trouve = Nothing
Set f1 = Nothing
Set f2 = Nothing
End SubCdlt
Bonjour,
Merci une nouvelle fois.
C'est en effet plus clair et ça fonctionne 😎
Sub Cherche()
'déclaration des variables :
Dim f1 As Worksheet, f2 As Worksheet
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Dim Trouve As Range, PlageDeRecherche As Range
Set f1 = Sheets("Feuil1")
Set f2 = Sheets("Feuil2")
Set tableau = Array()
Ligne1:
'********* à adapter ***********
'affectation de valeurs aux variables :
Valeur_Cherchee = InputBox("Saisir le N° recherché", "Recherche de la ligne crédit ou débit")
'*******************************
'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)
With f1.Range("A2:D14") 'zone de recherche de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
Set tableau = cellsSearch(Range("A2:D14"), Trouve) arrayDebug tableauAdresses, 2, 16, Chr(10) 'Affichage du tableau dans une MsgBox pour affichage des cellules dans lesquelles se trouvent la valeur recherchée
If Not Trouve Is Nothing Then 'ici, traitement pour le cas où la valeur est trouvée
AdresseTrouvee = Trouve.Address
Range(AdresseTrouvee).Activate
'vidage des variables
Set Trouve = Nothing
Exit Sub
Else
' Si on ne trouve rien, recherche sur l'autre feuille :
With f2.Range("A2:D14") 'zone de recherche de la feuille active
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
End With
If Trouve Is Nothing Then 'traitement de l'erreur possible : Si on ne trouve rien :
MsgBox (Valeur_Cherchee & " n'existe pas") 'ici, traitement pour le cas où la valeur n'est pas trouvée
Message = "Lancer une nouvelle recherche?"
Style = vbYesNo
Titre = "Recherche infructueuse"
reponse = MsgBox(Message, Style, Titre)
If reponse = 6 Then GoTo Ligne1
End If
End If
End With
If reponse <> 7 Then
Worksheets("Feuil2").Activate
AdresseTrouvee = Trouve.Address 'ici, traitement pour le cas où la valeur est trouvée
Range(AdresseTrouvee).Activate
End If
'vidage des variables
Set Trouve = Nothing
Set f1 = Nothing
Set f2 = Nothing
End SubJ'ai ajouté "Worksheets("Feuil2").Activate" pour que se soit la cellule de la bonne feuille qui soit activée.
Juste une question, pourquoi n'y a t il pas de "End With" entre le premier "With" et le premier "End Sub"?
J'arrive enfin à la dernière étape de mon "projet".
Lorsque la valeur recherchée existe dans plusieurs cellules, alors afficher les différentes adresses via un tableau dans une MsgBox.
Mais là je sèche complètement. J'ai tenté plusieurs écritures mais j'ai tout le temps des erreurs.
Bel après-midi.
Bonsoir,
Juste une question, pourquoi n'y a t il pas de "End With" entre le premier "With" et le premier "End Sub"?
Rien n'empêche de quitter le with si les conditions recherchées sont réunies.[s=co-548dd4][/s]********************************************************************************************************
Pour rechercher tous les éléments qui existent, faire une boucle comme ceci:
Set Trouve = .Find(Valeur_Cherchee, LookAt:=xlWhole)
If Not Trouve Is Nothing Then 'ici, traitement pour le cas où la valeur est trouvée
AdresseTrouvee = Trouve.Address 'repère la première cellule trouvée
Do
'********Mettre ici les actions à faire**********************
Set Trouve = .FindNext(Trouve) 'on cherche le "Trouve" suivant
Loop While Not Trouve Is Nothing And AdresseTrouvee <> Trouve.Address 'on boucle tant que les conditions ne sont pas remplies
End Ifainsi on effectue une recherche tant que la valeur à trouver ici "Trouve" n'est pas rien (Loop While Not Trouve Is Nothing)
et que l'adresse trouvée à chaque passage ne correspond pas à l'adresse du 1er "Trouve" trouvé (AdresseTrouvee <> Trouve.Address).
Cdlt
Bonsoir Arturo83,
Je sèche, vraiment vraiment.
Pour que la macro fonctionne comme je le souhaite je suppose qu'il faut en plus de tout ce qui est fait jusqu'à présent:
Lancer la recherche et si la valeur est trouvée alors attribuer à une variable l'adresse de la cellule puis à l'aide de la boucle que vous m'avez proposé lancer à nouveau la recherche mais à partir de cette cellule et non depuis le début. Si elle est infructueuse alors, sélectionner la cellule comme jusqu'à présent. En revanche si la valeur est de nouveau trouvée alors attribuer à une autre variable l'adresse de cette nouvelle cellule et ainsi de suite.
Si plus d'une adresse attribuée alors afficher un message d'avertissement avec un tableau vertical qui liste les cellules dans lesquelles la valeur recherchée à été trouvée. Après un click sur "OK" sélection de la première cellule trouvée.
C'est bien au dessus de ma portée 😢
J'ai téléchargé les archives sur la formation Excel et celle sur le VBA en vu de faire au minimum un exercice par jour pendant les vacances car il me manque trop de bases.
Un jour je serai peut-être un "Arturo" 😁
Bonjour,
Pour que je puisse vous répondre correctement, il faudrait que je vois le code en entier.
Cdlt