Filtrer au dernier numéro

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

  • classement.xlsm
    9.5 KB · Affichages: 51
  • classement.xlsm
    9.5 KB · Affichages: 60
  • classement.xlsm
    9.5 KB · Affichages: 57

david84

XLDnaute Barbatruc
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

  • Copie de classement.xls
    46.5 KB · Affichages: 50
  • Copie de classement.xls
    46.5 KB · Affichages: 51
  • Copie de classement.xls
    46.5 KB · Affichages: 54
Dernière édition:

david84

XLDnaute Barbatruc
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+
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
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

  • FiltreDernier.xls
    53 KB · Affichages: 48
  • FiltreDernierFiltreElab.xls
    64.5 KB · Affichages: 44
  • FiltreDernierFiltreElab.xls
    64.5 KB · Affichages: 45
  • FiltreDernierFiltreElab.xls
    64.5 KB · Affichages: 43
Dernière édition:

david84

XLDnaute Barbatruc
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+
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
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

  • FiltreDernierFiltreElab.xls
    63 KB · Affichages: 42
  • FiltreDernierFiltreElab.xls
    63 KB · Affichages: 43
  • FiltreDernierFiltreElab.xls
    63 KB · Affichages: 42
Dernière édition:

david84

XLDnaute Barbatruc
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

  • Copie de FiltreDernierFiltreElab-4.xls
    68.5 KB · Affichages: 42

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
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:

david84

XLDnaute Barbatruc
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:)
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
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

  • Copie de FiltreDernierFiltreElab-1.xls
    57 KB · Affichages: 51
Dernière édition:

Statistiques des forums

Discussions
312 500
Messages
2 089 010
Membres
104 004
dernier inscrit
mista