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 doublons pour chaque valeur dans array


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    dev
    Inscrit en
    Février 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2015
    Messages : 80
    Par défaut Compter doublons pour chaque valeur dans array
    Bonjour,

    j'ai cherché du coté des dictionnaires mais pas trouvé la solution.

    Je met dans un array des valeurs (500.000) et je souhaite compter les doublons, donc mettre dans la 2eme dimensions ou dans un autre tableau (sans changer l'ordre car je colle après dans la feuille excel) le nombre de doublons pour chaque valeur.

    Exemple:

    t(1)=a
    t(2)=b
    t(3)=a
    t(4)=c
    t(5)=c

    Donnera:

    d(1)=2
    d(2)=1
    d(3)=2
    d(4)=2
    d(5)=2


    Merci !

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour,

    pas besoin de code pour ce résultat, utiliser la fonction de feuille de calculs NB.SI !

    _________________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    _________________________________________________________________________________________________________
    Je suis Paris, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    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 : 67
    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
    Bonjour à toi, Bonjour au Forum,

    BONNE ANNEE A TOUS! SANTE, JOIES ET ACCOMPLISSEMENT.

    Pour ma part, je ne vois que l'exploitation d'un dictionnaire.
    Schéma:
    - Alimentation d'un dictionnaire à partir de l'Array
    - Comptabiliser chaque clé du dictionnaire dans l'Array

    Au demeurant, j'admettrais volontiers l'existence d'une solution plus simple.

    Essaie de coder ainsi et reviens si nécessaire en retournant ton code.

  4. #4
    Membre confirmé
    Homme Profil pro
    dev
    Inscrit en
    Février 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2015
    Messages : 80
    Par défaut
    Tres bien je regarde ca.

    Ca marche si les données sont sur plusieurs feuilles ?

    Merci

  5. #5
    Membre confirmé
    Homme Profil pro
    dev
    Inscrit en
    Février 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2015
    Messages : 80
    Par défaut
    Ok marcel je regarde ca merci.

  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 : 67
    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
    Salut,

    Oui, du fait que tu redimensionnes ton Array en préservant les données.
    Et ce quelle qu'en soit l'origine.

  7. #7
    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,

    Pour un grand nombre d'items, doit être + rapide que NBSI:

    -Pour 10.000 items, le temps de calcul n'est pas mesurable avec la fonction matricielle NBSIMAT().
    -Avec NB.SI() classique recopié 10.000 fois, il faut 3 sec de calcul.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub essai()
      t = [A2:A6]
      Set d1 = CreateObject("Scripting.Dictionary")
      For Each c In t
        d1(c) = d1(c) + 1
      Next c
      Dim t2(): ReDim t2(1 To UBound(t))
      For i = 1 To UBound(t)
        t2(i) = d1(t(i, 1))
      Next i
      [b2].Resize(UBound(t)) = Application.Transpose(t2)
    End Sub
    On peut construire un fonction perso matricielle

    sélectionner B2:B6
    =NBSIMAT(A2:A6)
    Valider avec maj+ctrl+entrée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function NBSIMAT(champ)
      t = champ
      Set d1 = CreateObject("Scripting.Dictionary")
      For Each c In t
        d1(c) = d1(c) + 1
      Next c
      Dim t2(): ReDim t2(1 To UBound(t))
      For i = 1 To UBound(t)
        t2(i) = d1(t(i, 1))
      Next i
      NBSIMAT = Application.Transpose(t2)
    End Function
    http://boisgontierjacques.free.fr/fi...s/NBSIDico.xls

    boisgontier
    http://boisgontierjacques.free.fr
    Fichiers attachés Fichiers attachés

  8. #8
    Membre confirmé
    Homme Profil pro
    dev
    Inscrit en
    Février 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2015
    Messages : 80
    Par défaut
    Bonjour,

    merci Jacques, ça fonctionne bien.

    PS: j'utilise souvent votre site (très bien)

    Voici le code adapté :

    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
    41
    42
    43
    44
    lUbndDoubl = 0
    lId = 1
    For Each ws In wbHist.Sheets
        If ws.Name Like "####*" Then
        lId = 1
            For i = 2 To lGetSheetLastLine(ws, 1, 1)
                ReDim Preserve sTabDoubl(1 To lId + lUbndDoubl)
                sTabDoubl(lId + lUbndDoubl) = ws.Cells(i, 30).Value
                lId = lId + 1
     
            Next i
            lUbndDoubl = UBound(sTabDoubl)
        End If
    Next ws
     
    ReDim sTabDoubl2(1 To UBound(sTabDoubl), 1 To 1)
    For i = 1 To UBound(sTabDoubl)
        sTabDoubl2(i, 1) = sTabDoubl(i)
    Next i
     
      Set d1 = CreateObject("Scripting.Dictionary")
      For Each c In sTabDoubl2
        d1(c) = d1(c) + 1
      Next c
      Dim t2(): ReDim t2(1 To UBound(t), 1 To 1)
      For i = 1 To UBound(t)
        t2(i, 1) = d1(sTabDoubl2(i, 1))
      Next i
     
    s = 1
    For Each ws In wbHist.Sheets
    If ws.Name Like "####*" Then
        Erase tr
        ReDim tr(1 To lGetSheetLastLine(ws, 1, 1) - 1, 1 To 1)
        For i = s To lGetSheetLastLine(ws, 1, 1) - 2 + s
        tr(i - s + 1, 1) = t2(i, 1)
        Next i
        ws.Range(ws.Cells(2, 31), ws.Cells(lGetSheetLastLine(ws, 1, 1), 31)).Value = tr
        s = lGetSheetLastLine(ws, 1, 1)
    End If
    Next ws
     
    Erase t2
    Erase tr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 18
    Dernier message: 24/11/2015, 08h42
  2. Réponses: 3
    Dernier message: 09/01/2012, 14h08
  3. Réponses: 1
    Dernier message: 03/07/2007, 16h04
  4. Réponses: 1
    Dernier message: 18/05/2005, 18h18
  5. [VB.NET] Taille differente pour chaque colonne dans DATAGRID
    Par stephane93fr dans le forum Windows Forms
    Réponses: 14
    Dernier message: 12/01/2005, 16h50

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