Filtre via l'entête combiné à une boucle
Bonjour à tous,
Je sollicite votre aide car, je souhaite mettre en place un filtre qui s'appliquera en fonction du nom de l'en-tête et qui sélectionnera le contenu de la colonne en question (jusqu'ici ça va).
Afin d'anticiper la modification de l'en-tête, je souhaite mettre en place, une inputbox qui, dès que le nom n'est pas retrouvé, demandera à l'opérateur d'indiquer le nouveau nom de l'en-tête et tant que le programme ne trouvera pas l'en-tête, l'inputbox réapparaîtra.
Étapes:
1/ Cherche la colonne via l'en-tête et sélection du contenu
2/ L'en-tête n'est pas trouvé -> inputbox
3/ L'en-tête (inputbox) est retrouvé -> sélection du contenu , l'entête (inputbox) n'est pas trouvé -> retour en 2/
Voici le morceau de code que j'ai commencé à écrire:
Sub Col_Selection()
Dim Cel As Range
Dim Cel2 As String
Dim Cel3 As Range
Set Cel = Cells.Find(what:="matricule*")
If Not Cel Is Nothing Then
Cells(1, Cel.Column).Resize(Cells(Rows.Count, Cel.Column).End(xlUp).Row).Select
Else
Cel2 = InputBox("L'en-tête (Matricule) a été renommé. Veuillez renseigner le nouveau nom", "Pilotage et Contrôle")
Set Cel3 = Cells.Find(what:=Cel2)
If Not Cel3 Is Nothing Then
Cells(1, Cel3.Column).Resize(Cells(Rows.Count, Cel3.Column).End(xlUp).Row).Select
Else
End If
End If
End SubMerci par avance.
Cordialement,
Stan95
Bonjour,
vous dite faire une recherche sur l'entete, mais le code est
Set Cel = Cells.Find(what:="matricule*")alors la recherche ne se fait pas sur l'entete mais plutot sur l'ensemble des cellules ?
Bonjour SabV,
En effet j'ai procédé de la sorte car, les noms d'en-tête ne se retrouvent jamais dans le contenu du tableau et ne sont en principe mentionnés qu'une seule fois dans la feuille. De plus, le fichier que l'on reçois (Service externe) peut contenir certaines modifications comme, l'ajout d'une ligne au dessus de l'en-tête, le changement de nom d'un en-tête ou le déplacement d'une colonne.
En utilisant les coordonnées des cellules, la moindre modification entraînait des erreurs (filtre appliqué sur la mauvaise ligne, sélection incomplète/décalée, etc.).
D'où l’intérêt pour moi de sélectionner le contenu de la colonne en fonction du nom de l'en-tête (pré-renseigné), tout en donnant la possibilité à l'opérateur de saisir lui-même le nouveau nom, dans le cas où l'en-tête aurait été modifié.
Cordialement,
Stan
Bonjour,
pouvez-vous joindre un fichier ?
Bonjour,
avec range.find tu dois préciser systématiquement les valeurs des paramètres lookat et lookin.
Ce sont les paramètres de la boite de dialogue qui sont utilisés, et si un utilisateur a fait une recherche auparavant par exemple en décochant 'totalité du contenu de la cellule' ta recherche sera faussée.
eric
Bonjour à tous,
Merci Eriiic pour votre conseil. En effet lors de tests je me suis aperçu que la recherche était approximative mais, sur le coup ce n’était pas l'ordre du jour.
Sinon, j'ai enfin trouvé une solution assez simple:
Sub Col_Selection()
Dim Cel As Range
Dim Cel2 As String
Dim Cel3 As Range
Set Cel = Cells.Find(what:="matricule*", LookIn:=xlValues, LookAt:=xlWhole)
If Not Cel Is Nothing Then
Cells(1, Cel.Column).Resize(Cells(Rows.Count, Cel.Column).End(xlUp).Row).Select
Else
retour:
Cel2 = InputBox("L'en-tête (Matricule) a été renommé !" & vbCrLf & "Veuillez renseigner le nouveau nom", "Pilotage et Contrôle")
Set Cel3 = Cells.Find(what:=Cel2)
If Cel3 Is Nothing Then
MsgBox "Le nom renseigné est introuvable. Veuillez recommencer", , "Pilotage et Contrôle"
GoTo retour
Else
Cells(1, Cel3.Column).Resize(Cells(Rows.Count, Cel3.Column).End(xlUp).Row).Select
End If
End If
End SubBonne journée.
Stan
Bonjour,
- tu peux restreindre la recherche à la plage utilisée avec .UsedRange
- "*" ne fonctionne pas avec .find, tu peux changer xlWhole
- l'utilisateur ne peut pas abandonner (normal ?)
- je n'aime pas trop les goto (hors traitements d'erreur)
- pas sûr qu'une 2nde msgbox à valider soit bien utile
Je te propose :
Sub Col_Selection()
Dim Cel As Range, nom As String
nom = "matricule"
Do While nom <> ""
Set Cel = ActiveSheet.UsedRange.Find(what:=nom, LookIn:=xlValues, LookAt:=xlWhole)
If Not Cel Is Nothing Then
Cells(1, Cel.Column).Resize(Cells(Rows.Count, Cel.Column).End(xlUp).Row).Select
nom = ""
Else
nom = InputBox("L'en-tête (Matricule) a été renommé !" & vbCrLf & "Veuillez renseigner le nouveau nom", "Pilotage et Contrôle")
End If
Loop
Set Cel = Nothing
End Suberic