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 :

Macro permettant de compter le nombre d'occurrences


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    technicien méthode et industrialisation
    Inscrit en
    Août 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : technicien méthode et industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 3
    Par défaut Macro permettant de compter le nombre d'occurrences
    Bonjour,

    J'ai un tableau avec 2 colonnes comportant :
    - Dans la première colonne : des lettres
    - Dans la deuxième colonne : les types associés aux lettres

    Je peux avoir plusieurs fois le même type pour une lettre.
    Le but est de déterminer pour chaque lettre différente de la première colonne le nombre d'occurrence maximum et le 2ème nombre d'occurrence maximum des types associés.
    Les résultats doivent ensuite être marqués dans un tableau récapitulatif.

    Je joins un fichier comportant le tableau récapitulatif à remplir automatiquement et détaillant un peu mieux ma demande avec un exemple.
    J'ai déjà cherché un long moment sans trouver la solution. Cette macro est très importante pour un fichier que j'utilise au boulot et m'éviterai bien des erreurs.

    J'espère que ma demande est assez clair sinon n'hésitez pas à me demander des explications supplémentaires.

    Je vous remercie d'avance pour votre aide.

    Cordialement.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Homme Profil pro
    Chargé d'Ingénierie et d'Analyses en Ressources Humaines
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'Ingénierie et d'Analyses en Ressources Humaines
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Par défaut
    Une première piste à adapter je pense et qui te permettrait de déterminer le nombre d'occurrences.

    http://silkyroad.developpez.com/excel/doublons/#LIV-D

    En tout cas, moi, je chercherais par là dans un premier temps...

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    Cf PJ

    =MotPlusFrequent($E$3:$F$100;A4)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function MotPlusFrequent(champ, critère)
      Set MonDico = CreateObject("Scripting.Dictionary")
      a = champ
      For i = LBound(a) To UBound(a)
        If a(i, 1) = critère Then MonDico(a(i, 2)) = MonDico(a(i, 2)) + 1
      Next i
      m = 0
      For Each c In MonDico
        If MonDico.Item(c) > m Then m = MonDico.Item(c): temp = c
      Next c
      MotPlusFrequent = m
    End Function
    Jacques Boisgontier
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut occurences
    Bonjour à vous, Bonjour au Forum,

    Jacques.

    (Ravi de te voir sur ce forum, j'ai tes contributions dans mes favoris Internet)

    J'essaie de comprendre ton code.
    Mais je n'arrive pas à utiliser ta fonction dans le VBE.

    Apparemment, mais je peux me tromper, l'argument "champ" est considéré comme d'un autre type que Range.
    Dans ce cas, tu aurais écrit

    Or, si j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub essai_frequ()
    Debug.Print MotPlusFrequent("E3:F31", "A")
    End Sub
    J'obtiens une erreur "13 - Incompatibilité de type" sur la ligne Ce qui pourrait être logique.

    Comment faire alors?

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonsoir,

    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
    39
    40
     
    Sub essai()
      Set champ = Range("e3:f100")
      For Each c In [A4:A8]
        c.Offset(, 1) = MotPlusFrequent(champ, c)
        c.Offset(, 2) = MotPlusFrequent2(champ, c)
      Next c
    End Sub
     
    Function MotPlusFrequent(champ, critère)
      Set MonDico = CreateObject("Scripting.Dictionary")
      a = champ
      For i = LBound(a) To UBound(a)
        If a(i, 1) = critère Then MonDico(a(i, 2)) = MonDico(a(i, 2)) + 1
      Next i
      m = 0
      For Each c In MonDico
        If MonDico.Item(c) > m Then m = MonDico.Item(c): temp = c
      Next c
      MotPlusFrequent = m
    End Function
     
    Function MotPlusFrequent2(champ, critère)
      Set MonDico = CreateObject("Scripting.Dictionary")
      a = champ
      For i = LBound(a) To UBound(a)
        If a(i, 1) = critère Then MonDico(a(i, 2)) = MonDico(a(i, 2)) + 1
      Next i
      m = 0
      For Each c In MonDico
        If MonDico.Item(c) > m Then m = MonDico.Item(c): temp = c
      Next c
      m2 = 0
      For Each c In MonDico
       If c <> temp Then
        If MonDico.Item(c) > m2 Then m2 = MonDico.Item(c): temp2 = c
       End If
      Next c
      MotPlusFrequent2 = m2
    End Function
    Jacques Boisgontier
    Fichiers attachés Fichiers attachés

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut fonction dans VBE
    Bonjour à vous, Bonjour au Forum,

    En effet,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub essai2()
      Set champ = Range("e3:f100")
      Debug.Print MotPlusFrequent(champ, "A")
    End Sub
    Ce code est bien effectif.
    Une autre utilité des dictionnaires, que la gestion des doublons.

    Merci, Jacques, et à bientôt j'espère.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/04/2008, 16h19
  2. Compter le nombre d'occurrences
    Par RKU01 dans le forum Langage
    Réponses: 1
    Dernier message: 22/03/2008, 17h22
  3. Réponses: 5
    Dernier message: 17/02/2008, 12h32
  4. Réponses: 2
    Dernier message: 06/05/2007, 23h43
  5. [débutant] Compter le nombre d'occurrence d'un texte
    Par PoichOU dans le forum Langage
    Réponses: 2
    Dernier message: 14/10/2006, 00h00

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