Filtrer au dernier numéro

  • Initiateur de la discussion Initiateur de la discussion bobnath
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

bobnath

XLDnaute Nouveau
Bonjour à tous,

J’aurai besoin de votre aide, Je voudrais créer un filtre dans la colonne A avec un bouton appelé « Dernière doc », à partir de la colonne D
Ex suivant la pièce jointe : le chiffre 100 est répété 3 fois dans la colonne D. En cliquant sur le bouton, il me donnera que le dernier. Idem pour les autres numéros qui suivent.

Je vous remercie d’avance,
 

Pièces jointes

Re : Filtrer au dernier numéro

Bonsoir,
un essai en PJ :
Code:
Private Sub CommandButton1_Click()
Dim DerL&, i&, j&, Mondico As Object, Plage
DerL = Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row
Plage = Worksheets("Feuil1").Range("D2:D" & DerL)
Set Mondico = CreateObject("Scripting.Dictionary")
j = 1
For i = UBound(Plage) To LBound(Plage) Step -1
      If Not Mondico.Exists(Plage(i, 1)) Then
      Mondico.Add Plage(i, 1), Plage(i, 1)
      Else
      Dim tablo()
      ReDim Preserve tablo(1 To j)
      tablo(j) = i + 1
      j = j + 1
      End If
  Next i
For i = LBound(tablo) To UBound(tablo)
Worksheets("Feuil1").Rows(tablo(i)).Hidden = True
Next i
End Sub
Fichier enregistré en .xls pour que d'autres puissent t'aider.
A+
 

Pièces jointes

Dernière édition:
Re : Filtrer au dernier numéro

Re
si j'ai bien compris ce que tu veux, il te suffit de modifier "Plage" en conséquence et l'y affecter la colonne désirée (cf. code avec l'ancienne plage placée en tant que commentaire et la nouvelle plage :
Code:
Sub Filtre()
Dim DerL&, i&, j&, Mondico As Object, Plage, Résultat&
DerL = Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row
'Plage = Worksheets("Feuil1").Range("D2:D" & DerL) 'ancienne plage colonne D
Plage = Worksheets("Feuil1").Range("C2:C" & DerL) 'nouvelle plage colonne C

Set Mondico = CreateObject("Scripting.Dictionary")
j = 1
For i = UBound(Plage) To LBound(Plage) Step -1
      If Not Mondico.Exists(Plage(i, 1)) Then
      Mondico.Add Plage(i, 1), Plage(i, 1)
      Else
      Dim tablo()
      ReDim Preserve tablo(1 To j)
      tablo(j) = i + 1
      j = j + 1
      End If
  Next i
For i = LBound(tablo) To UBound(tablo)
Worksheets("Feuil1").Rows(tablo(i)).Hidden = True
Next i
End Sub
A+
 
Re : Filtrer au dernier numéro

Bonsoir,

Code:
Sub Filtre()
 Set f = Sheets("feuil1")
 Set Mondico = CreateObject("Scripting.Dictionary")
 For i = f.[A65000].End(xlUp).Row To 2 Step -1
   If Not Mondico.Exists(f.Cells(i, "d").Value) Then Mondico(f.Cells(i, "d").Value) = "" Else f.Rows(i).Hidden = True
  Next i
End Sub

Avec Filtre élaboré

Critère en I2: =ESTERREUR(1/(D2=D3))

Code:
Sub FiltreElab()
  [A1:F10000].AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("I1:I2")
End Sub

JB
 

Pièces jointes

Dernière édition:
Re : Filtrer au dernier numéro

Re
oui JB, ton code est effectivement bien plus épuré et va à l'essentiel.
On pourrait même directement passer par un ToggleButton pour éviter 2 boutons différents :
Code:
Private Sub ToggleButton1_Click()
Set f = Sheets("feuil1")
If ToggleButton1 = True Then
    ToggleButton1.Caption = "Filtre"
    Set Mondico = CreateObject("Scripting.Dictionary")
    For i = f.Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
      If Not Mondico.Exists(f.Cells(i, "d").Value) Then Mondico(f.Cells(i, "d").Value) = "" _
      Else f.Rows(i).Hidden = True
     Next i
Else
    ToggleButton1.Caption = "Affiche tout"
    f.Cells.EntireRow.Hidden = False
End If
End Sub
Concernant la proposition par Filtre élaboré, j'ai eu un résultat bizarre en voulant tester une autre formule sur ton fichier :
- je place en I2
Code:
=D2<>D3
- je filtre et m'aperçois que la dernière ligne du tableau n'est pas prise en compte alors qu'elle renvoie VRAI
- j'enlève le filtre et me place en L2 et tire la formule jusqu'en L11 pour vérifier : L11 me renvoie VRAI et pourtant le filtre ne me prend pas compte cette ligne
- je tire à nouveau la formule jusqu'en L12 puis efface l'ensemble des formules de la colonne L, je filtre à nouveau et cette fois la ligne 11 est prise en compte dans le filtre.
Vois-tu une explication à ce phénomène ?
A+
 
Re : Filtrer au dernier numéro

Bonjour,

>Vois-tu une explication à ce phénomène ?

-Logiquement, la formule du critère devrait être =D2<>D3
-Pour la dernière ligne (ligne11), l'interpréteur Excel va évaluer =D11<>D12 mais pour lui D12 n'appartient pas à la BD. Cette ligne n'est donc pas prise en compte.

-Avec 1/(D2=D3), on obtient une division par 0 à chaque fois que Dn<>Dn+1 . Cette division par 0 est détectée par =EstErreur(1/(Dn=Dn+1).
-Pour la dernière ligne (ligne11), l'interpréteur Excel va évaluer =1/(D11=D12). D12 n'appartenant pas à la BD, il y a une erreur. Celle ci est également détectée par EstErreur()

JB
 

Pièces jointes

Dernière édition:
Re : Filtrer au dernier numéro

Re Jacques
oui, j'avais bien suivi ton raisonnement et étais arrivé à la même conclusion. Ce que je trouve bizarre c'est le fait qu'en plaçant en I2 =D2<>D3, puis tirant en L2 (par exemple) la formule =D2<>D3 jusqu'en L12, puis en effaçant les formules de cette colonne, le filtre fonctionne alors correctement (cf.fichier joint après effacement de la formule
Code:
=D2<>D3
en L2-L12). Et si tu vérifies la plage prise en compte par le filtre, elle n'a pas évolué...
A+
 

Pièces jointes

Re : Filtrer au dernier numéro

Re David,

-Excel doit prendre en considération le UsedRange
-Si on place un caractère qq après la ligne 11 (en P15 e.g.), le filtre fonctionne avec =D2<>D3
-Si on efface la cellule, le UsedRange n'est pas mis à jour
-Pour mettre à jour le UsedRange, il faut supprimer la ligne 15

JB
 
Dernière édition:
Re : Filtrer au dernier numéro

Re re
après avoir effacé l'espace placé dans une ligne située en dessous de la plage A2:F11 (en ligne 12 ou 13,...), j'ai testé :
Code:
Sub test()
ActiveSheet.UsedRange.Select
End Sub
Après avoir lancé ce code, le filtre ne fonctionne plus correctement.
J'ai donc l'impression que la zone active de la feuille de calcul peut influer sur le traitement du filtre élaboré puisque sa "réinitialisation" (simplement en sélectionnant la zone) modifie le résultat.
A+
Edit Jacques : même conclusion🙂
 
Re : Filtrer au dernier numéro

Re David,

La sélection du UsedRange ne le modifie pas.
Avec l'effacement de la cellule, la maj du UsedRange est aléatoire (en fonction de la version Excel).
Avec la suppression de la ligne, la maj est systématique.

JB
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Résolu(e)
Microsoft 365 Macro VBA
Réponses
16
Affichages
3 K
Réponses
6
Affichages
724
Retour