IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Compter le nombre d’occurrences sur plusieurs feuilles identiques pour un exercice donné


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 697
    Par défaut Compter le nombre d’occurrences sur plusieurs feuilles identiques pour un exercice donné
    Bonjour à tous,
    Dans un classeur, j’ai 400 feuilles identiques, qui portent un nom sous forme d’un nombre de 5 chiffres, comme par exemple 14001 ou 28099.
    Sur chacune de ces feuilles :
    - En colonne P3:P112, j’ai des dates JJ/MM/AA.
    - En colonne Q3:Q112, j’ai des intitulés de thème.
    Sur une feuille récapitulative placée dans ce même classeur, j’ai :
    - En colonne A, les différents intitulés de thème utilisés dans mon classeur.
    - Sur la ligne 4, les exercices, comme par exemple 2012-2013 en C4 ou 2013-2014 en E4 ou encore 2014-2015 en G4.
    Mes exercices vont du 01/09 au 31/08.
    Sur cette feuille récapitulative, pour chaque thème, je souhaite connaitre le nombre de fois où le thème de la colonne A est utilisé dans les 400 feuilles pour un exercice donné.
    Autrement dit et par exemple, dans la cellule C9 (première cellule à renseigner de mon tableau récapitulatif) je souhaite avoir le nombre de fois, que le thème de la cellule A9 se retrouve dans les différentes feuilles (Q3 :Q112), mais uniquement durant des jours de l’exercice 2012-2013 (cellule C4 de la feuille récapitulative).
    Pourriez-vous me communiquer la formule VBA, qui pourrait répondre à mon exigence ?
    Petite précision qui a son importance, je suis nulle en VBA.
    J’espère avoir été le plus clair possible.
    D’avance, merci beaucoup pour vos précieuses informations.
    bolide7

  2. #2
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour bolide7,

    Pour un début de réponse tu peux mettre le code ci-dessous dans un module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
     
    Public Const NomFeuilleRecap = "Recap"
     
    Function MaFonction(ByVal rg As Range) As Long
        Dim sh As Worksheet, Plage$, res&
        Plage = "Q3:Q112"
        For Each sh In ThisWorkbook.Sheets
            If sh.Name <> NomFeuilleRecap Then _
                res = res + Application.WorksheetFunction.CountIf(sh.Range(Plage), rg)
        Next
        MaFonction = res
    End Function
    Pour prendre en compte les dates, tu peux remplacer .CountIf par .CountIfs et adapter le code.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 71
    Par défaut
    C'est franchement incompréhensible.
    D'abord non ne sait pas si la feuille récapitulative est en première ou dernière feuille, ensuite comment peut-on imaginer la feuille de récapitulation si dans la cellule A4 on a à la fois un intitulé de thème et la désignation d'un exercice.
    Le mieux est de nous proposer le classeur, histoire d'y voir clair.

  4. #4
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Pour prendre les dates en compte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Public Const NomFeuilleRecap = "Recap"
     
    Function MaFonction2(ByVal Theme As Range, ByVal Exercice As Range) As Long
        Dim sh As Worksheet, PlageTheme$, PlageExercice$, res&, t$()
        PlageTheme = "Q3:Q112"
        PlageExercice = "P3:P112"
        t = Split(Exercice, "-")
        For Each sh In ThisWorkbook.Sheets
            If sh.Name <> NomFeuilleRecap Then _
                res = res + Application.WorksheetFunction.CountIfs( _
                    sh.Range(PlageExercice), ">=" & CDbl(DateSerial(t(0), 1, 1)), _
                    sh.Range(PlageExercice), "<=" & CDbl(DateSerial(t(1), 12, 31)), _
                    sh.Range(PlageTheme), Theme)
        Next
        MaFonction2 = res
    End Function
    En C4 : deux dates séparées d'un '-' exemple 2012-2013
    En A9 : Un thème
    En C9 : La formule =MaFonction2(A9;$C$4)

    Il faut juste que tu change la ligne :
    Public Const NomFeuilleRecap = "Recap" pour y mettre le nom de ta feuille récapitulatif

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 697
    Par défaut
    Bonjour antonysansh et Dormeur74,
    Merci beaucoup pour vos très rapides réponses.


    Pour Dormeur74 :
    La feuille Récap est située au début du classeur, mais n’est pas la première, c’est la quatrième feuille.
    Si le classeur original contient plus de 400 feuilles identiques, dans lesquelles les recherches doivent s’effectuer, il contient une vingtaine d’autres feuilles, dont le nom n’est pas un nombre.

    Comme indiqué dans mon post de 2h18, la première cellule à renseigner du tableau récapitulatif est la cellule C9. En conséquence, on a :
    - En A9, un thème.
    - En C4, un exercice, 2012-2013.


    Pour antonysansh :
    Merci beaucoup de prendre le temps de me communiquer une fonction VBA prête à l’emploi.
    En effet, si je maîtrise un peu les fonctions EXCEL, comme indiqué précédemment, l’écriture en VBA est pour moi, quasiment incompréhensible.
    J’aurai déjà bien du mal à l’insérer correctement dans le classeur.

    Pour prendre en compte les dates, tu peux remplacer .CountIf par .CountIfs et adapter le code.
    Pour moi cette phrase est donc incomprésible.

    Il ne s’agit seulement que de ma deuxième fonction VBA.
    Ma première fonction VBA, qui concerne ce même classeur et qui ressemble énormément à celle-ci, est évoquée en ce moment même dans cette discussion sur ce même forum, mais à la première page du forum Excel et non dans le sous-forum « Macros et VBA Excel ».
    http://www.developpez.net/forums/d14...ntes-feuilles/
    Et comme évoqué dans cette autre discussion, à la fin de mon post de 13h25 de ce jour, cette première fonction VBA rencontre quelque problème due au nombre important de feuilles.

    Je te précise que si le même intitulé apparaît 2 fois pour 2 dates identiques (donc sur 2 lignes différentes) dans une des 400 feuilles, je souhaite qu’EXCEL compte 2 occurrences. J’ignore si tu avais intégré ce détail dans mes explications de cette nuit.

    Je vais devoir m’absenter, mais reviendrais vers toi durant la soirée pour te communiquer le résultat obtenu après avoir inséré ta fonction VBA dans un deuxième module.

    Encore merci beaucoup.

    Très bon après-midi.
    bolide7

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 697
    Par défaut
    Bonsoir antonysansh,
    Malgré la lourdeur de mon classeur avec ses 400 feuilles, je t’informe que les résultats s’affichent plutôt très rapidement en comparaison de la première fonction VBA. Quelques secondes, c’est nettement mieux que les 2 heures 30 minutes de calcul pour la première fonction VBA. C’est super !
    J’ignore pourquoi, mais contrairement à la première fonction VBA, ta proposition se met à jour automatiquement, comme une fonction EXCEL. C’est super !
    Par contre, les résultats obtenus me paraissent aberrants. Je crois avoir isolé l’origine de ce petit problème. Sauf erreur de ma part et après quelques tests et vérifications, il me semble que tu n’as pas intégré dans ta fonction VBA, qui pour moi est incompréhensible, que mes exercices ne sont pas des années civiles, mais débutent le 01/09 pour se terminer le 30/08. En conséquence, si dans une des 400 feuilles en colonne P3:P112, j’ai la date par exemple du 15/09/13, l’intitulé du thème (Q3:Q112) doit être comptabilisé avec l’exercice 2013-2014 (cellule E4 de « Recap » et non avec 2012-2013 (cellule C4 de « Recap »).
    D’avance, merci beaucoup.
    Bonne soirée.
    bolide7

  7. #7
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour bolide7,

    Petites explications :
    Public Const NomFeuilleRecap = "Recap" est une constante qui est une chaine de caractères représentant le nom de ton onglet recap.
    Ensuite je parcours toute les feuilles sauf la feuille recap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For Each sh In ThisWorkbook.Sheets
            If sh.Name <> NomFeuilleRecap Then
    Donc si d'autres feuilles ne doivent pas être a parcourir, il va falloir adapter.

    Ensuite je n'avais pas vu
    Mes exercices vont du 01/09 au 31/08
    Donc par exemple avec 2012-2013 en C4 je comptais toutes les lignes de 2012 ET de 2013 (années complètes)

    Apres t = Split(Exercice, "-"), t(0) vaut 2012 et t(1) vaut 2013.
    Donc DateSerial(t(0), 1, 1) représente le 01/01/2012 (DateSerial(aaaa, mm, jj) construit la date jj/mm/aaaa)



    En résumer voila une adaptation de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Public Const NomFeuilleRecap = "Recap"
     
    Function MaFonction2(ByVal Theme As Range, ByVal Exercice As Range) As Long
        Dim sh As Worksheet, PlageTheme$, PlageExercice$, res&, t$()
        PlageTheme = "Q3:Q112"
        PlageExercice = "P3:P112"
        t = Split(Exercice, "-")
        For Each sh In ThisWorkbook.Sheets
            If sh.Name <> NomFeuilleRecap Then _
                res = res + Application.WorksheetFunction.CountIfs( _
                    sh.Range(PlageExercice), ">=" & CDbl(DateSerial(t(0), 9, 1)), _
                    sh.Range(PlageExercice), "<=" & CDbl(DateSerial(t(1), 8, 31)), _
                    sh.Range(PlageTheme), Theme)
        Next
        MaFonction2 = res
    End Function

Discussions similaires

  1. [XL-2003] Compter les occurences sur plusieurs feuilles
    Par docjo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/10/2010, 07h55
  2. Réponses: 5
    Dernier message: 08/04/2010, 15h47
  3. [XL-2007] Compter le nombre d'occurences sur plusieurs feuilles
    Par grping dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/10/2009, 18h18
  4. Bouton identique sur plusieurs feuilles
    Par jeanmanu dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 08/07/2008, 22h11
  5. [VBA-E] Données identiques sur plusieurs feuilles
    Par pm2036 dans le forum Macros et VBA Excel
    Réponses: 42
    Dernier message: 09/05/2007, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo