SommeProd en VBA [Résolu]

Signaler
-
 Nyposh -
Bonjour à tous,

Je souhaite traduire une sommeprod en VBA, et je suis coincé. Pourriez-vous m'apporter votre aide ?

Voici la formule sur la feuille de calcul :
=SOMMEPROD((Feuil2!F2:F2000=Feuil1!C6)*(Feuil2!E2:E2000=Feuil1!E4))

Voici ma tentative VBA correspondante :
Feuil1.Cells(6, 5).Value = WorksheetFunction.SOMMEPROD((Feuil2.Cells(i, 7) = Feuil1.Cells(8, 3) * (Feuil2.Cells(i, 5) = Feuil1.Cells(4, 5))))


Pour i de 2 à 2000.

Merci pour votre aide et bonne journée !

2 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Bonjour,
Déjà :
Une ouverture de ton aide VBA (rubrique WorkSheetFunction) puis l'examen des membres (en bas de page) de cet objet te fera vite découvrir que SOMMEPROD n'est pas l'un de ses membres. Il ne te sera pas difficile d'y trouver le membre correspondant à SOMMEPROD.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
SUMPRODUCT n'évalue rien (pas plus que SOMMEPROD).
Tes signes "=" ne risquent donc pas d'y être compris.
Je ne vois par ailleurs pas ce que vient faire là ton EVALUATE. ni pourquoi tu as abandonné worksheetfunction.
Je te rappelle enfin que tant sommeprod que worksheetfunction.sumproduct ne peuvent traiter que des plages de dimensions égales.
Merci ucfoutu,

Bien reçu pour les plages de dimension égale, a priori cette condition est remplie.

Peux-tu m'éclairer sur la manière dont je peux faire fonctionner mon Sumproduct en utilisant worksheetfunction du coup ?


Voici le code en question :

Sub Analyse_données()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim i As Integer
Set ws1 = Worksheets("Feuil1")
Set ws2 = Worksheets("Feuil2")

If Not IsEmpty(Feuil1.Cells(4, 5)) & (Feuil1.Cells(6, 3)) = True Then
For i = 2 To 2000
Feuil1.Cells(6, 5).Value = Evaluate("=SumProduct((Feuil2.Cells(i, 7) = Feuil1.Cells(8, 3)) * (Feuil2.Cells(i, 5) = Feuil1.Cells(4, 5)))")
Next
End If
End Sub


Et voici ce que je veux faire : Je souhaite que dans la cellule (6,5) de la Feuil1 s'affiche le nombre de cellules contenant la réponse "Oui" (ou tout autre texte) à une question à la condition que le service de la personne qui y répond soit celui indiqué en tête de colonne (cellule 4,5)


Merci beaucoup de ta disponibilité !
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
237
Je ne comprends pas (ne cerne pas) bien ta question, mais il semble à priori que worksheetfunction.sumif est ce qu'il te faut alors.
Plutôt Worksheetfunction.Countif, d'ailleurs.
Merci pour ton aide, j'ai pu le faire fonctionner !

Bonne journée et à la prochaine
Messages postés
32940
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 juin 2021
351
Bonjour,

Le plus simple est d'utiliser Application.Evaluate()

Exemple:
' Calcul de la Moyenne des cellules M1:M10 si les cellules G1:G10 = "ok"

Sub MoyenneSiViaSommeprod()
Plage1 = "G1:G10"
Plage2 = "M1:M10"
' Pour un critère texte, utiliser Triple Guillemets
critere = """ok"""
SommeProd = "SUMPRODUCT((" & Plage1 & " = " & critere & ")*(" & Plage2 & "))/SUMPRODUCT((" & Plage1 & " = " & critere & ")*(1))"
Mosi = Application.Evaluate(SommeProd)
Debug.Print Mosi
End Sub


Bonjour Jordane 45, merci pour ta réponse !

J'aurais besoin de plusieurs éclaircissements :

1 - Je ne crois pas pouvoir calculer une moyenne étant donné qu'il me faut recenser le nombre de cellules contenant une valeur textuelle en fonction de 2 critères. Est-ce bien le cas ?

2 - Mon critère étant variable, dois-je tout de même utiliser les triples guillemets si je fais référence à une cellule plutôt qu'à du texte ?

Merci pour ton éclairage.
Messages postés
32940
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 juin 2021
351
Bonjour

1 - Je ne t'ai donné qu'un exemple d'utilisation... pas le code correspondant à TON besoin.

2 - de mémoire..Dès que le critère est du text ( ou contient du text) il faut l'encapsuler dans des triples guillemets pour qu'il soit accepté dans le someprod.
Mais bon.. rien de t'empèche de tester par toi même...
Merci Beaucoup pour ton aide et ta disponibilité, c'est bon ça fonctionne !