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 des ensembles en VBA WorksheetFunction.CountIf


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut Compter des ensembles en VBA WorksheetFunction.CountIf
    Bonjour,
    J'utilise WorksheetFunction.CountIf de cette façon,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a = 18
    n1 = 1
    n2 = 2
     
    n2 = WorksheetFunction.CountIf(Range(Cells(a, 3), Cells(a, 22)), n1)
    n4 = WorksheetFunction.CountIf(Range(Cells(a, 3), Cells(a, 22)), n3)
    n2 donne la quantité numéraire de n1 dans Range(Cells(a, 3), Cells(a, 22).
    n4 donne la quantité numéraire de n2 dans Range(Cells(a, 3), Cells(a, 22).

    j'ai besoin de compter deux ou plusieurs valeurs en même temps.
    peut-on en une seule ligne de code avec WorksheetFunction.CountIf, compter deux valeurs ou plusieurs valeurs en même temps ?

    En résumé, compter des ensembles de deux valeurs numéraires ou des ensembles de plusieurs valeurs numéraires dans une ligne et/ou dans plusieurs lignes à la fois.
    en sachant que :
    n1 = 1, n3 = 2, n5 = 3, n7 = 4 ....etc

    D'avance merci infiniment.

    Ps: j'ai essayé avec cette ligne de code( WorksheetFunction.CountIfs ou WorksheetFunction.CountA ou WorksheetFunction.Count ) pour compter des ensembles de deux valeurs,....évidement ça ne marche pas !

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 511
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 511
    Par défaut
    Hello,

    La fonction CountIfs peut-elle faire ton bonheur ?
    Sauf erreur de ma part, c'est l'équivalent de la formule SOMME.SI.ENS

  3. #3
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Hello,

    La fonction CountIfs peut-elle faire ton bonheur ?
    Sauf erreur de ma part, c'est l'équivalent de la formule SOMME.SI.ENS
    Bonjour,
    et non, j'ai déjà essayé countifs, countA et count. ça ne marche pas.
    -------------------------------------
    comment mettre les deux valeurs (ou plusieurs) sur un même ligne de code, de façon à avoir le total de l'ensemble de deux ou plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a =18
    n1 = 1
    n3 = 2
    n2 = WorksheetFunction.CountIf(Range(Cells(a, 3), Cells(a, 22)), n1)
    n4 = WorksheetFunction.CountIf(Range(Cells(a, 3), Cells(a, 22)), n3)
    d'avance Merci !
    ps: ces deux lignes fonctionnent, mais elles gèrent qu'une valeurs à la fois.

  4. #4
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,

    comment mettre les deux valeurs (ou plusieurs) sur un même ligne de code, de façon à avoir le total de l'ensemble de deux ou plus.
    Ce que tu veux faire est une somme matricielle qui fonctionne très bien en formule mais pas en VBA.
    Tu peux mettre la formule dans une cellule et récupérer le résultat mais difficile sur une seule ligne.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 511
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 511
    Par défaut
    Après mûre réflexion,
    ton code est bien comme il est, je ne voit nulle besoin d'y toucher surtout pour une pseudo amélioration.

    Qu'on soit d'accord, le premier but d'un code source est d'être lu et compréhensible.
    Qu'il produise le résultat escompté n'arrive qu'en seconde position.
    De plus un code court n'implique pas qu'il soit plus rapide.

    Alors les problématiques d'en faire un maximum sur une seule ligne, on s'en cogne.

  6. #6
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut CountIf
    Bonjour,
    le code est bon quand il s'agit d'une ligne. J'ai créé un moteur qui incrémente qui donne ceci :
    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
    dim a, n5, N7, x, mot1 as Integer
    a =18
    n5 = 1
    n7 = 2
    x = 0
    For mot1 = 1 To 14
     
                                 n2 = WorksheetFunction.CountIf(Range(Cells(a, 3), Cells(a, 22)), n5)                           
                                 n4 = WorksheetFunction.CountIf(Range(Cells(a, 3), Cells(a, 22)), n7)
     
                              If n2 = 1 And n4 = 1 Then ' quand n5 et N7 sont présents sur la ligne : x augmente de 1 
                               x = x + 1
                              End If
      a = a + 1
    next mot1
    Mais, je souhaiterai dans cet ensemble de lignes (14 lignes) d'un seul coup avoir le total des ensembles de n5 et N7, et pourquoi pas si c'est possible avec plus valeurs, n5,n7,n9...etc
    En sachant que le nombre de lignes peut aller jusqu'à plusieurs centaines !
    Si tu me confirmes que c'est beaucoup plus difficile, n'en parlons plus.
    Merci pour ton aide.

  7. #7
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,

    Il te faut ajouter le type à chaque définition de variable sinon le type est indéfini.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim a As Integer, n2 As Integer, n4 As Integer, n5 As Integer, N7 As Integer, x As Integer, mot1 As Integer
    J'ai créé un moteur qui incrémente qui donne ceci
    Ta boucle sur mot1 est vraiment ésotérique car la variable n'y est pas utilisée ?

  8. #8
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut CountIf
    Ah bon ?!, jusqu'à présent tout marche et les variables reconnaissent leurs valeurs nombre.
    Je n'ai pas de messages "objet non traité par l'application" ou tout autre chose !
    En ce qui concerne ma boucle j'ai oublié ceci après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                            If n2 = 1 And n4 = 1 Then
                               x = x + 1
                              End If
     
                            if mot1 = 14 then
                               Range("A1").Select
                               ActiveCell.Value = x
                              exit for
                          End if
    Merci quand même !

  9. #9
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Ah bon ?!, jusqu'à présent tout marche et les variables reconnaissent leurs valeurs nombre.
    Je ne t'ai pas dit que cela ne fonctionnait pas mais que tes variables sont définies en variant si le type n'est pas précisé pour chacune, ce qui n'est pas toujours souhaitable.
    Tu peux vérifier mes dires sur la documentation Microsoft
    https://docs.microsoft.com/fr-fr/off...ring-variables

    Comme tu as une boucle de 1 à 14 il sera fatalement égal à 14 à la fin sauf plantage et le test dans la boucle est inutile.

    Cela dit, ce n'est qu'une information et chacun est libre d'utiliser le code à sa guise.

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 511
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 511
    Par défaut
    Citation Envoyé par jfcjfc Voir le message
    Je n'ai pas de messages "objet non traité par l'application" ou tout autre chose !
    Le compilateur VBA est très léger et ne traque pas les variables non utilisées, non intialisées, mal typées ect ...., il se contente majoritairement de vérifier la syntaxe, tous le reste survient à l'éxecution.

    Si tu veux un outils plus performant, il y a rubberduck

  11. #11
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut coutifs
    Merci pour l'info,
    mais je suis toujours à la recherche d'un code en VBA afin de pouvoir compter les ensembles de nombres en couples, en triplets etc.. dans un ensemble de lignes prédéfinies.
    Si toute fois tu trouve ça, pense à moi !
    Encore merci

  12. #12
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    Hello,
    voici une fonction VBA qui prend en paramètres une plage ligne dans laquelle on cherche et comme autre paramètre un tableau des valeurs à chercher. Elle renvoie un tableau qui contient les quantités numéraires des valeurs cherchées :
    Exemple :
    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
    18
    19
    20
    21
    Function Compter(Plage, tabSearch) As Variant
    Dim pos
    Dim tabRes() As Variant
    Dim Ligne As Variant
    Dim Cell As Variant
    ReDim tabRes(1 To UBound(tabSearch) - LBound(tabSearch) + 1)
    Ligne = Application.Transpose(Application.Transpose(Plage))
    For Each Cell In Ligne
           pos = Application.Match(cell, tabSearch, False)
           If Not IsError(pos) Then
              tabRes(pos) = tabRes(pos) + 1
           End If
    Next
    Compter = tabRes
    End Function
     
     
    Sub Test()
    Dim Resultat
    Resultat = Compter(Range("A18:O18"), Array(1, 2, 3))
    End Sub
    Ami calmant, J.P

  13. #13
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,
    Citation Envoyé par jfcjfc Voir le message
    je suis toujours à la recherche d'un code en VBA afin de pouvoir compter les ensembles de nombres en couples, en triplets etc.. dans un ensemble de lignes prédéfinies.
    Plus je regarde ton code et moins je le comprends.
    Tu boucles 14 fois sur une procédure invariable et donc tu ne peux obtenir que 0 ou 14
    Tu regardes la présence de nombres mais en fait tu ne comptes pas car si tu as deux fois 1 et une fois 2 tu ignores,
    alors qu'un comptage global va te donner 3.

    Bref pour moi c'est totalement inextricable et c'est impossible de trouver la finalité.

    J'aurai une procédure pour mettre le résultat dans ta cellule mais il faudrait savoir quel résultat tu veux.

    D'ailleurs si ta procédure est faite pour un résultat sur différentes lignes il serait plus judicieux de l'obtenir par formule.
    Si tu veux savoir si tu as le tiercé ou quinté dans ta ligne de numéros de chevaux,
    parce qu'en fait c'est sans doute ton objectif, c'est très facile de l'avoir par formule sans procédure VBA.


    En espérant une clarification de tes objectifs, bonne journée.

  14. #14
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut coutifs
    Citation Envoyé par jurassic pork Voir le message
    Hello,
    voici une fonction VBA qui prend en paramètres une plage ligne dans laquelle on cherche et comme autre paramètre un tableau des valeurs à chercher. Elle renvoie un tableau qui contient les quantités numéraires des valeurs cherchées :
    Exemple :
    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
    18
    19
    20
    21
    Function Compter(Plage, tabSearch) As Variant
    Dim pos
    Dim tabRes() As Variant
    Dim Ligne As Variant
    Dim Cell As Variant
    ReDim tabRes(1 To UBound(tabSearch) - LBound(tabSearch) + 1)
    Ligne = Application.Transpose(Application.Transpose(Plage))
    For Each Cell In Ligne
           pos = Application.Match(cell, tabSearch, False)
           If Not IsError(pos) Then
              tabRes(pos) = tabRes(pos) + 1
           End If
    Next
    Compter = tabRes
    End Function
     
     
    Sub Test()
    Dim Resultat
    Resultat = Compter(Range("A18:O18"), Array(1, 2, 3))
    End Sub
    Ami calmant, J.P
    Merci !merci !

  15. #15
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut countifs
    Citation Envoyé par anasecu Voir le message
    Bonjour,

    Plus je regarde ton code et moins je le comprends.
    Tu boucles 14 fois sur une procédure invariable et donc tu ne peux obtenir que 0 ou 14
    Tu regardes la présence de nombres mais en fait tu ne comptes pas car si tu as deux fois 1 et une fois 2 tu ignores,
    alors qu'un comptage global va te donner 3.

    Bref pour moi c'est totalement inextricable et c'est impossible de trouver la finalité.

    J'aurai une procédure pour mettre le résultat dans ta cellule mais il faudrait savoir quel résultat tu veux.

    D'ailleurs si ta procédure est faite pour un résultat sur différentes lignes il serait plus judicieux de l'obtenir par formule.
    Si tu veux savoir si tu as le tiercé ou quinté dans ta ligne de numéros de chevaux,
    parce qu'en fait c'est sans doute ton objectif, c'est très facile de l'avoir par formule sans procédure VBA.


    En espérant une clarification de tes objectifs, bonne journée.
    Bonjour,
    j'ai mis 14 à la boucle pour l'exemple, d’habitude il y a une variable qui définie un nombre de ligne,
    et une variable qui définie un nombre de Numéros
    Ce nombre de lignes et de numéros sont inscrites sur deux cellule, une pour chaque variable.
    Ex :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     dim a as integer, dim c as integer, dim d as integer, dim e as integer, dim f as integer, dim x as integer nbf1 as integer, nbl as integer
     
     a = 18
     c = 18
     d = 53
     e = 13
     f = 24
     x = 0
     Range("AQ13").Select ' nombre de N°
     nbf1 = ActiveCell.Value  
     ''''
     Range("W13").Select ' numero de base
     n5 = ActiveCell.Value
     '''
      For mot1 = 1 To nbf1 - 1 '  Pourquoi -1 ?!, parceque le numero de base se trouve sur la même ligne des autres numéros
      Cells(e, f).Select
      n7 = ActiveCell.Value
      for mot 2 =  1To nbl ' nombre de lignes à traiter
                                 n2 = WorksheetFunction.CountIf(Range(Cells(a, 3), Cells(a, 22)), n5)' numero de base
     
                                 n4 = WorksheetFunction.CountIf(Range(Cells(a, 3), Cells(a, 22)), n7) ' n7,numéro qui change au grès du curseur 
     
                                 If n2 = 1 And n4 = 1 Then
                                 x = x + 1 ' incrementation de 1 la valeur de x quand le couple est présent sur la ligne
                                 End If
     
                                 If mot2 = nbl Then
                                  Cells(c, d).Select
                                  ActiveCell.Value = x 'inscrit le nombre de couples
                                   c= c + 1
                                  else
                                   a = a + 1 ' le moteur2 incrémente de 1 tant que le nombre de ligne n'est pas atteint
                                 end if
     
      next mot2
     f = f + 1 ' changement de Numéro
     x = 0 ' la valeur de x doit être remise à 0
     next mot1
    ---------------
    Voilà j’espère que je n'ai pas fait d'erreur et que j'ai répondu à ta question.
    Mon écriture peut te paraitre archaïque mais j'ai appris de cette façon et tout seul.
    Ce code marche très bien mais, il gère ligne après ligne.
    Je précise tout de même pour ne pas alourdir la discussion, que j'ai simplifié pas mal la macro.
    Quoi qu'il en soit, je te remercie une fois encore pour ton aide.

  16. #16
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut coutifs
    Citation Envoyé par jurassic pork Voir le message
    Hello,
    voici une fonction VBA qui prend en paramètres une plage ligne dans laquelle on cherche et comme autre paramètre un tableau des valeurs à chercher. Elle renvoie un tableau qui contient les quantités numéraires des valeurs cherchées :
    Exemple :
    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
    18
    19
    20
    21
    Function Compter(Plage, tabSearch) As Variant
    Dim pos
    Dim tabRes() As Variant
    Dim Ligne As Variant
    Dim Cell As Variant
    ReDim tabRes(1 To UBound(tabSearch) - LBound(tabSearch) + 1)
    Ligne = Application.Transpose(Application.Transpose(Plage))
    For Each Cell In Ligne
           pos = Application.Match(cell, tabSearch, False)
           If Not IsError(pos) Then
              tabRes(pos) = tabRes(pos) + 1
           End If
    Next
    Compter = tabRes
    End Function
     
     
    Sub Test()
    Dim Resultat
    Resultat = Compter(Range("A18:O18"), Array(1, 2, 3))
    End Sub
    Ami calmant, J.P
    Merci !

  17. #17
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,

    Mon écriture peut te paraitre archaïque mais j'ai appris de cette façon et tout seul.
    Chacun pratique selon sa personnalité et son histoire et il n'y a qu'une bonne méthode, celle que l'on sait utiliser.

    Si je peux me permettre je te suggèrerai de remplacer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Range("AQ13").Select ' nombre de N°
     nbf1 = ActiveCell.Value
    par ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbf1 = Range("AQ13").Value ' nombre de N°
    Cela pour 2 raisons :
    - c'est plus simple à écrire comme tu peux le constater
    - c'est surtout infiniment plus rapide à l'exécution.
    et de même pour les autres affectations identiques comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(c, d).Value = x 'inscrit le nombre de couples
    En supprimant les select tu évites les affichages qui ne servent à rien sauf à consommer du traitement et donc du temps.

    Pour ce qui est ta question principale tu ne pourras pas en VBA compter plusieurs valeurs en matricielle avec CountIf, sauf à passer par une formule sur la feuille.

    Bonne continuation.

  18. #18
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    Hello,
    à noter que sur le modèle de ma fonction Compter présentée précédemment on peut utiliser une fonction qui emploie WorksheetFunction.CountIf et c'est plus performant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function Compter2(Plage, tabSearch) As Variant
    Dim i As Integer
    Dim tabRes() As Variant
    Dim Ligne As Variant
    Dim Cell As Variant
    ReDim tabRes(LBound(tabSearch) To UBound(tabSearch))
    For i = LBound(tabSearch) To UBound(tabSearch)
        tabRes(i) = WorksheetFunction.CountIf(Plage, tabSearch(i))
    Next i
    Compter2 = tabRes
    End Function
    Attention Les indices des tableaux résultats pour Compter et Compter2 ne sont pas les mêmes ( le tableau de Compter commence à 1, le tableau de Compter2 commence à 0).

    Voici un test de performance de 1000 boucles sur les fonctions. Ce test utilise le module de classe cBenchmark :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Test()
    Dim i As Integer
    Dim Resultat1, Resultat2
    Dim bm As New cBenchmark
    bm.TrackByName ("Debut")
    For i = 0 To 1000
       Resultat1 = Compter(Range("A18:O18"), Array(1, 2, 3))
    Next i
    bm.TrackByName ("BoucleCompter")
    For i = 0 To 1000
       Resultat2 = Compter2(Range("A18:O18"), Array(1, 2, 3))
    Next i
    bm.TrackByName ("BoucleCompter2")
    End Sub
    Résultat :

    IDnr
    Name Count Sum of tics Percentage Time
    0 Debut 1 135 0,01% 14 us
    1 BoucleCompter 1 1012465 84,53% 101 ms
    2 BoucleCompter2 1 185122 15,46% 19 ms


    Ami calmant, J.P

  19. #19
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour jurassic pork,

    Merci pour ton code intéressant sur ce sujet.
    Ce test utilise le module de classe cBenchmark :
    Je ne connais pas ce module, en quoi consiste-t-il ?

  20. #20
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 246
    Par défaut
    Citation Envoyé par anasecu Voir le message
    Je ne connais pas ce module, en quoi consiste-t-il ?
    Vba-cBenchmark

    A one-class module to conveniently profile your code. Reports automatically. Includes a convinience method to use instead of Application.Wait.
    Advantages

    • Accuracy to nanoseconds
    • No delay of console logging/using Debug.Print
    • Convenient to use
    • Profile code which is spread out over multiple functions or modules
    • Up to 256 different tracks

    How to use

    • Copy paste all code into a class module named cBenchmark
    • Create an instance of it at the start of your own code (fe Dim bm As New cBenchmark)
    • Or declare class instance as global to time multi-module code (write Set bm = New cBenchmark at start of code)
    • Write bm.TrackByName "Description of codepart" in between all of your code
    • Open Immediate window and run you're code
    • When you're code finishes, the report is printed automatically
    • Or, when instance is declared global, write Set bm = Nothing before last End Sub
    • The report will show each identically used name, the time it took and the time percentage of each track
    Attention le module utilise des "dictionary", il faut ajouter Microsoft Scripting Runtime dans les références.

    Ami calmant, J.P

Discussions similaires

  1. [XL-2016] VBA compter des valeurs en "heure" via une boucle
    Par roulax dans le forum Excel
    Réponses: 4
    Dernier message: 15/02/2022, 11h38
  2. [XL-2010] Compter des doublons en VBA.
    Par vindkald dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/01/2014, 17h12
  3. VBA Fonction WorksheetFunction.CountIf
    Par JonathanF dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 02/10/2011, 14h33
  4. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

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