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.

89classeur1.xlsm (31.72 Ko)

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 Sub

Cdlt

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 Sub

Bon 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 Sub

Le 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 Sub

Je 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 Sub

Cdlt

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 Sub

J'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 If

ainsi 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

Rechercher des sujets similaires à "macro recherche selection valeur"