Erreur 13 et Sumproduct
Bonjour à tous,
Je suis loin de maîtriser VBA ; après plusieurs essais de modifications de la syntaxe et plusieurs de recherche sur les forums, je fais appel, avec déférence, à votre aide.
Voici la partie du code que j'ai développé et qui me pose problème :
Sub Traitement_donnees ()
Dim DernLigne As Long, FLsource As Worksheet, Cell As Range, plage As Range, NoLigne As Long, plagemoteur As Range, plageATP As Range
Set FLsource = Sheets("Prov")
DernLigne = Range("A" & Rows.Count).End(xlUp).Row
NoLigne = 5
Set plage = FLsource.Range("A" & NoLigne & ":A" & DernLigne)
Set plagemoteur = FLsource.Range("E" & NoLigne & ":E" & DernLigne)
Set plageATP = FLsource.Range("I" & NoLigne & ":I" & DernLigne)
Range("M" & NoLigne).Value = Application.WorksheetFunction.SumProduct((plage = Range("A" & NoLigne)) * (plagemoteur = ATP) * plageATP)
End Sub
Pour info, je l'ai extraite sur un autre tableur EXCEL pour la tester, le problème persiste.
Je vous remercie par avance pour les lumières que vous m'apporterez.
Bonjour,
A première vue, sans le fichier, je vois ceci :
ATP est une variable?
Si oui, je ne la vois pas dans les déclarations.
Si non, il s'agit d'une chaîne de caractères, donc à entourer de guillemets : "ATP".
EDIT : à seconde vue... Tu utilises, dans une formule Excel, des plages définies comme des Range. Cela ne peux pas fonctionner.
Donc soit tu utilises des objets Range et à ce moment, tu boucles sur eux pour calculer ta formule, soit tu utilises la formule comme tu l'écrirais sous Excel, soit tu utilises la Méthode Evaluate.
Merci d'avoir répondu rapidement.
Oui ATP est une chaîne de caractères ; oubli de différents essais : j'ai fait la correction.
J'avais également tenté :
Range("M" & NoLigne).Value = Application.WorksheetFunction.SumProduct((plage = Range(Cells(NoLigne, 1))) * (plagemoteur = "ATP") * plageATP)
Cependant, il m'a été renvoyé une erreur d'exécution 1004.
En fait, les valeurs travaillées résultent d'un copier/coller de valeurs depuis une autre base de données, après suppression des filtres. Mes connaissances en VBA ne me permettent pas dire si cela à une répercussion ou non sur la macro.
Est-ce le cas ? Si oui, que devrais-je envisager ?
EDIT : plage contient des dates, plagemoteur et plageATP contiennent des nombres.
Je ne souhaite pas afficher le fichier publiquement, s'il y a une autre solution...
Tu dis : plagemoteur contient des nombres.
Donc plagemoteur = "ATP" => te renvoie une erreur.
Normal, non?
Je vais voir pour te bricoler un exemple, ce sera plus parlant.
Si j'ai le temps ici en début d'après midi.
Bon en fin de compte, pas besoin d'exemple, ça a été super rapide...
La formule que tu souhaites obtenir est de la forme :
=SUMPRODUCT((Ayy:Axx=Ayy)*(Eyy:Exx=ATP)*Iyy:Ixx)
ou yy et xx sont des variables.
Il suffit donc de remplacer les xx et les yy par des variables dans une formule.
Tu sais comment intégrer une variable dans une formule en VBA?
En fait, tu considères ta formule comme un String, une chaîne de caractère. Exemple :
"=SUMPRODUCT((A2:A20=A2)*(E2:E20=L2)*I2:I20)"
A partir de là, tu "sort" de ta formule les valeurs devant être remplacées par des variables en les "sortant des guillements :
"=SUMPRODUCT((A" & NoLigne & ":A20=A2)*(E2:E20=L2)*I2:I20)"
etc etc pour toutes les valeurs.
Tu obtiens donc une formule, entrecoupée de variables, comme ceci :
"=SUMPRODUCT((A" & NoLigne & ":A" & DernLigne & "=A" & NoLigne & ")*(E" & NoLigne & ":E" & DernLigne & "=ATP)*I" & NoLigne & ":I" & DernLigne & ")"
Ne reste qu'à l'évaluer :
Range("M" & NoLigne).Value = Application.Evaluate("=SUMPRODUCT((A" & NoLigne & ":A" & DernLigne & "=A" & NoLigne & ")*(E" & NoLigne & ":E" & DernLigne & "=5)*I" & NoLigne & ":I" & DernLigne & ")")Ne te reste, à gérer, que le problème de ATP souligné dans mon post précédent.
Excuses... ATP est bien une chaîne de caractères (chiffres+1 lettre) . J'ai mis ATP entre 2 fois des guillemets. La macro fonctionne à merveille.
Merci à toi et excellent week-end !