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

Excel Discussion :

Calcul du nombre d'occurences unique (temps de calcul mise à jour) [XL-2010]


Sujet :

Excel

  1. #1
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut Calcul du nombre d'occurences unique (temps de calcul mise à jour)
    Bonjour,

    On a fréquemment besoin de calculer le nombre de valeurs uniques d'une série.

    Si mes valeurs sont en colonne A la formule en B1 est 1/nb.si(A:A;A1) à recopier sur toute la colonne B par exemple.
    (si dans la colonne A j'ai deux fois "bonjour", j'obtiens en face de chaque bonjour 0.5 dont le total fait 1).

    Cependant quand le nombre de lignes est élevé, ce calcul est très très long et après chaque modif dans la feuille ça repart.
    Habituellement j'effectue un copier coller valeur pour éviter le recalcul après chaque changement, mais si on doit supprimer ou ajouter des valeurs, alors il faut recommencer la manip.

    On est passé à plus 1mio de lignes dans Excel, mais on s'aperçoit dans la pratique que dès quelques miliers de lignes on a des fichiers énormes et que les calculs prennent des plombes !

    Dans mon exemple d'aujourd'hui jai 53 000 lignes sur 15 colonnes.
    Avez-vous une astuce autre que celle cité, ou d'interrompre le recalcul auto et de le lancer à la demande?
    Denis

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Points : 1 116
    Points
    1 116
    Par défaut
    Bonjour

    faut il chercher sur toutes les colonnes ou sur des colonnes bien précises ?

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Points : 1 116
    Points
    1 116
    Par défaut
    Re
    vite fait avant la soupe...
    Départ du tableau supposé en A1

    0,3 secondes sur 7600 lignes et 15 colonnes

    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
    Option Explicit
    Sub recenser()
    Dim Dercol As Byte, Derlig As Long, T_in
    Dim Dico As Object, Lig As Long, Col As Long
    Dim start As Single
    start = Timer
    Application.ScreenUpdating = False
    Set Dico = CreateObject("scripting.dictionary")
    Dercol = Rows(1).Find(what:="*", searchdirection:=xlPrevious).Column
    Derlig = Columns("A").Find(what:="*", searchdirection:=xlPrevious).Row
    T_in = Range(Cells(1, 1), Cells(Derlig, Dercol))
    For Lig = 1 To Derlig
        For Col = 1 To Dercol
            If Not Dico.exists(T_in(Lig, Col)) Then
                Dico.Add T_in(Lig, Col), 1
            Else
                Dico(T_in(Lig, Col)) = Dico(T_in(Lig, Col)) + 1
            End If
        Next
    Next
    With Sheets(2)
        .Range("A1").Resize(Dico.Count, 1) = Application.Transpose(Dico.keys)
        .Range("B1").Resize(Dico.Count, 1) = Application.Transpose(Dico.items)
        .Activate
    End With
    Application.ScreenUpdating = True
    MsgBox "durée: " & Timer - start & " sec."
    End Sub

  4. #4
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut
    Bonjour,

    Merci pour vos contributions.
    Je vois que je n'ai pas été assez précis !

    Oui dans le cas cité, je comptabilise une seule colonne.
    Par contre je souhaite avoir la valeur relative de chaque occurence pour pouvoir avoir la somme dans un TCD

    Je prends donc le code de Michel et je créé une macro perso que je peux utiliser à la demande au fur et à mesure
    en l'adaptant pour sélectionner la colonne à compter le calcul du ratio et la colonne cible.
    J'ai donc
    Valeur A 0.5
    Valeur A 0.5
    Valeur B 0.33
    Valeur B 0.33
    Valeur B 0.33 etc....

    J'ai 6 secondes pour 50 000 lignes ce qui est correct.


    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
     
    'Option Explicit
    Sub Comptage_unique()
    '
    ' Comptage_unique Macro
    ' la macro compte le nombre de chaque valeurs d'une colonne
    ' affiche le ration 1 sur nombre de valeurs pour comptabilisation dans TCD
    '
    Dim Dercol As Byte, Derlig As Long, T_in
    Dim Dico As Object, Lig As Long, Col As Long
    Dim start As Single
    Dim colcount As Integer
    Dim colbut As Integer
    Msg = "Indiquer la colonne (en chiffres) à compter"
    Title = "Colonne des valeurs à compter"
    colcount = Application.InputBox(Msg, Title)
     
    Msg = "Indiquer la colonne (en chiffres) où vous voulez le résultat"
    Title = "Colonne résultat"
    colbut = Application.InputBox(Msg, Title)
     
    'start = Timer
    Application.ScreenUpdating = False
    Set Dico = CreateObject("scripting.dictionary")
    Derlig = Columns(colcount).Find(what:="*", SearchDirection:=xlPrevious).Row
    T_in = Range(Cells(1, colcount), Cells(Derlig, colcount))
    For Lig = 1 To Derlig
            If Not Dico.exists(T_in(Lig, 1)) Then
                Dico.Add T_in(Lig, 1), 1
            Else
                Dico(T_in(Lig, 1)) = Dico(T_in(Lig, 1)) + 1
            End If
    Next
    For Lig = 1 To Derlig
    Cells(Lig, colbut) = 1 / Dico(T_in(Lig, 1))
    Next
    'Application.ScreenUpdating = True
    'MsgBox "durée: " & Timer - start & " sec."
    End Sub
    '
    Merci beaucoup

    Denis

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

Discussions similaires

  1. Calculer le nombre d'occurence différentes
    Par mfmf99 dans le forum Excel
    Réponses: 6
    Dernier message: 18/01/2008, 10h20
  2. Calcul du nombre d'occurences dans une colonne
    Par Masmeta dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/09/2007, 15h11
  3. [XSLT] Nombre D'occurence unique
    Par ANISSS dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 07/11/2006, 09h34
  4. Réponses: 4
    Dernier message: 07/09/2006, 15h02
  5. Réponses: 4
    Dernier message: 16/12/2005, 19h36

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