Recherchez une valeur dans plusieurs colonne

Résolu
volfoss Messages postés 43 Statut Membre -  
volfoss Messages postés 43 Statut Membre -

Bonjour,

j'ai une macro qui fonctionne parfaitement pour rechercher une valeur dans une colonne (o) par contre je n'arrive pas à faire fonctionner cette macro pour effectuer la recherche sur plusieurs colonnes (à savoir les colonnes H à V).

Voici le code qui fonctionne :

im Mot As String, MyValue As String
Dim lig As Long, n As Long
Dim Plage As Range

'recherche feuille "Registre"
 With Worksheets("Registre")

'Définition de la variable à rechercher
        Mot = InputBox("Saisir le N° de fiche à chercher. ", Title:="Recherche Fiche")
        
'Reponse non vide
        If Mot <> "" Then
        Set Plage = .Range("O7:O" & .Range("O" & Rows.Count).End(xlUp).Row)
        Nbre = Application.CountIf(Plage, Mot)        'nombre fois Mot colonne O
        If Nbre = 0 Then    'Message en cas de mot inexistant
        MyValue = MsgBox(" Le N° de fiche " & Mot & " n'est pas enregistré ", , " Recherche Fiche ")
        Else
        
'Recherche et changement couleur sur les cellules contenant le Mot
lig = 7     'ligne de depart recherche
For n = 1 To Nbre
lig = .Columns(15).Find(Mot, .Cells(lig, 15), , xlWhole).Row  ' mettre même chiffre dans columns(*) et cells(lig, *)
        With .Range(.Cells(lig, 1), .Cells(lig, 20)).Interior   'colorier les cellules de A a T
            .PatternColorIndex = xlAutomatic
             .Color = 5296274
         End With
Next n
MyValue = MsgBox(" Le N° de fiche " & Mot & " a été trouvé ", vbOKOnly, " Recherche Fiche ")
End If
End If
End With
 

Merci pour votre aide

5 réponses

  1. volfoss Messages postés 43 Statut Membre 3
     

    Merci j'avais volontairement mis que la partie du code qui fonctionne

    2
  2. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
     

    Je pense voir le problème ! Le code utilise la colonne H pour déterminer la dernière ligne.

    Essayez ceci :

    Sub RechercheMultiColonnes()
        Dim Mot As String, MyValue As String
        Dim lig As Long, n As Long
        Dim Plage As Range, CelluleTrouvee As Range
        Dim DerniereColonne As Long, DerniereLigne As Long
        Dim Nbre As Long
        Dim i As Long, DerniereLigneTemp As Long
        
        'Recherche feuille "Registre"
        With Worksheets("Registre")
            'Définition de la variable à rechercher
            Mot = InputBox("Saisir le N° de fiche à chercher. ", Title:="Recherche Fiche")
            
            'Réponse non vide
            If Mot <> "" Then
                'Trouver la dernière ligne utilisée dans la plage H à V
                DerniereLigne = 7  ' Valeur par défaut
                
                'Vérifier chaque colonne de H à V pour trouver la vraie dernière ligne
                For i = 8 To 22  ' Colonnes H(8) à V(22)
                    DerniereLigneTemp = .Cells(.Rows.Count, i).End(xlUp).Row
                    If DerniereLigneTemp > DerniereLigne Then
                        DerniereLigne = DerniereLigneTemp
                    End If
                Next i
                
                'S'assurer qu'on a au moins la ligne 7
                If DerniereLigne < 7 Then DerniereLigne = 7
                
                'Plage de recherche : H7 à V[dernière ligne]
                Set Plage = .Range("H7:V" & DerniereLigne)
                
                'Compter le nombre d'occurrences dans toute la plage
                Nbre = Application.CountIf(Plage, Mot)
                
                If Nbre = 0 Then    'Message en cas de mot inexistant
                    MyValue = MsgBox(" Le N° de fiche " & Mot & " n'est pas enregistré ", , " Recherche Fiche ")
                Else
                    'Recherche et changement couleur sur les cellules contenant le Mot
                    Set CelluleTrouvee = Plage.Find(What:=Mot, LookIn:=xlValues, LookAt:=xlWhole)
                    
                    If Not CelluleTrouvee Is Nothing Then
                        Dim PremiereTrouvee As String
                        PremiereTrouvee = CelluleTrouvee.Address
                        
                        'Boucle pour colorier toutes les lignes contenant le mot
                        Do
                            lig = CelluleTrouvee.Row
                            'Colorier les cellules de A à T pour la ligne trouvée
                            With .Range(.Cells(lig, 1), .Cells(lig, 20)).Interior
                                .PatternColorIndex = xlAutomatic
                                .Color = 5296274
                            End With
                            
                            'Chercher la prochaine occurrence
                            Set CelluleTrouvee = Plage.FindNext(CelluleTrouvee)
                            
                        Loop While Not CelluleTrouvee Is Nothing And CelluleTrouvee.Address <> PremiereTrouvee
                    End If
                    
                    MyValue = MsgBox(" Le N° de fiche " & Mot & " a été trouvé " & Nbre & " fois ", vbOKOnly, " Recherche Fiche ")
                End If
            End If
        End With
    End Sub

    Si la colonne H est vide, la macro ne prend pas en compte les lignes où il n'y a de données que dans les colonnes I à V. J'ai remplacé une instruction par une boucle qui vérifie toutes les colonnes de H à V


    1
    1. volfoss Messages postés 43 Statut Membre 3
       

      Nickel tout fonctionne

      1
  3. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
     

    Bonjour,

    Je vois le problème ! Votre macro actuelle recherche uniquement dans la colonne O (colonne 15). Pour étendre la recherche aux colonnes H à V, vous devez modifier la logique pour rechercher dans une plage multi-colonnes.
    Voici le code modifié pour rechercher dans les colonnes H à V :

    Sub RechercheMultiColonnes()
        Dim Mot As String, MyValue As String
        Dim lig As Long, n As Long
        Dim Plage As Range, CelluleTrouvee As Range
        Dim DerniereColonne As Long, DerniereLigne As Long
        Dim Nbre As Long
        
        'Recherche feuille "Registre"
        With Worksheets("Registre")
            'Définition de la variable à rechercher
            Mot = InputBox("Saisir le N° de fiche à chercher. ", Title:="Recherche Fiche")
            
            'Réponse non vide
            If Mot <> "" Then
                'Définir la plage de recherche (colonnes H à V, lignes 7 à dernière ligne utilisée)
                DerniereLigne = .Cells(.Rows.Count, 8).End(xlUp).Row  ' Colonne H pour déterminer la dernière ligne
                If DerniereLigne < 7 Then DerniereLigne = 7
                
                'Plage de recherche : H7 à V[dernière ligne]
                Set Plage = .Range("H7:V" & DerniereLigne)
                
                'Compter le nombre d'occurrences dans toute la plage
                Nbre = Application.CountIf(Plage, Mot)
                
                If Nbre = 0 Then    'Message en cas de mot inexistant
                    MyValue = MsgBox(" Le N° de fiche " & Mot & " n'est pas enregistré ", , " Recherche Fiche ")
                Else
                    'Recherche et changement couleur sur les cellules contenant le Mot
                    Set CelluleTrouvee = Plage.Find(What:=Mot, LookIn:=xlValues, LookAt:=xlWhole)
                    
                    If Not CelluleTrouvee Is Nothing Then
                        Dim PremiereTrouvee As String
                        PremiereTrouvee = CelluleTrouvee.Address
                        
                        'Boucle pour colorier toutes les lignes contenant le mot
                        Do
                            lig = CelluleTrouvee.Row
                            'Colorier les cellules de A à T pour la ligne trouvée
                            With .Range(.Cells(lig, 1), .Cells(lig, 20)).Interior
                                .PatternColorIndex = xlAutomatic
                                .Color = 5296274
                            End With
                            
                            'Chercher la prochaine occurrence
                            Set CelluleTrouvee = Plage.FindNext(CelluleTrouvee)
                            
                        Loop While Not CelluleTrouvee Is Nothing And CelluleTrouvee.Address <> PremiereTrouvee
                    End If
                    
                    MyValue = MsgBox(" Le N° de fiche " & Mot & " a été trouvé " & Nbre & " fois ", vbOKOnly, " Recherche Fiche ")
                End If
            End If
        End With
    End Sub

    0
    1. volfoss Messages postés 43 Statut Membre 3
       

      Mon tableau est évolutif par le rajout de ligne au fur et à mesure de nouvelles entrées, le code ne recherche pas dans la ligne que je rajoute à la fin de mon tableau

      0
  4. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
     

    Merci pour la précision ! Si votre tableau est évolutif avec des lignes ajoutées dynamiquement et que la macro ne recherche pas dans la dernière ligne ajoutée, c'est probablement parce que la plage de recherche (Plage) n'est pas correctement mise à jour pour inclure la dernière ligne. Cela peut arriver si la détermination de la dernière ligne via .Range("H" & Rows.Count).End(xlUp).Row ne prend pas en compte les nouvelles lignes ajoutées dynamiquement.

    Essayez ceci :

    Sub RechercheFicheMultiColonnes()
        Dim Mot As String, MyValue As String
        Dim lig As Long, col As Long
        Dim Plage As Range
        Dim Nbre As Long
        Dim Found As Boolean
        Dim DerniereLigne As Long
    
        'Recherche dans la feuille "Registre"
        With Worksheets("Registre")
            'Définition de la variable à rechercher
            Mot = InputBox("Saisir le N° de fiche à chercher.", Title:="Recherche Fiche")
            
            'Vérifier si la réponse n'est pas vide
            If Mot <> "" Then
                'Trouver la dernière ligne non vide parmi les colonnes H à V
                DerniereLigne = 7 'Ligne minimale par défaut
                For col = 8 To 22 'Colonnes H à V
                    DerniereLigne = Application.Max(DerniereLigne, .Cells(.Rows.Count, col).End(xlUp).Row)
                Next col
                
                'Définir la plage de recherche (colonnes H à V, à partir de la ligne 7 jusqu'à la dernière ligne)
                Set Plage = .Range("H7:V" & DerniereLigne)
                Nbre = Application.CountIf(Plage, Mot) 'Compte le nombre d'occurrences de Mot dans la plage
                
                'Si aucune occurrence n'est trouvée
                If Nbre = 0 Then
                    MyValue = MsgBox("Le N° de fiche " & Mot & " n'est pas enregistré.", , "Recherche Fiche")
                Else
                    Found = False
                    'Parcourir chaque colonne de H (8) à V (22)
                    For col = 8 To 22
                        lig = 7 'Ligne de départ pour la recherche
                        'Rechercher dans la colonne courante
                        Do
                            On Error Resume Next
                            Set Plage = .Cells(lig, col).Find(What:=Mot, After:=.Cells(lig, col), LookIn:=xlValues, LookAt:=xlWhole)
                            On Error GoTo 0
                            
                            If Not Plage Is Nothing Then
                                lig = Plage.Row
                                'Colorier les cellules de A à T sur la ligne trouvée
                                With .Range(.Cells(lig, 1), .Cells(lig, 20)).Interior
                                    .PatternColorIndex = xlAutomatic
                                    .Color = 5296274
                                End With
                                Found = True
                                lig = lig + 1 'Passer à la ligne suivante pour continuer la recherche
                            Else
                                Exit Do 'Sortir de la boucle si rien n'est trouvé dans cette colonne
                            End If
                        Loop Until lig > DerniereLigne
                    Next col
                    
                    'Afficher le message de confirmation si au moins une occurrence a été trouvée
                    If Found Then
                        MyValue = MsgBox("Le N° de fiche " & Mot & " a été trouvé.", vbOKOnly, "Recherche Fiche")
                    End If
                End If
            End If
        End With
    End Sub

    0
    1. volfoss Messages postés 43 Statut Membre 3
       

      Avec ce code il ne se passe plus rien

      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Bruno83200_6929 Messages postés 725 Date d'inscription   Statut Membre Dernière intervention   170
     

    Pourriez-vous le donner l'ensemble de votre code initial du début. Merci !


    0
    1. volfoss Messages postés 43 Statut Membre 3
       

      Merci pour votre aide en fait le premier code fonctionne il faut juste remplir la colonne H car si elle est vide le code ne prend pas en compte cette ligne même s'il y  a une valeur dans la colonne I.

      0