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 :

VBA - Countif / Ne renvoit pas les bonnes valeurs


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Autre
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Par défaut VBA - Countif / Ne renvoit pas les bonnes valeurs
    Bonjour à tous,

    J'ai écumé tous les forums, testé toutes les syntaxes proposées mais ne trouve pas la réponse à mon problème...
    En VBA, je cherche à retrouver le nombre de valeurs uniques (nombre de "code" unique sur le fichier joint, colonne A) pour une référence donnée (colonne U).

    Pour cela, j'ai tenté de combiner les fonctions SumProduct et Countif, sans succès.
    J'ai donc choisi d'effectuer le traitement en deux parties, en partant d'un exemple (fructueux) sur Excel :
    1/ NB.SI (colonne U, Référence) / NB.SI.ENS (colonne U, Référence, colonne A, code)
    Puis
    2/ SOMME.SI(colonne U, ma Référence, Résultat du 1) / NB.SI(colonne U, ma Référence)

    Lorsque je transpose ces formules en VBA (avec CountIf et SumIf), la macro traite les données et je n'ai pas d'erreur d'exécution mais le résultat renvoyé n'est pas le bon.
    Pour essayer de comprendre pourquoi, j'ai décomposé ma formule et me suis rendue compte que ma fonction Countif ne me renvoyait pas les valeurs souhaitées.
    En effet, si je teste COUNTIF seul sur un exemple (fichier ci-joint avec résultat de la macro en colonne U et V) : Au lieu d'avoir, pour la première occurence, le nombre d'occurence de la valeur dans la colonne, la formule se comporte comme si elle écrivait seulement le nombre d'occurence rencontrée.. Comme si elle ne prenait pas l'intégralité de la plage. Je vous invite à regarder le fichier ci-joint, illustrant mon propos. Extraction_BB.xlsx
    Pour résumer, pour une occurrence apparaissant 4 fois, au lieu d'avoir "4" sur les lignes concernées, j'ai :
    occ1 1
    occ1 2
    occ1 3
    occ1 4


    Le code de ma macro est le suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim FichierED As Workbook
    Dim Der_lign As Integer
    Dim X As Integer
     
     
    For X = 2 To Der_lign  
    FichierED.Worksheets(1).Cells(X, 21).Value = Cells(X, 4) & Cells(X, 7)    'la colonne U est la concaténation des colonnes D et G
    FichierED.Worksheets(1).Cells(X, 22).Formula = WorksheetFunction.CountIf(Range("U:U"), Cells(X, 21).Value)
    Next X



    Je ne comprend vraiment pas pourquoi Countif ne considère pas la totalité de la colonne.. J'ai essayé différentes syntaxes mais rien n'y fait. Quelqu'un peut-il m'éclairer ?

    Je vous remercie par avance.
    Bonne journée

  2. #2
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    bonsoir
    essayer avec ça :
    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
    Option Explicit
    Sub test()
    Dim Plage As Range, i As Long, j As Integer
    Application.ScreenUpdating = False
    With Sheets("ED_2016_2017")
    i = .Range("A" & Rows.Count).End(xlUp).Row
     j = 2
            For j = 2 To i
            Set Plage = .Range("U2:U" & j)
     
                    .Cells(j, 22) = Application.CountIf(Plage, .Cells(j, 21))   
            Next j
        End With
        Application.ScreenUpdating = True
    End Sub

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Autre
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Par défaut
    Bonjour BENNASR,

    Je vous remercie mais j'obtiens le même résultat que précédemment. Au lieu de m'écrire directement le nombre total d’occurrences, elles s'incrémentent au fur et à mesure...
    occ1 1
    occ1 2
    occ1 3
    occ1 4

    Mis à part le remplacement de i par Der_Lign_ED, j'ai noté exactement ce que vous m'avez conseillé

    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
     
    Dim Plage As Range, Der_Lign_ED As Long, j As Integer
    Application.ScreenUpdating = False
    With Sheets(1)
         Der_lign_ED = Range("A" & Rows.Count).End(xlUp).Row
     
            j = 2
            For j = 2 To Der_lign_ED
            Set Plage = .Range("U2:U" & Der_lign_ED)
     
                .Cells(j, 21).Value = Cells(j, 4) & Cells(j, 7)
     
                .Cells(j, 22) = Application.CountIf(Plage, .Cells(j, 21))
     
            Next j
          End With

    Savez-vous d'où vient cette "anomalie" de Countif utilisé de cette façon ? y'a-t-il un autre moyen de faire ?

  4. #4
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    re
    j'ai pensé que tu cherche à faire ça
    mais si tu cherche à compter dans toute le colonne il suffit de changer le j par i dans la définition de la plage:
    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
    Option Explicit
    Sub test()
    Dim Plage As Range, i As Long, j As Integer
    Application.ScreenUpdating = False
    With Sheets("ED_2016_2017")
    i = .Range("A" & Rows.Count).End(xlUp).Row
     j = 2
            For j = 2 To i
            Set Plage = .Range("U2:U" & i)
     
                    .Cells(j, 22) = Application.CountIf(Plage, .Cells(j, 21))
     
            Next j
        End With
        Application.ScreenUpdating = True
    End Sub

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Autre
    Inscrit en
    Novembre 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Novembre 2017
    Messages : 5
    Par défaut
    Re,

    Oui j'ai déjà bien mis l'équivalent de votre i (pour moi c'est la variable Der_lign) dans la définition de la plage... Ca ne fonctionne pas et me renvoit toujours le même résultat...
    occ1 1
    occ1 2
    occ1 3
    occ1 4

    au lieu de ce que je souhaiterais :
    occ1 4
    occ1 4
    occ1 4
    occ1 4

  6. #6
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    re
    je sais pas d'ou tu appelle ton code
    mais ajouter dans le with un point devant cells
    .Cells(j, 21).Value = Cells(j, 4) & Cells(j, 7)
    aussi un point devant :
    Range("A" & Rows.Count).End(xlUp).Row
    et ça fonctionne chez moi
    ce qui donne :
    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
    Sub test()
    Dim Plage As Range, Der_Lign_ED As Long, j As Integer
    Application.ScreenUpdating = False
    With Sheets(1)
    Der_Lign_ED = .Range("A" & Rows.Count).End(xlUp).Row
     
    j = 2
    For j = 2 To Der_Lign_ED
    Set Plage = .Range("U2:U" & Der_Lign_ED)
     
    .Cells(j, 21).Value = .Cells(j, 4) & .Cells(j, 7)
     
    .Cells(j, 22) = Application.CountIf(Plage, .Cells(j, 21))
     
    Next j
    End With
    End Sub

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

Discussions similaires

  1. Execute_query ne retourne pas les bonnes valeurs
    Par complicated dans le forum Forms
    Réponses: 2
    Dernier message: 23/11/2011, 11h12
  2. Requete qui n'affiche pas les bonnes valeurs
    Par snips67 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 29/01/2010, 10h54
  3. SWIG ne genere pas les bonnes methodes!
    Par nezdeboeuf62 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 01/03/2007, 18h24
  4. [SQL] Pb Mysql n'insert pas les bonnes valeur dans la bdd
    Par potao dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 11/02/2007, 03h12

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