Recherchez une valeur dans plusieurs colonne
Résoluvolfoss Messages postés 37 Date d'inscription Statut Membre Dernière intervention -
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
- Moyenne.si excel
- Déplacer une colonne excel - Guide
- Trier une colonne excel - Guide
- Formule moyenne excel plusieurs colonnes - Guide
- Colonne word - Guide
- Formule somme excel colonne - Guide
5 réponses
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question