Countif VBA

Bonsoir à tous,

j'aimerais comprendre ce qui ne va pas avec mon code ci-dessous.

With [WorkPackages].ListObject
    Set d = .ListColumns("Id_Project").Range.Find(what:=Id_Project, LookIn:=xlValues, LookAt:=xlWhole)
    fin = WorksheetFunction.CountIf(.DataBodyRange, Id_Project) - 1
    If Not d Is Nothing Then
        Set WP_Array = .Range.Rows(d.row).Resize(fin)

End If
End With

En effet le countif semble poser un soucis.

je suis obligé de mettre -1 à fin afin que le résultat soit correct

sauf que selon les cas cela ne fonctionne pas

un coup ca me genere le resutat correct soit -1 tel qu"afficher dans le code..

ou est mon erreur svp?

une autre manière de procéder plus fiable?

j'ai rencontre ce jour la même chose sachant que je n'avais pas le -1 initialement alors ca m'a donner la ligne suivante ne correspondant meme pas à 'Id_Project pourtant reconnu...

With [T_Accounts].ListObject
    Set d = .ListColumns("Id_Project").Range.Find(what:=Id_Project, LookIn:=xlValues, LookAt:=xlWhole)
    fin = WorksheetFunction.CountIf(.DataBodyRange, Id_Project) - 1
    If Not d Is Nothing Then
        Set Maplage = .Range.Rows(d.row).Resize(fin)

merci par avance pour votre aide

bonne soirée

Bonjour,

Non CountIfs n'est pas forcément approprié ici !

Il faudrait faire un test sur le fichier ... que je n'ai pas trouvé !

Tu peux remplacer WorksheetFunction.CountIfs(_______ par Application.Count(Application.Match_______

du genre

xxx=Application.Count(Application.Match(ici_mon_tableau, Array(ici_mes_valeurs), 0))

Bonjour

merci pour votre retour

voici le fichier joint expliquant le soucis

j'ai tenté avec cette autre ligne de code mais dans mon cas il ne prend que le premier résultat et pas l' autre

3prob-countif.xlsm (22.60 Ko)

merci par avance pour votre aide

Il faut

  • passer le paramètre Id_Project dans un Array
  • et restreindre la recherche à la seule colonne .ListColumns("Id_Project").Range
xxx=Application.Count(Application.Match(ici_mon_tableau, Array(ici_mes_valeurs), 0))
Private Sub CommandButton1_Click()

'on récupère le ou les comptes du projet
Id_Project = "34"

With [T_Accounts].ListObject
    Set d = .ListColumns("Id_Project").Range.Find(what:=Id_Project, LookIn:=xlValues, LookAt:=xlWhole)
    'fin = WorksheetFunction.CountIf(.DataBodyRange, Id_Project) - 1

    fin = Application.Count(Application.Match(.ListColumns("Id_Project").Range, Array(Id_Project)), 0)

    If Not d Is Nothing Then
        Set Maplage = .Range.Rows(d.Row).Resize(fin)
        Maplage.Select
    End If
End With

End Sub

merci a vous Steelson, cela fonctionne bien dans le fichier transmis

néanmoins cela semble altéré dans mon fichier à moi

la seule différence est que le tableau et la macro ne sont pas dans la même feuille

en effet dans mon cas la macro est dans un module

neanmoins le code est similaire

'on récupère le ou les comptes du projet
With [T_Accounts].ListObject
    Set d = .ListColumns("Id_Project").Range.Find(what:=Id_Project, LookIn:=xlValues, LookAt:=xlWhole)
    'fin = WorksheetFunction.CountIf(.DataBodyRange, Id_Project) - 1
    fin = Application.Count(Application.Match(.ListColumns("Id_Project").Range, Array(Id_Project)), 0)

    If Not d Is Nothing Then
        Set Maplage = .Range.Rows(d.row).Resize(fin)
If (fin = 1) Then
accounts = Maplage.cells(1, 3)
Else:
Dim t
t = Application.Transpose(Maplage.Columns(3).Value)
accounts = Join(t, ", ")
End If

End If
MsgBox (accounts)
End With

seulement voila ici si j'affiche accounts cela me rends les deux résultats souhaité + au moins 10 ou 15 autres derrière....

en effet fin dans mon fichier me renvoi 22 au lieu de 2

sachant que le tableau est en tout point similaire

ici cela fonctionne, mais j'ai eu en effet un fonctionnement erratique sur ta :acro.

en plus je ne sais plus ce que j'ai changé

selon que c'est string ou num on n'a pas la même valeur !!

je poursuis les investigations ... on va y arriver !

sinon au pire, il faut compter via dico

Effectivement cela fonctionne dans votre fichier tout comme dans mon fichier d'essai mais bien que la structure du tableau soit similaire copier coller en l'occurrence cela est altéré...

Incroyable, et pourtant j'ai d'autres fichiers où je n'ai jamais eu de soucis.

Comme pour le moment je n'arrive pas à voir de où cela vient, je te propose de passer à scripting.dictionnary pour compter les occurrences de chaque valeur.

Private Sub CommandButton1_Click()

Set dico = CreateObject("Scripting.Dictionary")

'on récupère le ou les comptes du projet
Id_project = (Range("F1").Value)

With [T_Accounts].ListObject
    tbl = .ListColumns("Id_Project").Range
    For a = LBound(tbl) To UBound(tbl)
        dico(tbl(a, 1)) = dico(tbl(a, 1)) + 1
    Next a
    Set d = .ListColumns("Id_Project").Range.Find(what:=Id_project, LookIn:=xlValues, LookAt:=xlWhole)
    nbr = dico(Id_project)
    If Not d Is Nothing Then
        Set MaPlage = .Range.Rows(d.Row).Resize(nbr)
        If (nbr = 1) Then
            accounts = MaPlage.Cells(1, 3)
        Else:
            t = Application.Transpose(MaPlage.Columns(3))
            accounts = Join(t, ", ")
        End If
    End If
    Set d = Nothing
End With

MsgBox accounts

End Sub

Merci à vous Steelson

en effet avec dico cela fonctionne correctement dans mon fichier!

mais je ne comprends pas vraiment d'où le soucis peut venir ceci étant

merci pour votre aide

Je vais continuer à investiguer, si je trouve je poste la réponse ...

Ne me demande pas d'expliquer !!!

Sub test()

crit = Range("I1").CurrentRegion.Value

With Sheets(1).ListObjects(1)
    tbl = .ListColumns("Id_Project").Range

    For n = LBound(crit) To UBound(crit)
        Set d = .ListColumns("Id_Project").Range.Find(what:=crit(n, 1), LookIn:=xlValues, LookAt:=xlWhole)
        If Not d Is Nothing Then
            nbr = Application.Count(Application.Match(tbl, Array(crit(n, 1)), 0))
            Set Maplage = d.Resize(nbr, 3)
            Maplage.Select

            If (nbr = 1) Then
                accounts = Maplage.Cells(1, 3)
            Else:
                Dim t
                t = Application.Transpose(Maplage.Columns(3).Value)
                accounts = Join(t, ", ")
            End If
            MsgBox crit(n, 1) & " : " & nbr & " fois : " & accounts

        Else
            MsgBox crit(n, 1) & " : pas trouvé !"
        End If

    Next

End With

End Sub

J'ai mis une série de caleurs de test en jaune

3test.xlsm (19.45 Ko)

grand merci à vous pour cette aide remarquable.

je vais désormais tester et éplucher le code pour le maîtriser

ceci étant dit quel code est le plus propre et optimal disons entre la méthode dico et celle ci?

merci pour tout

bonne soirée

ceci étant dit quel code est le plus propre et optimal disons entre la méthode dico et celle ci?

Si tu as un ou deux appels à Application.Count(Application.Match____)) dans une même macro, cette fonction a l'avantage de s'écrire en une seule ligne. C'est plus élégant.

Au delà, dico est clairement plus intéressant et plus rapide car cela permet de faire le calcul une fois pour toutes.

ok merci!

merci a vous Steelson, cela fonctionne bien dans le fichier transmis

néanmoins cela semble altéré dans mon fichier à moi

la seule différence est que le tableau et la macro ne sont pas dans la même feuille

en effet dans mon cas la macro est dans un module

neanmoins le code est similaire

'on récupère le ou les comptes du projet
With [T_Accounts].ListObject
    Set d = .ListColumns("Id_Project").Range.Find(what:=Id_Project, LookIn:=xlValues, LookAt:=xlWhole)
    'fin = WorksheetFunction.CountIf(.DataBodyRange, Id_Project) - 1
    fin = Application.Count(Application.Match(.ListColumns("Id_Project").Range, Array(Id_Project)), 0)

    If Not d Is Nothing Then
        Set Maplage = .Range.Rows(d.row).Resize(fin)
If (fin = 1) Then
accounts = Maplage.cells(1, 3)
Else:
Dim t
t = Application.Transpose(Maplage.Columns(3).Value)
accounts = Join(t, ", ")
End If

End If
MsgBox (accounts)
End With

seulement voila ici si j'affiche accounts cela me rends les deux résultats souhaité + au moins 10 ou 15 autres derrière....

L'erreur venait d'une parenthèse mal placée qui excluait le paramètre 0 dans la formule match... !!

    fin = Application.Count(Application.Match(.ListColumns("Id_Project").Range, Array(Id_Project), 0))

Ach, les paramètres optionnels d'excel, piège dans lequel on tombe !

oh mince alors !

si simple et pourtant pas jusqu'ici!

merci pour la remarque

soutien sans faille pour mon post

grand merci à vous!

Rechercher des sujets similaires à "countif vba"