Filtrer par macro
Bonjour,
j'ai fait une macro qui filtre une feuille en partant de la colonne B Ligne 1 et c'est ok
If Me.CmbBxName.ListIndex = -1 Then Exit Sub B = colonne 2
Maintenant j'aimerai une macro qui filtre de la colonne F (F=6) Ligne 1
Mais je ne comprend pas la logique du code.
Dim OffAction As Boolean
Private Sub CmdBtnFermer_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()
Application.ScreenUpdating = False
Me.Height = Application.Height
Me.Width = Application.Width
End Sub
'************************ COMMANDE BOUTON FILTRER PAR NAME **************************
'
Private Sub CmbBxName_Change()
If Me.CmbBxName.ListIndex = -1 Then Exit Sub
If OffAction = True Then Exit Sub
TextBox2.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 1).Value
TextBox3.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 2).Value
TextBox4.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 3).Value
TextBox5.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 4).Value
TextBox6.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 5).Value
TextBox7.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 6).Value
TextBox8.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 7).Value
TextBox9.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 8).Value
TextBox10.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 9).Value
TextBox11.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 10).Value
TextBox13.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 11).Value
TextBox14.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 12).Value
TextBox15.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 13).Value
TextBox16.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 14).Value
TextBox17.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 15).Value
TextBox18.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 16).Value
TextBox19.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 17).Value
TextBox20.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 18).Value
TextBox21.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 19).Value
TextBox22.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 20).Value
TextBox23.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 21).Value
TextBox12.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 22).Value
End Sub
'************************ COMMANDE BOUTON FILTRER PAR TEL **************************
'
Private Sub CmbBxTel_Change()
If Me.CmbBxTel.ListIndex = -1 Then Exit Sub
If OffAction = True Then Exit Sub
TextBox2.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 1).Value
TextBox3.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6 2).Value
TextBox4.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 3).Value
TextBox5.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 4).Value
TextBox6.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 5).Value
TextBox7.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 6).Value
TextBox8.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 7).Value
TextBox9.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 8).Value
TextBox10.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex +6, 9).Value
TextBox11.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 10).Value
TextBox13.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 11).Value
TextBox14.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex +6, 12).Value
TextBox15.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 13).Value
TextBox16.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex +6, 14).Value
TextBox17.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 15).Value
TextBox18.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 16).Value
TextBox19.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex +6, 17).Value
TextBox20.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 18).Value
TextBox21.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 19).Value
TextBox22.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 20).Value
TextBox23.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 6, 21).Value
TextBox12.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex +6, 22).Value
End Sub
Je ne peut vous joindre un fichier car trop de données privées
Merci pour votre aide.
Bonjour,
je ne comprend pas la logique du code
C'est quoi que tu ne comprends pas car si c'est toi qui a fais le code comment peux-tu ne pas en comprendre la logique ?
De toutes façons, ce n'est pas un filtrage qui est réalisé mais juste une récup de valeurs sur une ligne (colonnes A à V) définie par l'index de la combobox !
Entre parenthèses, si tu n'avait pas cette ligne là (suite à une modif de l'userform je pense) :
TextBox12.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 22).Value
tu aurais pus utiliser une boucle afin de raccourcir...
For I = 2 To 23
Me.Controls(" TextBox" & I).Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, I - 1).Value
Next I
Avec ceci :
.Cells(CmbBxName.ListIndex + 6, 1).Value
tu récupère les valeurs situées 5 lignes (ListIndex de la combo commençant à 0) plus bas que la position de l'item sélectionné dans la combo donc, si tu veux faire un filtrage, il faut procéder tout autrement.
Il te faut effectuer un filtrage avec "AutoFilter" sur une plage définie du genre (avec "UsedRange" ici, les valeurs sont sensées commencer en colonne A) :
Set Plage = Worksheets("Feuil1").UsedRange
With Plage
'colonne B
.AutoFilter 2, Me.CmbBxName.Text & "*"
End With
et ensuite, récupérer les lignes filtrées comme par exemple le numéro des lignes dans un tableau car il y a de fortes chances pour que plusieurs enregistrements soient retournés :
Dim Tbl() As Long 'en tête du module du formulaire...
Sub Filtre()
Dim Plage As Range
Dim Cel As Range
Set Plage = Worksheets("Feuil1").UsedRange
With Plage
'colonne B
.AutoFilter 2, Me.CmbBxName.Text & "*"
End With
For Each Cel In Plage.Rows
If Cel.EntireRow.Hidden = False Then
I = I + 1
ReDim Preserve Tbl(1 To I)
Tbl(I) = Cel.Row
End If
Next Cel
End Sub
Ceci fait, à l'aide par exemple d'un contrôle Toupie dont tu défini les bornes en fin de filtrage comme ceci :
Sub Filtre()
Dim Plage As Range
Dim Cel As Range
Set Plage = Worksheets("Feuil1").UsedRange
With Plage
'colonne B
.AutoFilter 2, Me.CmbBxName.Text & "*"
End With
For Each Cel In Plage.Rows
If Cel.EntireRow.Hidden = False Then
I = I + 1
ReDim Preserve Tbl(1 To I)
Tbl(I) = Cel.Row
End If
Next Cel
Me.SpinButton1.Max = 1
Me.SpinButton1.Max = UBound(Tbl)
End Sub
tu fais défiler les valeurs des lignes dans tes contrôles :
Private Sub SpinButton1_Change()
TextBox2.Text = Sheets("Annuaire").Cells(Tbl(SpinButton1.Value), 1).Value
TextBox3.Text = Sheets("Annuaire").Cells(Tbl(SpinButton1.Value), 2).Value
TextBox4.Text = Sheets("Annuaire").Cells(Tbl(SpinButton1.Value), 3).Value
TextBox5.Text = Sheets("Annuaire").Cells(Tbl(SpinButton1.Value), 4).Value
TextBox6.Text = Sheets("Annuaire").Cells(Tbl(SpinButton1.Value), 5).Value
TextBox7.Text = Sheets("Annuaire").Cells(Tbl(SpinButton1.Value), 6).Value
'etc...
End Sub
Ceci n'est qu'une ébauche mais ça te donne une direction. Bon courage.
Hervé.
Bonjour Hervé,
Entre parenthèses, si tu n'avait pas cette ligne là (suite à une modif de l'userform je pense) :
TextBox12.Text = Sheets("Annuaire").Cells(CmbBxName.ListIndex + 1, 22).Value
Cette ligne est déplacée en bas du code, comme tu le dis suite à un changement sur le UserForm.
Merci pour ton code.
Voilà de quoi me faire passer un week-end au chaud pour tout comprendre.
Merci très sincèrement