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
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
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
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
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
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
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
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
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
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
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
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
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
End Sub '-----------------------------------------
MichD
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
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
End Sub '-----------------------------------------
MichD
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
End Sub '-----------------------------------------
MichD
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
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
| 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à!
| 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
| 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