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
Jacquouille
Bonjour
Je suis surpris que sommeprod prenne une minute....
Bien vérifier que les cellules de la colonne J soient bien formatées en
date.
D'abord, sommeprod ne peut s'utiliser sur une colonne complète. Il lui faut
au moins une ligne de libre (celle des titres de colonnes suffit).
Si j'ai bien compris, il suffit de calculer le nombre de fois que le mois de
décembre se trouve dans la colonne A
=Sommeprod((mois(J2:J100))*1) --> à placer dans une cellule de la même
feuille (ex: en A1) et valider par un simple "Enter". Sommeprod n'est pas
une matricielle.
-----------------------------------
ou bien, toujours les dates en col J
compteur=0
for each c in range("j1:j100")
if month(c) then
compteur=compteur+1
end if
next
msgbox compteur

Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"merguez07" a écrit dans le message de groupe de discussion :
4d564d34$0$8434$

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
Avatar
merguez07
Merci "Jacquouille" mais en fait ce que je veux c'est utiliser la
fonction sommeprod sous vba

ce qui prend 1 minute de calcul ce n'est pas la fonction sommeprod mais
bien les boucles vba comme par exemple celle que tu cites en exemple.
Je ne veux pas mettre sommeprod comme formule de cellule car cela fait
une formule à rallonge incompréhensible. L'exemple que j'ai donné pour
le calcul du nombre de mois de décembre est un juste un exemple simple
de ce que j'essaye de faire sous vba mais en fait je souhaite faire des
somme matricielle bien plus complexe.




Le 12.02.2011 11:50, Jacquouille a écrit :
Bonjour
Je suis surpris que sommeprod prenne une minute....
Bien vérifier que les cellules de la colonne J soient bien formatées en
date.
D'abord, sommeprod ne peut s'utiliser sur une colonne complète. Il lui
faut au moins une ligne de libre (celle des titres de colonnes suffit).
Si j'ai bien compris, il suffit de calculer le nombre de fois que le
mois de décembre se trouve dans la colonne A
=Sommeprod((mois(J2:J100))*1) --> à placer dans une cellule de la
même feuille (ex: en A1) et valider par un simple "Enter". Sommeprod
n'est pas une matricielle.
-----------------------------------
ou bien, toujours les dates en col J
compteur=0
for each c in range("j1:j100")
if month(c) then
compteur=compteur+1
end if
next
msgbox compteur

Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"merguez07" a écrit dans le message de groupe de discussion :
4d564d34$0$8434$

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
Avatar
michdenis
Bonjour,

Essaie comme ceci :

Tu dois adapter le nom de la feuille et de la plage de cellules
si nécessaire. La plage doit contenir soit des dates, soit être
vide.

'----------------------------------------------------
Sub test()
Dim Rg As Range
Dim LeMois As Integer, Lannée As Integer

LeMois = 2 ' Le mois et l'année que tu désires
Lannée = 2011

With Worksheets("Feuil1")
Set Rg = .Range("J1:J" & .Range("J65536").End(xlUp).Row)
End With

With Rg
'Nombre de données tenant compte que tu mois
x = Evaluate("SumProduct((month(" & .Parent.Name & _
"!" & .Address & ")=" & LeMois & ")*1)")

'Nombre de données tenant compte du mois et de l'année
F = Evaluate("SumProduct((month(" & .Parent.Name & "!" & _
.Address & ")=" & LeMois & ")*(year(" & _
.Parent.Name & "!" & .Address & ")=" & _
Lannée & "))")
End With
End Sub
'----------------------------------------------------


MichD
--------------------------------------------
Avatar
michdenis
Bonjour,

Sommeprod n'est pas une matricielle.

Tu veux dire, sommeprod ne requiert pas une validation matricielle Maj + Ctrl + Enter
mais C'EST une formule matricielle. Un certain AV ne serait pas fier de son secrétaire !
;-))


MichD
--------------------------------------------
"Jacquouille" a écrit dans le message de groupe de discussion : 4d5665f8$0$14260$

Bonjour
Je suis surpris que sommeprod prenne une minute....
Bien vérifier que les cellules de la colonne J soient bien formatées en
date.
D'abord, sommeprod ne peut s'utiliser sur une colonne complète. Il lui faut
au moins une ligne de libre (celle des titres de colonnes suffit).
Si j'ai bien compris, il suffit de calculer le nombre de fois que le mois de
décembre se trouve dans la colonne A
=Sommeprod((mois(J2:J100))*1) --> à placer dans une cellule de la même
feuille (ex: en A1) et valider par un simple "Enter". Sommeprod n'est pas
une matricielle.
-----------------------------------
ou bien, toujours les dates en col J
compteur=0
for each c in range("j1:j100")
if month(c) then
compteur=compteur+1
end if
next
msgbox compteur

Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"merguez07" a écrit dans le message de groupe de discussion :
4d564d34$0$8434$

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
Avatar
Jacquouille
Salut Denis
En fait, SP ce n'est pas du...mais c'est comme...;
De là à dire que le Président AV ne serait pas fier de son secrétaire
.....alors que celui-ci cherche à faire comprendre SP à tout le monde ?
Donc SP travaille comme une matricielle, mais se valide du bout d'un doigt.



Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"michdenis" a écrit dans le message de groupe de discussion :
ij5raq$36a$

Bonjour,

Sommeprod n'est pas une matricielle.

Tu veux dire, sommeprod ne requiert pas une validation matricielle Maj +
Ctrl + Enter
mais C'EST une formule matricielle. Un certain AV ne serait pas fier de son
secrétaire !
;-))


MichD
--------------------------------------------
"Jacquouille" a écrit dans le message de groupe de discussion :
4d5665f8$0$14260$

Bonjour
Je suis surpris que sommeprod prenne une minute....
Bien vérifier que les cellules de la colonne J soient bien formatées en
date.
D'abord, sommeprod ne peut s'utiliser sur une colonne complète. Il lui faut
au moins une ligne de libre (celle des titres de colonnes suffit).
Si j'ai bien compris, il suffit de calculer le nombre de fois que le mois de
décembre se trouve dans la colonne A
=Sommeprod((mois(J2:J100))*1) --> à placer dans une cellule de la même
feuille (ex: en A1) et valider par un simple "Enter". Sommeprod n'est pas
une matricielle.
-----------------------------------
ou bien, toujours les dates en col J
compteur=0
for each c in range("j1:j100")
if month(c) then
compteur=compteur+1
end if
next
msgbox compteur

Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"merguez07" a écrit dans le message de groupe de discussion :
4d564d34$0$8434$

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
Avatar
michdenis
Peut-être que tu préfères cette syntaxe :

'-------------------------------------------------
Sub test()
Dim Adr As String
Dim LeMois As Integer, Lannée As Integer

LeMois = 2 ' Le mois et l'année que tu désires
Lannée = 2011

With Worksheets("Feuil1")
Adr = .Name & "!" & .Range("J1:J" & .Range("J65536").End(xlUp).Row).Address
End With

'Nombre de données tenant compte que tu mois
x = Evaluate("SumProduct((month(" & Adr & ")=" & LeMois & ")*1)")

'Nombre de données tenant compte du mois et de l'année
F = Evaluate("SumProduct((month(" & Adr & ")=" & LeMois & _
")*(year(" & Adr & ")=" & Lannée & "))")

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


MichD
--------------------------------------------
Avatar
michdenis
|En fait, SP ce n'est pas du...mais c'est comme...;

***Ne crée pas un doute dans l'esprit des gens !
La seule différence entre sommeprod() et d'autres formules matricielles
c'est la validation de la formule qui ne requiert pas la combinaison des
touches Maj + Ctrl + Enter. Tout le reste du processus est le même.

;-)
Avatar
merguez07
ça répond exactement à ma demande. 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?) mais en tout cas ça marche bien et
c'est rapide.

Merci


Le 12.02.2011 13:38, michdenis a écrit :
Peut-être que tu préfères cette syntaxe :

'-------------------------------------------------
Sub test()
Dim Adr As String
Dim LeMois As Integer, Lannée As Integer

LeMois = 2 ' Le mois et l'année que tu désires
Lannée = 2011

With Worksheets("Feuil1")
Adr = .Name& "!"& .Range("J1:J"& .Range("J65536").End(xlUp).Row).Address
End With

'Nombre de données tenant compte que tu mois
x = Evaluate("SumProduct((month("& Adr& ")="& LeMois& ")*1)")

'Nombre de données tenant compte du mois et de l'année
F = Evaluate("SumProduct((month("& Adr& ")="& LeMois& _
")*(year("& Adr& ")="& Lannée& "))")

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


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

Avatar
Jacquouille
C'était pertinemment ce que je disais en dernière ligne.
Quand on cite, on cite tout, pour pas induire les gens en erreur.-)

Donc SP travaille comme une matricielle, mais se valide du bout d'un
doigt.






Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"michdenis" a écrit dans le message de groupe de discussion :
ij5v9s$ck4$

|En fait, SP ce n'est pas du...mais c'est comme...;

***Ne crée pas un doute dans l'esprit des gens !
La seule différence entre sommeprod() et d'autres formules
matricielles
c'est la validation de la formule qui ne requiert pas la combinaison
des
touches Maj + Ctrl + Enter. Tout le reste du processus est le même.

;-)
Avatar
michdenis
| 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
--------------------------------------------
1 2 3