DataBodyRangeVisible > areas > count AVEC contrainte

Bonsoir à tous,

Ce soir je réfléchis à une manière d'aborder et solutionner mon problème : comptage de la quantité de data visible d'un tableau filtré par type (ligne ; colonne ou cellule) via une fonction.

Contrainte : existence potentielle de groupes de colonne à l'état groupé ou dégroupé.

Sub comptelignevisible()
Dim lstoE As ListObject
    Set lstoE = [Encours].ListObjects("Tbl_encours")
    Nbligne = DataBodyRangeVisible(lstoE, 1)
    MsgBox Nbligne
End Sub
Function DataBodyRangeVisible(xlsto As ListObject, Optional mode& = 0) As Long
'*** Compte la quantité visible de data : par qte de cellule, ligne ou colonne
'*** mode = 0 pour cellules / = 1 pour lignes / = 2 pour colonnes
Dim NbVisible&, area As Range

    NbVisible = 0
    On Error Resume Next 'SpecialCells retourne une erreur si rien n'est trouvé
    For Each area In xlsto.DataBodyRange.SpecialCells(xlCellTypeVisible).Areas
        If mode = 0 Then NbVisible = NbVisible + area.Columns.Count * area.Rows.Count
        If mode = 1 Then NbVisible = NbVisible + area.Rows.Count
        If mode = 2 Then NbVisible = NbVisible + area.Columns.Count
    Next
    On Error GoTo 0
    DataBodyRangeVisible = NbVisible

End Function

Je souhaite rendre ce code fiable en toute circonstance :

test

Contraintes supplémentaires :

- pas d'intervention dans la feuille du genre .Outline.ShowLevels

- une astuce pour éviter un code bouclant sur les .EntireRow.Hidden ou entirecolumn etc...

Ca revient peut être à tenter de conduire sans se servir de ses mains, mais on sait jamais, si un malin voit ce poste
Quoi qu'il en soit et comme toujours, merci d'avance d'avoir au moins lu ce sujet

19test.xlsm (19.35 Ko)

EDIT : le best du best serait aussi la (non) prise en compte des lignes masquées manuellement. Je crois de mémoire que excel "triche" en leur appliquant une hauteur de ligne =0

Bonjour le forum, tomato 🙂

Peut-être voir du côté de la fonction Sous.Total, si j'ai bien compris

klin89

Bonsoir tomato,

Je ne comprends pas votre principe de "For Each Area"

Pour compter le nombre de ligne affichée, pour moi, c'est simple...

Sub CompterLignesVisibles()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim lignesVisibles As Range
    Dim nombreLignes As Long
    ' Définir la feuille contenant le tableau
    Set ws = ThisWorkbook.Worksheets("Encours")
    ' Référencer le tableau structuré
    Set tbl = ws.ListObjects("Tbl_encours")
    ' Vérifier si le tableau a des lignes visibles
    On Error Resume Next
    Set lignesVisibles = tbl.DataBodyRange.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    ' Calculer le nombre de lignes visibles
    If Not lignesVisibles Is Nothing Then
        nombreLignes = lignesVisibles.Rows.Count
    Else
        nombreLignes = 0 ' Aucun résultat visible
    End If
    ' Afficher le résultat
    MsgBox "Le nombre de lignes visibles est : " & nombreLignes, vbInformation, "Résultat"
End Sub

J'ai dû louper quelque chose

A+

Bonjour JExcelL2fr, votre solution ne fonctionne pas dans le cas de champs discontinus.

Bonjour Klin89, effectivement la formule sous-total est fonctionnelle dans le cas d'un comptage de ligne, pas de colonne, ni cellule et encore moins concernant des lignes masquées. C'est d'ailleurs cette fonction que j'utilise ici dans le fichier de test :

test2

Re,

Question, ça vous sert à quoi de compter le nombre de cellules non vides discontinues

Alors que dans votre exemple, vous montrer vouloir compter le nombre de lignes...

Il semble que vous n'avez pas compris ma réponse : la procédure Rows.Count dans un tableau filtré lorsque appliqué sur un specialcellsvisible n'est pas fiable puisqu'elle se limite aux bornes du premier area visible.

Pour vous en rendre compte je vous invite à tester votre développement sur mon fichier "test" joint sur lequel vous aurez au préalable décoché la valeur "A16" de l'autofiltre de la colonne "Article".

Bonne soirée

en supposant que "Article" contient n'est jamais vide

Sub comptelignevisible()
     i = WorksheetFunction.Subtotal(103, Range("tbl_encours[article]"))
End Sub

comme les colonnes entre E et I sont cachées, le nombre d'areas est le double que vous pensez.

Bonsoir Bart, je cherche à sortir une fonction all-in-one opérable selon que l'on compte soit ligne, soit colonne, soit cellule. Elle devra tenir compte des lignes masquées, des lignes filtrées, et ne pas être perturbée par la présence de groupes masqués. Je vois au vu des premiers retours que la seule option est donc de boucler range par range..

Merci à tous

re, un nouveau essai

26test-99.xlsm (22.21 Ko)

Rien à ajouter. Merci Bart

Rechercher des sujets similaires à "databodyrangevisible areas count contrainte"