Compter les cellules colorer avec MFC et filtrées

Résolu/Fermé
kim67 - 12 nov. 2012 à 11:11
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 21 nov. 2012 à 17:11
Bonjour,

J'ai mis une formule qui me permet de mettre en couleur les cases dans lesquelles les dates sont inférieures à celle du jour J.

Maintenant je souhaiterai mettre en place une formule qui compte ces cases colorées sans rajouter une colonne, a savoir qu'il y a des données filtrées qui ne sont, évidement pas à prendre en compte.

En effet, il s'agit de données tirées de tableaux et mis à jour à chaque ouverture.

Avez-vous une solution ?

A voir également:

7 réponses

pépé35530 Messages postés 2942 Date d'inscription vendredi 1 mai 2009 Statut Membre Dernière intervention 19 mars 2016 1 386
12 nov. 2012 à 11:58
Bonjour,

Pourquoi ne pas utiliser la focntion nb.si avec le même critère que pour les cases colorées ?

A+

pépé
0
Bonjour,

J'ai déjà essayé avec cette formule :

=count.if(A2;A19;<TODAY())

Mais Excel ne l'accepte pas. Probablement ai-je oublié quelque chose ?
0
chossette9 Messages postés 4239 Date d'inscription lundi 20 avril 2009 Statut Contributeur Dernière intervention 12 septembre 2014 1 308
12 nov. 2012 à 13:13
Bonjour,

il faut écrire A2:A19 (deux points) et non pas A2;A19 (point virgule) pour indiquer une plage.
0
pardon oui, erreur de recopie de ma part désolée !

J'ai donc bien mis la "bonne" formule (avec ":" et non ";") et ça ne fonctionne pas.
0
chossette9 Messages postés 4239 Date d'inscription lundi 20 avril 2009 Statut Contributeur Dernière intervention 12 septembre 2014 1 308
12 nov. 2012 à 13:20
Il faut mettre le symbole < entre guillemets, et utiliser une concaténation. Soit :
=COUNT.IF(A2:A19;"<" & TODAY())

Cordialement.
0
J'obtient #NAME
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
12 nov. 2012 à 13:21
Bonjour,

a savoir qu'il y a des données filtrées qui ne sont, évidement pas à prendre en compte.

Tu as oublié ce fil https://forums.commentcamarche.net/forum/affich-26088654-excel2007compter-info-cellules-non-cache ?

Soit c'est avec une colonne supplémentaire (avec =SOUS.TOTAL(103;A2)), soit c'est en vba...

eric

0
Bonjour Eric,

Oui je n'ai pas pris en compte ce fil pour quelques raisons.

Je ne pense pas que rajouter une colonne serait génial pour ce type de fichier.

Et le VBA je ne connaît pas (bien que je ne rechigne pas à apprendre !! )
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
12 nov. 2012 à 15:57
re,

Et le VBA je ne connaît pas (bien que je ne rechigne pas à apprendre !! )
Et bien tu vas apprendre... ;-)
NB : si le seul filtre actif est sur la date NB.SI() proposé au-dessus est suffisant.
Si plusieurs filtres sont actifs combiner tous les critères par formule devient vite lourd et contraignant en saisie.

La fonction personnalisée ligVisible(plage) retourne une matrice avec :
- 0 si la ligne est masquée
- 1 si la ligne est visible
(plage doit faire 1 colonne de large sinon #NOMBRE!)

Exemple syntaxe :
=ligVisible(A2:A14)
retourne :
{0;1;0;0;1;0;0;1;0;0;1;0;0}

Exemple 2 : nombre de dates visibles <= aujourd'hui :
=SOMMEPROD((ligVisible(A2:A14))*(A2:A14<=AUJOURDHUI()))
retourne :
3

Code à mettre dans un module général :
Function ligVisible(plage As Range) As Variant
    Dim c As Range, réponse() As Long
    ' une seule colonne acceptée dans 'plage'
    If plage.Columns.Count > 1 Then ligVisible = xlErrNum
    ReDim réponse(1 To plage.Rows.Count)
    For Each c In plage
        réponse(c.Row - plage.Row + 1) = (Not c.EntireRow.Hidden) * -1
    Next c
    ligVisible = Application.Transpose(réponse)
End Function

https://www.cjoint.com/?BKmpUTZuD0V

eric
0
Coucou !

Alors j'ai lu (et relu ^^) ton message. J'ai regardé ta feuille aussi.

Mais pourquoi est-ce que à la place de la réponse de la formule apparaît #NAME ?

Je supose que tu te souviens que j'ai beaucoup de mal ^^ (d'ailleurs je suis toujours blonde hein !! ) donc, si tu propose de m'aider, ce ne sera pas de tout repos hihi !
0
J'ai tout de même essayer ta formule

=SOMMEPROD((ligVisible(A2:A14))*(A2:A14<=AUJOURDHUI()))

sur mes feuilles et j'ai le même résultat (je précise que je n'ai qu'un filtre).

Moi pas comprendre ^^ (c'est une habitude je sais hihi)
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
Modifié par eriiic le 13/11/2012 à 10:39
Bonjour,

il faut accepter les macros à l'ouverture du fichier.
C'est différent selon la version excel.

Sur 2003 : 'outils / options... / sécurité / sécurité des macros...' cocher 'niveau moyen'
Rouvrir le fichier

Sur 2010 : ' fichiers / options / centre de gestion de la confidentialité / paramètre du centre de gestion de la confidentialité...' cocher 'désactiver / toutes les macros avec notification'
Rouvrir le fichier
A l'ouverture cliquer sur la bande jaune en haut pour accepter les macros.

Pour l'utiliser sur tes classeurs :
- soit garder le classeur exemple ouvert
- soit copier le code dans un module général de ton classeur (mais essaie déjà de voir si ça te va).
Alt+F11 pour ouvrir l'éditeur VBE, clic-droit sur le projet à gauche et 'insérer un module'.
Copier coller le code depuis 'Function' jusqu'à 'End Function' dans Module1
Ensuite elle sera disponible comme toutes les autres fonctions excel (dans catégorie Personnalisée)

eric
0
pépé35530 Messages postés 2942 Date d'inscription vendredi 1 mai 2009 Statut Membre Dernière intervention 19 mars 2016 1 386
13 nov. 2012 à 09:45
Bonjour,

Concernant la fonction NB.SI il me semble qu'il y a un bug :

lorsque l'on travaille sur des dates, la fonction ne fonctionne pas lorsque le critière est une date, une adresse de cellule ou la fonction aujourdhui().
Pourtant les docs proposent bien cette option.
Par contre, pas de problèmes pour des chaînes de caractères ou des nombres.

Une explication ?

A+

pépé
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
Modifié par eriiic le 13/11/2012 à 10:41
Bonjour pépé,

Quand tu fais référence à une fonction ou une cellule il faut conserver le test en chaine (entre des " ") et concaténer avec la variable.

Exemples de syntaxe :
=NB.SI(A2:A15;"<=09/11/2012")
=NB.SI(A2:A15;"<=" & AUJOURDHUI())
=NB.SI(A2:A15;"<=" & A6)

eric
0
pépé35530 Messages postés 2942 Date d'inscription vendredi 1 mai 2009 Statut Membre Dernière intervention 19 mars 2016 1 386
13 nov. 2012 à 14:37
Bonjour eriiic,

Merci pour l'info. Cela fonctionne effectivement.
Ce qui est perturbant, c'es que Excel rajoute dans certaines configurations des guillemets et dans d'autres non.
L'aide n'indique pas cette particularité et la doc que j'avais n'abordait pas ce problème.

kim67 avait le même problème avec sa formule. En la corrigeant, il devrait résoudre son problème de comptage.

=count.if(A2;A19;"<"&TODAY())

Merci et bonne journée
0
Bonjour pépé,

Je viens de tester ta formule.

#NAME

Donc ça ne marche pas :(
0
Erci,

Pour comprendre le VBA j'ai pris la liberté de voguer sur les terribles flôts d'Internet...

Je suis tombé sur un site que je trouve très bien :

http://www.info-3000.com/vbvba

J'ai appris à faire quelques petites manip concernant les macros :
Faire une macro grâce à l'enregistrement, la modifier et par la même la créer sur le Visual Basic... Et même l'insérer dans la barre d'outils et en modifier l'îcone (pas d'ironie svp ^^)

Maintenant je continue le cours mais je t'avoue que je suis tombé sur quelque chose qui me complique la vie...

http://www.info-3000.com/vbvba/variableconstante.php

Les variables et constantes... Je ne comprends rien !!

J'ai voulu aller plus loin en me disant que peut-être je comprendrais après mais...

Il s'agit des ImputBox... Avec des messages

http://www.info-3000.com/vbvba/inputbox.php

J'ai à chaque fois collé les codes pour voir ce que ça donnait. Mais Je ne comprends pas ...

1) Qu'est-ce que c'est c'est foutus variables ?? A quoi ca sert, ou tu les mets ????
2) C'est peut être un peu foufou, mais je ne vois pas concrêtement quand on se sert de ça puisque ça affiche un message tout bête en incluant une donnée que tu as rentrée...
3) Je ne comprends pas quand il parle de STRING, d'INTEGRER...

Je crois que j'ai besoin de ton aide ^^ Mais me chamboule pas trop ce que j'ai appris hein ^^
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
13 nov. 2012 à 18:57
Re,

1) les variables servent à conserver une valeur et la faire évoluer au cours du traitement.
Plus tard il faudra que tu regardes leur portée et leur durée de vie.
2) les exemples ne sont peut-être pas terribles ni concrets, ils sont là juste pour montrer l'utilisation d'une fonction.
3) si tu ne connais pas les strings je vais t'apprendre ce que c'est.

Ci-joint un petit exemple peut-être un peu plus complet pour te mettre le pied à l'étrier.
https://www.cjoint.com/?BKns2GY5d2M
J'ai pris le temps de tout commenter, alors prend le tien pour lire tous les commentaires ;-)

Tu n'as pas dit si tu étais arrivée à faire tourner la fonction.

eric
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
Modifié par eriiic le 13/11/2012 à 23:50
PS
comme on me le fait remarquer à juste titre : pour avoir le prix TTC il multiplier le prix hors taxe par (1 + tva3)

Ca fera l'objet de ton 1er TP : corriger les erreurs du code ;-)
eric

Bon, je ramasse les copies, copie blanche =0
Voilà la solution : https://www.cjoint.com/?BKnxYe6F9Hr
J'ai ajouté également un appel de procédure par bouton
eric
0
Coucou !

Désolée hier je n'ai pas eu le temps de regarder.

Merci pour tes info, oui oui explique moi j'apprends !!

Pour la formule du coup j'ai pas essayé, je trouve ça super interessant enfaite le code VBA du coup ben j'ai complètement oublié d'essayer ^^

Je vais faire mon tp et promis je ne triche pas !! Je reviens dans.. euh ben dés que j'ai fini ^^
0
Voila, alors ma réponse est :

Next lig ' ligne suivante
Application.EnableEvents = False 'bloquer la détection des évènements
Range("F2") = nbArticle ' inscription du résultat
[G2] = totalHT * (1 + tva3) ' façon courte de désigner une cellule, inscription du résultat
Application.EnableEvents = True 'rétablir la détection des évènements


Par contre quand je fais F8 ca sélectionne tout et quand je fais F5 il y a une boîte de dialogue qui me demande de rechercher quelque chose, j'ai donc simplement supprimé ton message et j'ai essayé de décortiquer ton code.

J'ai bien lu tes annotations et pour la plus part je crois avoir compris. Dr'ailleurs je prends toujours le temps de te lire, c'est juste que je n'arrivais pas à tout saisir. Mais j'ai l'impression que ça va mieux.

J'ai repris ton doc et j'ai mis dans le code ce que j'avais compris.. ou non.
Merci beaucoup en tout cas, j'ai déjà bien compris certaines choses
0
J'ai trouvé un autre document qui complete bien les explications du site.

Mais comme toujours, ...

C'est sur le chapitre If - Then - Else

Function ComprisEntre15et20 (nombre As Integer) As Boolean

If (nombre < 15) Then
ComprisEntre15et20 = False
ElseIf (nombre > 20) Then

ComprisEntre15et20 = False
Else
ComprisEntre15et20 = True

End If

End Function

Pourquoi ne pas mettre

If (nombre < 15) Then
ComprisEntre15et20 ) = False
ElseIf (nombre > 20) = False
ElseIf (nombre >= 15) = True

End If

End Function

??? hihi je n'ai peut être pas bien cerné la facon de penser de VBA
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
14 nov. 2012 à 16:26
Et bien voilà, tu avances.

j'ai demandé à excel de compter de la A2 à A30 par exemple et que demain il s'avère que j'ai plus 29 lignes à calculer mais 40 ?
Une fois créée, une fonction personnalisée s'utilise comme n'importe quelle fonction excel.
Donc tu fais pareil qu'avant, mêmes possibilités :
- mettre tout de suite une grande plage
- nommer la plage et insérer des lignes à l'intérieur du tableau au fur et à mesure des besoins.
- utiliser un nom dynamique
- sur 2010 : convertir la plage en tableau et utiliser les références structurées

Exemple avec un nom dynamique : https://www.cjoint.com/?BKoqzbooICS
J'ai modifié le code pour qu'il accepte des plages de plusieurs colonnes.

eric
0
Coucou !

Oui j'avance et heureusement.

Cependant, j'ai un soucis... J'ai repris exactement la même formule dinamique et la même ecriture VBA que toi. J'ai ensuite mis en action et je n'obtient aucune réponse ######

J'ai donc modifié le nom pour mettre ColF7 au lieu de colDates. Pas de réponse. J'ai alors compris que je devais sûrement définir, comme toi, ColF7... Mais lorsque j'ai cherché où tu avais définit la tienne je n'ai pas trouvé. Tu as effectivement mis la formule pour le montrer mais je n'ai pas trouvé dans VBA où tu l'avais saisie.

Je suis perplexe du coup !!

Ca veut dire qu il faut faire trois ecriture ? Une VBA de base (livisible), une dans la case où i y aura la réponse, et une pour définir la zone ??

J'ai compris hier ce que c'était C dans "Dim C" ^^ c'était dans le cours de Cathy ^^ Hey hey
0
PS : utiliser un nom dynamique
- sur 2010 : convertir la plage en tableau et utiliser les références structurées
La tu m'as completement perdu !!
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
15 nov. 2012 à 09:14
Bonjour,

Ca veut dire qu il faut faire trois ecriture ? Une VBA de base (livisible), une dans la case où i y aura la réponse, et une pour définir la zone ??
exactement

On défini un nom dans le Gestionnaire de nom :
https://www.cjoint.com/?BKpi7MvqBv2

avec =DECALER(Feuil1!$A$2;;;NBVAL(Feuil1!$A:$A)-1;)
le nom dynamique définit une plage qui s'étend au fur et à mesure des saisies dans A.
Ne pas laisser de trou.
Si en A15 tu saisis 07/11/12, F1 passera à 4.


- sur 2010 : convertir la plage en tableau et utiliser les références structurées
La tu m'as completement perdu !!

Cette méthode est intéressante, surtout si tu as plusieurs plages dans tes sommeprod() car toutes les plages doivent y avoir la même taille.
Si tu utilises un nom dymamique à l'intérieur, tu dois le faire pour toutes les plages utilisées dans le sommeprod(). C'est plus sumple avec les références structurées.
Par contre si tu passes ton classeur à qcq'un qui n'a pas 2010 il ne fonctionnera plus
Tu as déjà pas mal de choses à assimiler, tu dis si ça vaut le coup...

eric





0
Ben mon envie d'apprendre te dirais bien OUI OUI APPRENDS MOI APRENDS MOI ^^

C'est quelque chose qui ne me sera pas utile ici je pense. Donc très probablement, si tu le veux bien, dés qu'on aura fini avec mon document, je serai prête à apprendre la lecon suivante.

Par contre, j'ai fait ce que tu m'as dit. C'est super, maintenant je sais nommer des choses :D

mais le problème c'est que ... Sur mon document j'ai essayé et j'obtient O... J'ai vérifié, je ne me suis pas trompé dans le nom de la colonne. La formule VBA est toujours la bonne et la formule est exacte aussi.... Alors je me suis dis que jallais te montrer. Et puis là... Lorsque j'ai copié la feuille j'ai carrément eu droit à ####

Je ne comprends rien, pourtant tout me semble bon. QU'est ce que j'ai fais de mal ??

Encore une fois je te remercie pour le temps que tu prends pour me repondre, je me doute que ce n est pas facile avec quelqu un en face de toi qui te trouve des questions à chaque nouvelle info... :/
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
Modifié par eriiic le 15/11/2012 à 09:44
Quand tu as des ##### c'est que la colonne est trop petite pour afficher.
Elargis la et tu lis #NOM! : un nom dans la formule n'est pas reconnu.
ligVisible sans doute...
Donc tu as bien mis la fonction, mais une fonction personnalisée doit être dans un module général, pas dans un module de feuille.
Clic-droit dans le projet pour insérer un module puis couper-coller le code, ça devait aller mieux.

Accessoirement dans la définition de ColF7 tu as utilisé des références structurées.
Bon, ça c'est fait ! ;-)

eric

PS : tu as utilisé les ref structurées, mais mal...
Et si tu les utilises, tu peux les utiliser directement dans la formule, inutile de passer par un nom (sauf si tu veux éclaircir et raccourcir ma formule)
Donc en B498 :
=SOMMEPROD(ligVisible(Table_FY1213_Master_Plan_Opérations[F7])*(Table_FY1213_Master_Plan_Opérations[F7]<=$E$498))

eric
0
Ca ne fonctionne pas. Je me demande bien ce qui fait que ca ne va pas. Pourtant j'ai exactement copié ta formule... :/ HUM....
0
Attends je crois que j'ai compris ou ce situe le problème... je vais te faire un doc excel ^^ je pense que le soucis ce trouve dans le nom dynamique
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
Modifié par eriiic le 15/11/2012 à 10:01
J'avais édité mon post (le PS), tu n'as pas vu je crois.
Je précise qu'une référence structurée s'étend automatiquement au fur et à mesure des saisies
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
21 nov. 2012 à 17:11
Bonjour,

Pour ton problème de lignes vides sur l'autre fichier je pense que tu n'as pas le choix. Il faut les enlever et partir sur un fichier propre avant tout traitement des données.
Pour te donner une idée, avec ses 65000 lignes vides, enregistré sur 2003 il fait 5 Mo. Donc sûrement autant en mémoire vive d'ou les lenteurs insupportables...
Si c'est un problème d'extraction tu peux toujours poser la question au forum Base de Données, ils connaissent peut-être ton logiciel.

J'ai complété la fonction par d'autres.
Dont une qui te permet de connaitre directement le nombre de dates affichées <= date, en comptant ou non les cellules vides sans formule sommeprod().
Mais ça reste une formule matricielle (même si on la valide normalement) donc à utiliser raisonnablement.

https://www.cjoint.com/?BKvrhc5Rgod

eric
0