Compter les lignes dans une feuille en présence de filtres activés - Compter le nombre de lignes sélectionnées

Legendre

XLDnaute Nouveau
Bonjour
Je souhaite compter les lignes de ma feuille (onglet)
Pour ce faire j'ai le code suivant (Sans filtres activés)
-----------------------------------------------------------------------------------------
Private Sub CommandButton23_Click()
If ActiveWorkbook.Name <> ThisWorkbook.Name Then ThisWorkbook.Activate
Dim compteur, derligne As Integer
Dim cellule As Range
derligne = Worksheets("Materiels").Range("A" & Rows.Count).End(xlUp).Row
For Each cellule In Worksheets("Fiches").Range("A2:A" & derligne)
If cellule <> 0 Then
compteur = compteur + 1
End If
Next
'MsgBox compteur
MsgBox "Nombre de Matériels : " & compteur
End Sub
---------------------------------------------------------------------------------------
Cependant, comment puis-je améliorer le code en présence de filtres activés afin de ne compter que les lignes filtrées et non la totalité des lignes de l'onglet "Matériels" ?

Merci

Jacques
 

Dudu2

XLDnaute Barbatruc
Bonjour,

Déjà l'instruction communément utilisée:
VB:
derligne = Worksheets("Materiels").Range("A" & Rows.Count).End(xlUp).Row
est sensible aux lignes filtrées, ce que peu de monde sait.
Donc si les dernières lignes sont filtrées elle ne seront pas comptées.

Pour obtenir le n° de dernière ligne de manière sûre et non sensible au filtrage, utiliser l'instruction:
VB:
With Application
    derligne = .Max(.IfError(.Match("z",  Worksheets("Materiels") .Columns(1)), 0), .IfError(.Match(9 ^ 99,  Worksheets("Materiels") .Columns(1)), 0))
End With

Pour compter les lignes non filtrées:
VB:
NbLignesNonFiltrées =  Worksheets("Materiels").Range("A1:A" & derligne).SpecialCells(xlCellTypeVisible).Count

Pour compter les lignes filtrées:
VB:
NbLignesFiltrées =  derligne - Worksheets("Materiels").Range("A1:A" & derligne).SpecialCells(xlCellTypeVisible).Count
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Legendre, bonjour le forum,

Peut-être comme ça :

VB:
Private Sub CommandButton23_Click()
Dim C As Workbook
Dim M As Worksheet, F As Worksheet
Dim compteur As Integer, derligne As Integer
Dim cellule As Range

Set C = ThisWorkbook
Set M = C.Worksheets("Materiels")
Set F = C.Worksheets("Fiches")
derligne = M.Range("A" & Rows.Count).End(xlUp).Row
For Each cellule In F.Range("A2:A" & derligne)
    If cellule.Value <> 0 And F.Rows(cellule.Row).Visible = True Then
        compteur = compteur + 1
    End If
Next
MsgBox "Nombre de Matériels : " & compteur
End Sub

[Édition]
Bonjour Dudu, nos posts se sont croisés...
 

Legendre

XLDnaute Nouveau
Bonjour Legendre, bonjour le forum,

Peut-être comme ça :

VB:
Private Sub CommandButton23_Click()
Dim C As Workbook
Dim M As Worksheet, F As Worksheet
Dim compteur As Integer, derligne As Integer
Dim cellule As Range

Set C = ThisWorkbook
Set M = C.Worksheets("Materiels")
Set F = C.Worksheets("Fiches")
derligne = M.Range("A" & Rows.Count).End(xlUp).Row
For Each cellule In F.Range("A2:A" & derligne)
    If cellule.Value <> 0 And F.Rows(cellule.Row).Visible = True Then
        compteur = compteur + 1
    End If
Next
MsgBox "Nombre de Matériels : " & compteur
End Sub

[Édition]
Bonjour Dudu, nos posts se sont croisés...
Bonjour Legendre, bonjour le forum,

Peut-être comme ça :

VB:
Private Sub CommandButton23_Click()
Dim C As Workbook
Dim M As Worksheet, F As Worksheet
Dim compteur As Integer, derligne As Integer
Dim cellule As Range

Set C = ThisWorkbook
Set M = C.Worksheets("Materiels")
Set F = C.Worksheets("Fiches")
derligne = M.Range("A" & Rows.Count).End(xlUp).Row
For Each cellule In F.Range("A2:A" & derligne)
    If cellule.Value <> 0 And F.Rows(cellule.Row).Visible = True Then
        compteur = compteur + 1
    End If
Next
MsgBox "Nombre de Matériels : " & compteur
End Sub

[Édition]
Bonjour Dudu, nos posts se sont croisés...
Merci Robert
Mais j'ai fais une erreur dans mon code de départ
Corriger
derligne = Worksheets("Materiels").Range("A" & Rows.Count).End(xlUp).Row
For Each cellule In Worksheets("Fiches").Range("A2:A" & derligne)
Pour lire
derligne = Worksheets("Materiels").Range("A" & Rows.Count).End(xlUp).Row
For Each cellule In Worksheets("Materiels").Range("A2:A" & derligne)
pour lire
 

job75

XLDnaute Barbatruc
Bonjour Legendre, Dudu2, Robert,

Compter les cellules d'une feuille filtrée se fait avec la fonction SOUS.TOTAL.

Si CommandButton23 est sur la feuille filtrée nommée "Materiels" :
VB:
Private Sub CommandButton23_Click()
MsgBox "Nombre de Matériels : " & Application.Subtotal(3, Range("A2:A" & Rows.Count))
End Sub
Si le bouton n'est pas sur cette feuille :
VB:
Private Sub CommandButton23_Click()
With ThisWorkbook.Sheets("Materiels")
    MsgBox "Nombre de Matériels : " & Application.Subtotal(3, .Range("A2:A" & .Rows.Count))
End With
End Sub
A+
 

Legendre

XLDnaute Nouveau
Merci Robert
Mais j'ai fais une erreur dans mon code de départ
Corriger
derligne = Worksheets("Materiels").Range("A" & Rows.Count).End(xlUp).Row
For Each cellule In Worksheets("Fiches").Range("A2:A" & derligne)
Pour lire
derligne = Worksheets("Materiels").Range("A" & Rows.Count).End(xlUp).Row
For Each cellule In Worksheets("Materiels").Range("A2:A" & derligne)
pour lire

Bonjour j'ai adapté le code suivant
Private Sub CommandButton31_Click()
Dim C As Workbook
Dim M As Worksheet
Dim compteur As Integer, derligne As Integer
Dim cellule As Range
Set C = ThisWorkbook
Set M = C.Worksheets("Materiels")
derligne = M.Range("A" & Rows.Count).End(xlUp).Row
For Each cellule In M.Range("A2:A" & derligne)
If cellule.Value <> 0 Then
compteur = compteur + 1
End If
Next
MsgBox "Nombre de Matériels : " & compteur
End Sub

J'ai utilisé un filtre et deux lignes sont affichées dans mon onglet "Matériels", je m'attendais à avoir deux plutot que 362 qui correspond au numéro ou emplacement de deuxième ligne affichée suite au filtre
 

Legendre

XLDnaute Nouveau
Bonjour Legendre, Dudu2, Robert,

Compter les cellules d'une feuille filtrée se fait avec la fonction SOUS.TOTAL.

Si CommandButton23 est sur la feuille filtrée nommée "Materiels" :
VB:
Private Sub CommandButton23_Click()
MsgBox "Nombre de Matériels : " & Application.Subtotal(3, Range("A2:A" & Rows.Count))
End Sub
Si le bouton n'est pas sur cette feuille :
VB:
Private Sub CommandButton23_Click()
With ThisWorkbook.Sheets("Materiels")
    MsgBox "Nombre de Matériels : " & Application.Subtotal(3, .Range("A2:A" & .Rows.Count))
End With
End Sub
A+
Bonjour
Mon problème est résolu avec la solution de job75
Code suivant :
MsgBox "Nombre de Matériels : " & Application.Subtotal(3, Range("A2:A" & Rows.Count))
Merci à vous c'est plaisant quand cela fonctionne
 

Discussions similaires

Statistiques des forums

Discussions
311 716
Messages
2 081 848
Membres
101 826
dernier inscrit
dododu89