Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

sommeprod sous vba, je cale

21 réponses
Avatar
merguez07
Bonjour à tous,
voilà mon problème est assez simple
J'ai une fichier excel sous Excel 2000 dans lequel j'ai des tableau avec
un certain nombre de calcul matriciel utilisant la formule sommeprod.

Pour donner un peu plus de visibilité dans les formules (il s'agit de
formule sommeprod à rallonge) j'ai décidé de créer des formules
personnalisés.


Jusque la pas de problème, plutôt que d'utiliser des formules sommeprod
j'utilise donc sous vba des boucles qui balaye chaque ligne et me donne
le résultat escompté. le hic c'est le temps de calcul qui peut dépasser
une minute alors qu'avec les sommeprod le résultat était dans la seconde.


La solution serait donc d'utiliser les sommeprod dans le vba et là je
bloque


ci dessous je dois calculer le nombre de date en décembre. La date se
trouve dans la 10eme colonne de la feuille "test"

Total =
Application.WorksheetFunction.SumProduct((Month(Worksheets("test").Columns(10))=
12))
là le programme sort de la formule sans calcul et sans message d'erreur

J'ai aussi essayé


Total = [SumProduct((Month(Worksheets("test").Columns(10)) = 12))]
et j'ai un message d'erreur 2015

Help me please

10 réponses

1 2 3
Avatar
michdenis
Désolé, je lis les messages dans une fenêtre restreinte et il
arrive que je ne vois (regarde) pas la fin des messages.

Mes excuses Jacquouille.


MichD
--------------------------------------------
Avatar
merguez07
Que dire si ce n'est : Génial


Un grand merci



Le 12.02.2011 15:15, michdenis a écrit :
| Je ne sais pas s'il y a un moyen d'éviter la syntaxe complexe
| pour générer une chaine de caractère (est on obligé de
| passer par evaluate?)

Voici d'autres variantes :

Si tu veux employer des variables et avoir le loisir de leur attribuer
des valeurs différentes. "Evaluate" est requis.

Si ta plage de date a déjà un "NOM" (plage nommée, insertion / nom / définir)
et sans possibilité de variables, il y a ceci :

x = [SumProduct((month(toto)=2)*1)]


Sub test()

With Sheet1 ' Worksheets("Feuil1")
'Attribue le nom "toto" à la plage
.Range("J1:J"& .Range("J65536").End(xlUp).Row).Name = "toto"
End With

'La formule devient : Mois de février peu importe l'année.
x = [SumProduct((month(toto)=2)*1)]

'Ou celle-ci : Mois de février et l'année 2011
x = [SumProduct((month(toto)=2)*(year(toto) 11))]

'Quoi que tu pourrais toujours utilisé des "NOMS" comme des variables

Dim M As Integer, An As Integer
M = 2
An = 2011

'Ces 2 noms sont invisibles via l'interface de calcul
ThisWorkbook.Names.Add "Lemois", M, False
ThisWorkbook.Names.Add "Lannée", An, False

'Et les formules deviendraient :

'La formule devient : Mois de février peu importe l'année.
x = [SumProduct((month(toto)=LeMois)*1)]

'Ou celle-ci : Mois de février et l'année 2011
x = [SumProduct((month(toto)=LeMois)*(year(toto)=Lannée))]

End Sub
'---------------------------------------------


MichD
--------------------------------------------

Avatar
merguez07
par contre, l'utilisation des codes
ThisWorkbook.Names.Add "Lemois", M, False
ThisWorkbook.Names.Add "Lannée", An, False

bloque le calcul dans presque toutes les autres cellules.
Je ne sais pas pourquoi

cordialement
Avatar
merguez07
bonjour à tous

je suis toujours sur mon pb de sommeprod en vba et je bloque à nouveau

je veux compter le nombre de dates contenues dans la plage DateAcompter
qui sont inférieur à la date contenue dans la variable LaDate

NbdeDateInférieur= Evaluate("SumProduct((" & DateCreationFE & " < " &
LaDate & ") * 1)")


Rien à faire j'ai toujours une erreur 2015

J'ai fait le test avec LaDate= 01.01.2010
DateCreation est une plage qui contient toujours des dates au format date

ça fait 3 heures que je bloque la dessus, au secours !


Le 13.02.2011 08:35, merguez07 a écrit :
par contre, l'utilisation des codes
ThisWorkbook.Names.Add "Lemois", M, False
ThisWorkbook.Names.Add "Lannée", An, False

bloque le calcul dans presque toutes les autres cellules.
Je ne sais pas pourquoi

cordialement
Avatar
DanielCo
Bonjour,
En supposant que DateCreationFE et LaDate soient des noms définis et
non des variables.
NbdeDateInférieur = Evaluate("SumProduct((DateCreationFE<LaDate)*1)")
Cordialement.
Daniel


bonjour à tous

je suis toujours sur mon pb de sommeprod en vba et je bloque à nouveau

je veux compter le nombre de dates contenues dans la plage DateAcompter qui
sont inférieur à la date contenue dans la variable LaDate

NbdeDateInférieur= Evaluate("SumProduct((" & DateCreationFE & " < " & LaDate
& ") * 1)")


Rien à faire j'ai toujours une erreur 2015

J'ai fait le test avec LaDate= 01.01.2010
DateCreation est une plage qui contient toujours des dates au format date

ça fait 3 heures que je bloque la dessus, au secours !


Le 13.02.2011 08:35, merguez07 a écrit :
par contre, l'utilisation des codes
ThisWorkbook.Names.Add "Lemois", M, False
ThisWorkbook.Names.Add "Lannée", An, False

bloque le calcul dans presque toutes les autres cellules.
Je ne sais pas pourquoi

cordialement
Avatar
merguez07
Merci Daniel, Hélas j'ai un pb avec les noms définis c'est pourquoi je
préfère me rabattre sur les variables.

Lorsque j'utilise les noms définis je ne sais pas pourquoi cela me
bloque le calcul des autres cellules alors qu'avec les variables je n'ai
aucun pb. Par contre je ne sais pas faire la comparaison de date avec
les variables. Il y a peut être une formatage de date à faire avant (du
style inverser mois et jour pour un mise en forme américaine). Bref Je
nage en profondeur


Le 13.02.2011 12:07, DanielCo a écrit :
Bonjour,
En supposant que DateCreationFE et LaDate soient des noms définis et non
des variables.
NbdeDateInférieur = Evaluate("SumProduct((DateCreationFE<LaDate)*1)")
Cordialement.
Daniel


bonjour à tous

je suis toujours sur mon pb de sommeprod en vba et je bloque à nouveau

je veux compter le nombre de dates contenues dans la plage
DateAcompter qui sont inférieur à la date contenue dans la variable
LaDate

NbdeDateInférieur= Evaluate("SumProduct((" & DateCreationFE & " < " &
LaDate & ") * 1)")


Rien à faire j'ai toujours une erreur 2015

J'ai fait le test avec LaDate= 01.01.2010
DateCreation est une plage qui contient toujours des dates au format date

ça fait 3 heures que je bloque la dessus, au secours !


Le 13.02.2011 08:35, merguez07 a écrit :
par contre, l'utilisation des codes
ThisWorkbook.Names.Add "Lemois", M, False
ThisWorkbook.Names.Add "Lannée", An, False

bloque le calcul dans presque toutes les autres cellules.
Je ne sais pas pourquoi

cordialement






Avatar
michdenis
A ) Il n'y a aucune raison que les "NOMS" ne fonctionnent pas...

B ) Si tu préfères des variables : comme ceci :

Tu adaptes le nom de la feuille et de la plage de cellules, si tu as
des cellules vides dans la plage de cellules, elles vont jouer les
trouble-fêtes et tu vas devoir modifier la formule pour pouvoir
en tenir compte.

'-----------------------------------------
Sub test()

Dim LaDate As Date
Dim DatecreationFE As String

With Worksheets("Feuil1")
DatecreationFE = .Name & "!" & .Range("A1:A" & .Range("A65536").End(xlUp).Row).Address
End With

LaDate = CDate("01/03/11") 'Ou Date()

NbdeDateInférieur = Evaluate("SumProduct((" & DatecreationFE & "<" & LaDate * 1 & ")*1)")

End Sub
'-----------------------------------------

MichD
Avatar
merguez07
Salut MichD,

en fait les noms fonctionnent sur le cellule active mais bloque le
calcul sur les autres. je ne sais pas pourquoi , Toujours est il que
lorsque je retire le code de déclaration des noms le calcul des autres
cellules se fait.


Sinon ta demo ci dessous fonctionne à merveille. Je n'ai pas formaté la
variable LaDate mais j'ai rajouté comme tu la fais la multiplication par
un de la variable LaDate. Je ne sais pas pourquoi il faut faire ça mais
si on le fait pas, force est de constater que ça marche pas.


Un grand merci








Le 13.02.2011 15:02, michdenis a écrit :
A ) Il n'y a aucune raison que les "NOMS" ne fonctionnent pas...

B ) Si tu préfères des variables : comme ceci :

Tu adaptes le nom de la feuille et de la plage de cellules, si tu as
des cellules vides dans la plage de cellules, elles vont jouer les
trouble-fêtes et tu vas devoir modifier la formule pour pouvoir
en tenir compte.

'-----------------------------------------
Sub test()

Dim LaDate As Date
Dim DatecreationFE As String

With Worksheets("Feuil1")
DatecreationFE = .Name& "!"& .Range("A1:A"& .Range("A65536").End(xlUp).Row).Address
End With

LaDate = CDate("01/03/11") 'Ou Date()

NbdeDateInférieur = Evaluate("SumProduct(("& DatecreationFE& "<"& LaDate * 1& ")*1)")

End Sub
'-----------------------------------------

MichD
Avatar
michdenis
| en fait les noms fonctionnent sur le cellule active mais
| bloque le calcul sur les autres. je ne sais pas pourquoi

Je ne comprends pas ce que cela sous-tend. As-tu un petit exemple ?


MichD
--------------------------------------------
Avatar
michdenis
| j'ai rajouté comme tu la fais la multiplication par un de
| la variable LaDate. Je ne sais pas pourquoi il faut faire ça
| mais si on le fait pas, force est de constater que ça marche pas.

Suppose que tu veuilles écrire une formule pour dénombre le
nombre de cellules qui affichent la date : 17/2/11 dans la plage A1:A6

=Sommeprod((A1:A6/2/11)*1)
Si tu écris la formule comme ceci, Excel va te retourner zéro.

Pourquoi : Dans la barre des formules, sélectionnes 17/2/11 de la formule
et appuie sur la touche F9, il affichera l'évaluation qu'il fait de la chaîne de
caractères = 0,772727272727273

En fait, Excel n'a pas compris que c'était une date et il a divisé 17 par 2 et
le résultat par 11 d'où sa réponse : 0,772727272727273. En conséquence,
c'est normal qu'il retourne 0 comme solution à la formule !

Si tu prends la même formule que tu aménages de cette façon :
=Sommeprod((A1:A6="17/2/11"*1)*1)
En ajoutant des guillemets autour de la date, si tu arrêtais là, Excel interpréterait
cela comme était une chaîne de caractères sans plus. Si tu ajoutes une opération
mathématique sur cette chaîne de caractère, tu forces Excel à interpréter cette
information à l'interne et il "s'aperçoit" que c'est une date qu'il s'empresse de
retourne dans sa formule numérique. À la place de ="17/2/11"*1, j'aurais pu
choisir ="17/2/11"+0 , ="17/2/11"-0 pourvu que cela n'altère pas la valeur
numérique que représente la date aux fins de comparaison de la formule.

Un autre petit exemple de la dernière information.
Formate d'abord une cellule vide au format texte
Tape une date au hasard : 18/02/11
Dans une autre cellule, entre la formule suivante :
­resse de la cellule où tu viens de saisir la date * 1
OU
­resse de la cellule où tu viens de saisir la date + 0
et observes le résultat. ATTENTION : la cellule affichant
le résultat sera aussi au format Texte bien qu'il affiche
la valeur numérique de la date.

Ça, c'est le comportement normal d'Excel

Cette section de la formule : A1:A6 bien que celles-ci affichent des dates,
pour Excel cela représente une valeur numérique. C'est ce pourquoi, il
peut effectivement faire la comparaison entre les valeurs contenues
dans A1:A6 ET "17/2/11"*1

En vba, ce n'est pas vraiment différent, La propriété "Evaluate" de l'objet
application fait un travail similaire à la touche F9 lorsque qu'une chaîne
est sélectionnée dans la barre des formules.

Pour t'en convaincre, essaie ceci :

Sub Test()
Dim D As Date
D = Date
x = Evaluate("" & D & "")
x = 0,590909090909091
soit 13 divisé par 2 divisé par 11
End sub

Voilà!
1 2 3