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 :

Ligne de code countif ne fonctionne pas systématiquement [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 100
    Par défaut Ligne de code countif ne fonctionne pas systématiquement
    Bonjour,

    Je suis en cours de rédaction d'un code pour :
    1) Regarder dans la table 1 la quantité de ligne correspondant à un critère
    2) Si la quantité de ligne est supérieure à 2, regarder si mon critère est dans la table 2
    3) Si le critère n'est pas déjà présent dans la table 2, copier le critère dans la table 2

    Pour cela j'ai créer le code ci-dessous

    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
     
    Sub mise_a_jour()
     
    Dim i As Integer
    Dim MaxDantotsu As Integer
    Dim k As Integer
    Dim j As Integer
     
    Dim Dantotsu As Worksheet
    Dim Data_CVI As Worksheet
     
    Set Dantotsu = Sheets("Dantotsu")
    Set Data_CVI = Sheets("Data_CVI")
     
    Data_CVI.Activate
     
    'Déterminer le numéro Dantotsu max de l'onglet Data_CVI
        MaxDantotsu = Data_CVI.Application.WorksheetFunction.Max(Range("g2:g" & Range("g65530").End(xlUp).Row))
     
    'Copier les numéros Dantotsu dans l'ordre croissant et sans saut de ligne depuis l'onglet Data_CVI vers l'onglet Dantotsu. Les nouveaux points Dantotsu s'affichent sur fond rouge
        k = 2
        For i = 1 To MaxDantotsu
            If Data_CVI.Application.WorksheetFunction.CountIf([g:g], UCase(i)) > 2 Then
    '            If Dantotsu.Application.WorksheetFunction.CountIf(Range(Cells(2, 1), Cells(MaxDantotsu, 1)), i) = 0 Then
    '            j = Dantotsu.Application.WorksheetFunction.CountIf([A:A], UCase(i))
                Dantotsu.Cells(1, 7).Value = Application.WorksheetFunction.CountIf(Range("A2:A" & MaxDantotsu), i)
                If j = 0 Then
    '            If Dantotsu.Application.WorksheetFunction.CountIf([A:A], UCase(i)) = 0 Then
                    Dantotsu.Cells(k, 1) = i
                    Dantotsu.Cells(k, 1).Interior.ColorIndex = 3
                End If
                k = k + 1
            End If
        Next i
     
    End Sub
    Comme visible ci-dessus j'ai essayé plusieurs façon de vérifier que mon critère "i" soit présent dans la table 2 (Dantotsu) mais cela ne fonctionne pas...

    Si quelqu'un avait la gentillesse de m'éclairer, je lui en serais reconnaisssant.

    Cordialement
    Sylvain

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

    2 remarques
    i étant numérique, ne sert à rien. "i" sufit
    Considérer le maximum de ta colonne initiale G de la feuille Data_CVI suppose que les données soient suivies (1,2,3...65).
    Dans le cas contraire (1,2,3,23,34,....45,65), il faudrait plutôt balayer ta plage d'origine et créer un dictionnaire dont les clés seraient décomptés.
    Ces données sont-elles suivies?

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

    Code effectif pour tous les cas de figure.
    Attention! Vérifier l'adressage (A2, ...)

    Pense à activer la Référence Scripting.Runtime (Menu Outils\Références de ton éditeur VBE)
    Ceci afin de bien déclarer le dictionnaire, trop généralement déclaré en Variant.
    Ce type de déclaration permet d'obtenir toutes les propriétés et méthodes lors de la saisie.

    Tu peux tester par une exécution pas à pas. (éventuellement point d'arrêt)

    Reviens pour toute question.

    Voici, Voilou

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Option Explicit
     
    Sub marcel_mise_a_jour()
     
    Dim Dantotsu As Worksheet
    Dim Data_CVI As Worksheet
     
    Set Dantotsu = ThisWorkbook.Worksheets("Dantotsu")
    Set Data_CVI = ThisWorkbook.Worksheets("Data_CVI")
     
    Dim i As Integer, j As Integer, k As Integer
     
    Dim derlignsu As Integer, derligncvi As Integer
    Dim laplagesu As Range, laplagecvi As Range
     
    Dim c As Range
     
    '---------------------------------------------------------------
    'Activer la Référence Scripting.Runtime
    ''---------------------------------------------------------------
    Dim dico As Scripting.Dictionary
     
    Dim clé As Variant
    Dim t As Range
     
    With Dantotsu
        derlignsu = .Cells(.Rows.Count, 7).End(xlUp).Row
        Set laplagesu = .Range("A1:A" & derlignsu)
    End With
     
    With Data_CVI
            derligncvi = .Cells(.Rows.Count, 7).End(xlUp).Row
            Set laplagecvi = .Range("G2:G" & derligncvi)
    End With
     
    Set dico = CreateObject("Scripting.Dictionary")
     
    For Each c In laplagecvi
            With c
                    If Not dico.Exists(c.Value) Then _
                                dico.Add .Value, .Value
            End With
    Next c
     
    For Each clé In dico.Keys
            If Application.WorksheetFunction.CountIf(laplagecvi, clé) > 2 Then
                    Set t = laplagesu.Find(clé, LookIn:=xlValues, Lookat:=xlWhole)
                    If t Is Nothing Then
                            Dantotsu.Cells(derlignsu + 1, 1).Value = clé
                            derlignsu = derlignsu + 1
                            Set laplagesu = Dantotsu.Range("A1:A" & derlignsu)
                    End If
                    Set t = Nothing
            End If
    Next clé
     
    dico.RemoveAll
    Set dico = Nothing
     
    Set laplagecvi = Nothing
    Set laplagesu = Nothing
     
    Set Data_CVI = Nothing
    Set Dantotsu = Nothing
     
    End Sub

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 100
    Par défaut
    Bonjour MarcelG et merci beaucoup!

    Je viens de tester et cela fonctionne parfaitement. Je vais avoir besoin de mettre dans l'odre croissant les numéros et de ne pas afficher de cellule vide mais j'espère pouvoir m'en sortir seul.
    Je note le sujet comme résolu.
    Bonne journée

    Sylvain

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 100
    Par défaut
    Il me vient une question : si je veux que seules les données supérieures à 2 exemplaires ne soient dans le dictionnaire, quelles modifications dois-je apporter?
    En d'autres termes : je souhaiterais faire le calcul des données supérieures à 2 exemplaires avant dans le processus pour ne plus avoir à manipuler que ces données.

    Merci d'avance et bonne journée

  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,

    Si j'ai bien compris, le dictionnaire est enrichi par les seules données décomptées plus de 2 fois.
    Il suffit de déplacer cette condition vers l'alimentation du dictionnaire.

    Comme suit

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    Sub marcel_mise_a_jour_2()
     
    Dim Dantotsu As Worksheet
    Dim Data_CVI As Worksheet
     
    Set Dantotsu = ThisWorkbook.Worksheets("Dantotsu")
    Set Data_CVI = ThisWorkbook.Worksheets("Data_CVI")
     
    Dim i As Integer, j As Integer, k As Integer
     
    Dim derlignsu As Integer, derligncvi As Integer
    Dim laplagesu As Range, laplagecvi As Range
     
    Dim c As Range
     
    '---------------------------------------------------------------
    'Activer la Référence Scripting.Runtime
    ''---------------------------------------------------------------
    Dim dico As Scripting.Dictionary
     
    Dim clé As Variant
    Dim t As Range
     
    With Dantotsu
        derlignsu = .Cells(.Rows.Count, 7).End(xlUp).Row
        Set laplagesu = .Range("A1:A" & derlignsu)
    End With
     
    With Data_CVI
            derligncvi = .Cells(.Rows.Count, 7).End(xlUp).Row
            Set laplagecvi = .Range("G2:G" & derligncvi)
    End With
     
    Set dico = CreateObject("Scripting.Dictionary")
     
    For Each c In laplagecvi
            With c
                    If Application.WorksheetFunction.CountIf(laplagecvi, .Value) > 2 Then
                            If Not dico.Exists(c.Value) Then _
                                        dico.Add .Value, .Value
                    End If
            End With
    Next c
     
    For Each clé In dico.Keys
            Set t = laplagesu.Find(clé, LookIn:=xlValues, Lookat:=xlWhole)
            If t Is Nothing Then
                    Dantotsu.Cells(derlignsu + 1, 1).Value = clé
                    derlignsu = derlignsu + 1
                    Set laplagesu = Dantotsu.Range("A1:A" & derlignsu)
            End If
            Set t = Nothing
    Next clé
     
    dico.RemoveAll
    Set dico = Nothing
     
    Set laplagecvi = Nothing
    Set laplagesu = Nothing
     
    Set Data_CVI = Nothing
    Set Dantotsu = Nothing
     
    End Sub

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/06/2016, 15h44
  2. [AJAX] Code tuto Ajax fonctionne pas sous FF, mais IE et OP sont OK
    Par hugo69 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 08/01/2007, 21h27
  3. [Language] Code qui ne fonctionne pas
    Par kevinf dans le forum Langage
    Réponses: 2
    Dernier message: 21/11/2006, 21h08
  4. Code qui ne fonctionne pas
    Par maxti dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 22/10/2006, 11h45
  5. Code qui ne fonctionne pas sur Mac
    Par malbaladejo dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/01/2005, 11h08

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