Calculer le nombre de cellule contenant du texte avec un filtre

Bonjour,

J'aurais besoin de votre aide pour un problème que je pensais résoudre sans passer par du VBA, mais je n'y arrive pas.

Dans ma feuille d'exemple, j'aimerais calculer le nombre de fois qu'apparaît un "type de procédure" lorsqu'un filtre est appliqué.

J'ai fait deux essais pour "enquête" en G3 et abattage en H3, mais dans le premier cas j'ai un message d'erreur et dans l'autre cas la formule fonctionne, mais prends tout de même en compte les cellules filtrées.

Dans l'absolu, j'aurais voulu pouvoir résoudre mon problème sans passer par du code, mais si c'est pas possible je suis preneur d'une solution VBA.

Merci d'avance pour le temps pris pour me répondre.

75test.xlsx (9.80 Ko)

bonjour

un essai ( de chez essai)

=SOMMEPROD((SOUS.TOTAL(3;DECALER($D4;LIGNE($1:$141);)))*(NB.SI($D$1:$D$141;$D$1:$D$141)*($D$1:$D$141=J3)))

a saisir en g2 pour ne pas que le resultat soit masqué

cordialement

Bonjour,

Et de quel type de filtre s'agit-il ?

Si tu veux par exemple les types de procédures "enquête" pour la ville de "Lyon", tu fais :

=SOMMEPROD(($B$4:$B$11="Lyon")*($D$4:$D$11="enquête"))

et si tu veux rajouter le filtre "Jean" :

=SOMMEPROD(($B$4:$B$11="Lyon")*($C$4:$C$11="Jean")*($D$4:$D$11="enquête"))

Bonjour,

avec un TCD et un segment.

eric

60test.xlsx (14.97 Ko)

Bonjour tout le monde.

Tout d'abord, merci pour toutes vos réponses

bonjour

un essai ( de chez essai)

=SOMMEPROD((SOUS.TOTAL(3;DECALER($D4;LIGNE($1:$141);)))*(NB.SI($D$1:$D$141;$D$1:$D$141)*($D$1:$D$141=J3)))

a saisir en g2 pour ne pas que le resultat soit masqué

cordialement

Après avoir testé vos solutions, j'ai l'impression que c'est celle de tulipe_4 qui se rapproche le plus de ce que j'aimerais réussir à faire, à savoir compter uniquement les cellules du "type de procédure" quelque soit les autres filtres activés dans les autres colonnes.

Mais en testant le fichier, le nombre indiqué dans la cellule G2 indique 6 alors qu'aucun type de procédure n'apparaît 6 fois.

D’où vient l'erreur ?

Merci

Re bonjour,

Je remets le fichier dans lequel j'ai obtenu 6 dans la cellule G2 puisque que j'ai ajouté quelques lignes pour avoir des résultats différents.

Cordialement

45test.xlsx (10.01 Ko)

Bonjour,

j'ai bien l'impression que le TCD proposé fournit la bonne réponse mais bon...

eric

Avec une fonction perso peut être ?

Function NB_Apres_Filtre(Valeur As String) As Long

    Dim Fe As Worksheet
    Dim I As Long
    Dim NB As Long

    Application.Volatile

    Set Fe = ActiveSheet

    With Fe.AutoFilter.Range

        For I = 2 To .Rows.Count

            If .Cells(I, .Columns.Count).EntireRow.Hidden = False And _
                .Cells(I, .Columns.Count).Value = Valeur Then NB = NB + 1

        Next I

    End With

    NB_Apres_Filtre = NB

End Function

A utiliser de cette façon : =NB_Apres_Filtre(G3)

Ton classeur en retour :

ça fonctionne bien avec ta fonction, merci!

En revanche, j'avais donné cet exemple pour simplifier, car mon fichier est plus complexe. Je vais essayer de transposer ta fonction dans mon fichier, mais je suis à peu prêt sûr que ça n'ira pas comme sur des roulettes, car l'onglet ou il y a les données avec les filtres se trouve sur une feuille différente de celle ou j'aimerais les réponses et qu'il y a bien plus de colonne et de ligne que dans mon exemple. Pourrais-tu m'expliquer ce que je dois changer ?

Sinon, j'ai partiellement résolu le problème sans passer par du code avec cette fonction :

=SOMMEPROD((SOUS.TOTAL(3;DECALER($D4;LIGNE($1:$141)-4;)))*($D$1:$D$141=G3))

Mais à nouveau en la transposant dans mon autre fichier ça ne fonctionne pas correctement. Cela vient, selon moi, du DECALER. J'ai de la peine à comprendre comment fonctionne cette fonction pour l'adapter.

Merci d'avance !

Bonjour,

La fonction modifiée pour prendre en compte que la base est sur une autre feuille et que la valeur à chercher est sur une autre colonne que la dernière. Donc, 1er argument, indiquer sous forme de chaîne le nom de la feuille où se trouve la base de données, second argument, la cellule où se trouve la valeur à chercher et dernier argument, le numéro de colonne dans la base où chercher la valeur :

=NB_Apres_Filtre("Feuil1";D1;9)

La fonction modifiée :

'Feuille = nom de la feuille sous forme de Chaine
'Valeur = valeur à cherchée dans la colonne indiquée
'Col = colonne dans la plage où chercher la valeur
Function NB_Apres_Filtre(Feuille As String, _
                         Valeur As String, _
                         Col As Integer) As Long

    Dim Fe As Worksheet
    Dim I As Long
    Dim NB As Long

    Application.Volatile

    Set Fe = Worksheets(Feuille)

    With Fe.AutoFilter.Range

        For I = 2 To .Rows.Count

            If .Cells(I, Col).EntireRow.Hidden = False And _
                .Cells(I, Col).Value = Valeur Then NB = NB + 1

        Next I

    End With

    NB_Apres_Filtre = NB

End Function

Je te poste un classeur en exemple avec une base de données fictive pour que tu puisses voir le fonctionnement :

Merci beaucoup Theze, c'est exactement ce dont j'avais besoin.

Tout a bien fonctionné du premier coup, en revanche dès le moment où les données de la première feuille ce sont mises à jours j'ai une erreur #VALEUR! dans ma cellule.

Une idée d’où cela peut provenir ?

Petit détail qui a peut-être son importance. Ma feuille Excel est une sorte d'export d'un programme informatique qui se met à jour tout seul dès que nous enregistrons un nouveau dossier sur notre programme.

Merci d'avance

Postes ton fichier anonymisé pour que je puisse tester !

Merci Theze,

L'onglet Requête est encore en construction est complétement en chantier, ne pas faire attention à la mise en page.

Alors voici le problème exact :

Sur la feuille "Requête" dans les cellules I103 à P103 j'ai inscrit la formule que tu m'as donné et ça fonctionne

Par contre si je vais dans l'onglet Dossier et que je change la date dans la cellule B2 ou D2 qui a pour effet d'afficher ou pas tous les dossiers durant cette période. Quand je reviens dans l'onglet requête il affiche une erreur #VALEUR.

Merci d'avance.

On va simplifier la fonction, supprime la précédente et remplace la par celle-ci :

Function NB_Apres_Filtre(Feuille As String, _
                         Valeur As String, _
                         Col As Integer) As Long

    Dim Fe As Worksheet
    Dim I As Long
    Dim NB As Long

    Application.Volatile

    Set Fe = Worksheets(Feuille)

    With Fe

        For I = 2 To .Cells(.Rows.Count, Col).End(xlUp).Row

            If .Cells(I, Col).EntireRow.Hidden = False And _
                .Cells(I, Col).Value = Valeur Then NB = NB + 1

        Next I

    End With

    NB_Apres_Filtre = NB

End Function

Je n'ai pas pus tester car tu as une requête et pour que ça fonctionne avec l'ancienne version, il faut réactiver le filtrage (n'importe quelle colonne réinitialise le filtrage) avec celle-ci, pas besoin !

Merci encore une fois, on se rapproche du but.

J'ai toujours l'erreur #VALEUR qui s'affiche au moment ou je change la date, en revanche si j'enregistre le fichier, le ferme et l'ouvre à nouveau le résultat s'affiche. Peux-tu encore améliorer le code pour corriger ça ?

Merci mille fois!

Peut être avec un "Refresh" de la requête ?

Comment as-tu procédé pour lier le classeur ?

Peut être avec un "Refresh" de la requête ?

Comment as-tu procédé pour lier le classeur ?

Le classeur est lié via une connexion, mais c'est un informaticien qui a tout paramétré.

J'ai désactivé l'actualisation en arrière-plan (voir pièce-jointe) et désormais çà fonctionne!

Merci encore pour tout le temps passé à ma demande et la rapidité. Ce fut vraiment très appréciable.

capture d ecran

Bonjour,

Content de t'avoir aidé

Re bonjour,

Je reviens sur ce topic, car en reprenant mon fichier je constate qu'il y a toujours un problème qui persiste.

Le code vba précédemment fourni par Theze fonctionne bien et si j'active mes filtres manuellement je n'ai aucun problème. En revanche dès le moment où j'utilise des boutons qui activent certains filtres ou les enlèvent, l'erreur #VALEUR! revient et je suis obligé de fermer le fichier et de le reouvrir pour voir le résultat. J'en conclus donc que c 'est la ligne de code ci-dessous qui appelle le tableau qui pose problème ?

ActiveSheet.ListObjects("Tableau_Lancer_la_requête_à_partir_de_apex64").Range. _
AutoFilter field:=9, Criteria1:=Sheets("Requête").Range("J23").Value

Y a t-il une solution ? Est-ce qu'il faut chercher dans une autre méthode pour filtrer les colonnes ou plutôt dans le code qui fait apparaître les valeurs ?

Je remet mon fichier en pièce-jointe au cas où quelqu'un d'autres serait intéresser à ce cas

Merci d'avance.

Rechercher des sujets similaires à "calculer nombre contenant texte filtre"