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 éléments différents dans une même liste [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 65
    Points
    65
    Par défaut Compter des éléments différents dans une même liste
    Bonjour,

    Avant de vous demander de l'aide j'ai regardé ce qui se faisait ailleurs, mais ça n'a pas été concluant, j'ai donc créé mon propre code mais comme je ne maitrise pas les Array ou tableau dimensionnel, ça plante.

    Mon souhait est de compter le nombre de valeur distincte dans un liste de plusieurs centaines de ligne.

    Au départ je faisait un Nb.si( plage(colonne) , critere 1) puis de ça je voulais obtenir le nombre d'éléments distinctes d'une autre plage(colonne) mais avec les formule je séchais.

    Du coup, j'ai créé ce code qui me permet d'interroger les ligne suvant mon critère 1 puis d'inclure l'élement en question dans un tableau dimensionnel s'il n'existe pas. Or avec ce code j'ai le message " erreur d'execution 9 : l'indice n'appartient pas à la selection" grrr!!!
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     
    Sub Compteur()
    Dim i As Integer, a As Integer, b As Integer, x As Integer, finlist As Integer
     
    Dim tab_lot() As Variant
     
    Dim tab_ref() As Variant
     
    i = 4
     
    finlist = Sheets("Réserve M3").Range("A5000").End(xlUp).Row
     
    With ActiveSheet
    For i = 4 To 36
     
        x = 4
        a = 1
        b = 1
        'zone de recherche
        For x = 4 To finlist
     
            'recherche même emplacement
            If Sheets("Réserve M3").Cells(x, 2) = .Cells(i, 6) Then
     
                'compteur lot
                For a = 1 To UBound(tab_lot, 1)
                    If Sheets("Réserve M3").Cells(x, 6) <> tab_lot(a) Then
                        tab_lot(a) = Sheets("Réserve M3").Cells(x, 6)
                        a = a + 1
                    End If
                Next a
     
                'compteur ref
                For b = 1 To UBound(tab_ref, 1)
                    If Sheets("Réserve M3").Cells(x, 5) <> tab_ref(b) Then
                        tab_ref(b) = Sheets("Réserve M3").Cells(x, 5)
                        b = b + 1
                    End If
                Next b
     
            End If
     
        Next x
     
        'retranscription des compteurs
        .Cells(i, 3) = b - 1 'nombre réf
        .Cells(i, 4) = a - 1 'nombre lot
     
    Next i
     
    End With
     
    End Sub
    je soupçonne une mausaise déclaration.


    Merci

  2. #2
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Ta première ligne, déjà, me donne des boutons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim i As Integer, a As Integer, b As Integer, x As Integer, finlist As Integer
    Pour déclarer des variables, il faut le faire sur plusieurs lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim i As Integer
    Dim a As Integer
    Dim b As Integer
    Dim x As Integer
    Dim finlist As Integer
    Ensuite, l'erreur, tu ne nous dit pas sur quelle ligne elle est
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    illight ta remarque est fausse
    les déclarations peuvent très bien être faite sur une seule ligne
    la seule condition qui est conseillée c'est le type
    bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim A as string,B as long,C as variant
    moins bon mais fonctionnel(déconseillé)
    quand le type n'est pas déclaré le type est automatiquement "variant " ce qui implique une prise en charge de la mémoire plus importante

    ensuite l'erreur vient du fait que la comparaison entre les cellules et les 2 variable tableau(tab_lot,tab_ref) est faite sans avoir au préalable instruit ces deux variable
    ce qui a pour conséquence de comparer quelque chose a rien donc forcement pris en compte

    tu devrais regarder du cote de l'object Scripting dictionnary(dictionnaire )

    qui quand on l'instruit supprime automatiquement les doublons
    le count du dictionnaire te donnerait le nombre de cel différente

    moi je dis ca je dis rien
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 65
    Points
    65
    Par défaut
    Merci patrick, je vais me renseigner sur cet objet que je n'ai jamais utilisé encore.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 65
    Points
    65
    Par défaut Modification de code
    Alors j'ai écris ceci mais le résultat est mauvais pourtant j'ajoute les éléments s'il n'existe pas et je remets à zéro le tableau à chaque changement d'emplacement.

    Merci pour ton aide :
    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
    45
    46
    47
    48
     
    Sub Compteur()
    Dim i As Long, x As Long, finlist As Long
    Dim Dico_lot
    Dim Dico_ref
     
    Set Dico_lot = CreateObject("Scripting.dictionary")
    Set Dico_ref = CreateObject("Scripting.dictionary")
    i = 4
     
    finlist = Sheets("Réserve M3").Range("A5000").End(xlUp).Row
     
    With ActiveSheet
    For i = 4 To 36
     
    Dico_ref.RemoveAll
    Dico_lot.RemoveAll
     
        x = 4
     
        'zone de recherche
        For x = 4 To finlist
     
            'recherche même emplacement
            If Sheets("Réserve M3").Cells(x, 2) = .Cells(i, 6) Then
                'ajoute le n° de lot s'il n'existe pas
                If Not Dico_lot.Exists(.Cells(x, 6).Value) Then
                    Dico_lot.Add .Cells(x, 6).Value, .Cells(x, 6).Offset(0, 1).Value
                End If
                'ajoute la réfèrence si elle n'existe pas
                If Not Dico_ref.Exists(.Cells(x, 5).Value) Then
                    Dico_ref.Add .Cells(x, 5).Value, .Cells(x, 5).Offset(0, 1).Value
                End If
     
     
            End If
     
        Next x
     
        'retranscription des compteurs
        .Cells(i, 3) = Dico_ref.Count 'nombre réf
        .Cells(i, 4) = Dico_lot.Count 'nombre lot
     
    Next i
     
    End With
     
    End Sub

  6. #6
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut




    Bonjour,

    joindre un fichier .xlsx accompagné d'une explication claire & exhaustive du but recherché …

    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    Sauriez vous pourquoi ma macro ne fonctionne pas comme je le souhaite ?

    Merci,
    Wilfried

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 65
    Points
    65
    Par défaut
    Bon j'ai compris mon erreur, c'était tout simplement la source d'information qui était mal renseigné.

    Vu que je n'avais pas spécifié de feuille pour ajouter les éléments dans le dico alors qu j'étais dans une boucle "with ... ", j'ajoutais ceux de la feuille active or la source était sur une autre feuille du fichier.

    Merci à Patrick qui m'a permis de découvrir une nouvelle utilisation dans VB et de résoudre mon problème.

    Bonne continuation à tous,
    Will

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

Discussions similaires

  1. Déplacer des éléments différents d'une liste
    Par altair8080 dans le forum jQuery
    Réponses: 1
    Dernier message: 01/06/2014, 15h33
  2. [SP-2010] Ensemble des Tâches assignées dans une même liste
    Par Gratiano dans le forum SharePoint
    Réponses: 6
    Dernier message: 18/04/2014, 13h14
  3. Réponses: 20
    Dernier message: 27/07/2010, 15h52
  4. Récupération des éléments sélectionner dans une liste
    Par Jasmine80 dans le forum Interfaces Graphiques
    Réponses: 13
    Dernier message: 17/09/2009, 12h52
  5. Réponses: 7
    Dernier message: 13/10/2006, 00h45

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