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
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$426a...@news.free.fr...
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)=12)*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)=12 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$426a...@news.free.fr...
>
> 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é
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
--------------------------------------------
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$ba62...@news.skynet.be...
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)=12)*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)=12 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$426a...@news.free.fr...
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é
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$1...@speranza.aioe.org...
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$ba62...@news.skynet.be...
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)=12)*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)=12 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$426a...@news.free.fr...
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�
'-------------------------------------------------
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
--------------------------------------------
***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.
;-)
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& "))")
>>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$1...@speranza.aioe.org...
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)=2011))]
'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
--------------------------------------------
Mes excuses Jacquouille.
MichD
--------------------------------------------
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)=2011))]
>
> '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))]
bloque le calcul dans presque toutes les autres cellules.
Je ne sais pas pourquoi
cordialement
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
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
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
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
Je ne comprends pas ce que cela sous-tend. As-tu un petit exemple ?
MichD
--------------------------------------------
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=17/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 :
=Adresse de la cellule où tu viens de saisir la date * 1
OU
=Adresse 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à!
Merci
> x = Evaluate(""& D& "")