Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Somme.si.ens avec somme de 2 colonnes

1,171 views
Skip to first unread message

HD

unread,
Dec 5, 2013, 11:42:59 AM12/5/13
to
Bonjour,

Je voudrais utiliser la fonction SOMME.SI.ENS pour faire la somme des 2
colonnes o� mon crit�re s'applique... mais je n'ai pas r�ussi � additionner
les colonnes...

Dans cet exemple je voulais additionner les donn�es des colonnes F et G :
=SOMME.SI.ENS(Ecritures!F2:G2460;Ecritures!$C$2:$C$2460;"=7*")
mais il pourrait �tre int�ressant �galement d'additionner des colonnes qui
ne sont pas voisines.

Cordialement,

HD


DanielCo

unread,
Dec 5, 2013, 11:59:48 AM12/5/13
to
Bonjour,
Oui... mais non. Avec 2 fonctions NB.SI.ENS, oui.
Cordialement.
Daniel


> Bonjour,
>
> Je voudrais utiliser la fonction SOMME.SI.ENS pour faire la somme des 2
> colonnes oᅵ mon critᅵre s'applique... mais je n'ai pas rᅵussi ᅵ additionner
> les colonnes...
>
> Dans cet exemple je voulais additionner les donnᅵes des colonnes F et G :
> =SOMME.SI.ENS(Ecritures!F2:G2460;Ecritures!$C$2:$C$2460;"=7*")
> mais il pourrait ᅵtre intᅵressant ᅵgalement d'additionner des colonnes qui ne

HD

unread,
Dec 6, 2013, 6:33:01 AM12/6/13
to
> Oui... mais non. Avec 2 fonctions NB.SI.ENS, oui.
Avec deux fonctions SOMME.SI.ENS vous voulez dire ?

@+
HD


GL

unread,
Dec 6, 2013, 7:26:05 AM12/6/13
to
Le 05/12/2013 17:42, HD a �crit :
C'est un probl�me de syntaxe. Excel, cette merde, s�pare les r�gions
avec des points virgules, comme il s�pare les arguments des fonctions.

Donc il faut 2 SOMME.SI.ENS comme indiqu� par DanielCo.

HD

unread,
Dec 6, 2013, 7:43:50 AM12/6/13
to
> C'est un probl�me de syntaxe. Excel, cette merde, s�pare les r�gions
> avec des points virgules, comme il s�pare les arguments des fonctions.
> Donc il faut 2 SOMME.SI.ENS comme indiqu� par DanielCo.
Si le probl�me vient de la syntaxe, peut �tre y'aurait il moyen de passer
par une d�finition de Nom ?

@+
HD


DanielCo

unread,
Dec 6, 2013, 7:45:37 AM12/6/13
to
>> C'est un problᅵme de syntaxe. Excel, cette merde, sᅵpare les rᅵgions
>> avec des points virgules, comme il sᅵpare les arguments des fonctions.
>> Donc il faut 2 SOMME.SI.ENS comme indiquᅵ par DanielCo.
> Si le problᅵme vient de la syntaxe, peut ᅵtre y'aurait il moyen de passer par
> une dᅵfinition de Nom ?
>
> @+
> HD

Ca ne fonctionne pas.
Daniel

GL

unread,
Dec 6, 2013, 7:54:24 AM12/6/13
to
Le 06/12/2013 13:45, DanielCo a ᅵcrit :
Non. Et ᅵa fait bien long temps que je pense qu'il manque
ᅵ Excel une fonction PLAGE(...;...;...) qui rᅵunit des plages
en un seul tableau.

morefunc fournissait cela (sur x86)

Jacquouille

unread,
Dec 6, 2013, 9:30:51 AM12/6/13
to
Bonjour
Pour un utilisateur de 2003...
Somme.si.ens, c'est quoi, le "ens" ?
Merci

Jacquouille

" Le vin est au repas ce que le parfum est ᅵ la femme."
"GL" a ᅵcrit dans le message de groupe de discussion :
52a1c909$0$2046$426a...@news.free.fr...

DanielCo

unread,
Dec 6, 2013, 10:44:12 AM12/6/13
to
Bonjour,
C'est nouveau avec Excel 2007; extrait de l'aide :
Syntaxe
SOMME.SI.ENS(somme_plage; plage_critères1; critère1; [plage_critères2;
critère2]; ...)

La syntaxe de la fonction SOMME.SI.ENS contient les arguments suivants
:
##Somme_plage Requis. Une ou plusieurs cellules à additionner, y
compris les nombres ou les noms, les plages ou les références de
cellules qui contiennent des nombres. Les valeurs vides et le texte
sont ignorés.
##Plage_critères1 Requis. La première plage dans laquelle évaluer
les critères associés.
##Critère1 Requis. Représente le critère, exprimé sous forme de
nombre, d’expression, de référence de cellule ou de texte, qui
détermine les cellules dans lesquelles l’argument plage_critères1 sera
ajouté. Par exemple, l’argument critère peut être exprimé sous l’une
des formes suivantes : 32, ">32", B4, "pommes" ou "32".
##Plage_critères2; critère2; … Facultatif. Plages supplémentaires et
leurs critères associés. Jusqu’à 127 paires plage/critères sont
autorisées.
Daniel


> Bonjour
> Pour un utilisateur de 2003...
> Somme.si.ens, c'est quoi, le "ens" ?
> Merci
>
> Jacquouille
>
> " Le vin est au repas ce que le parfum est à la femme."
> "GL" a écrit dans le message de groupe de discussion :
> 52a1c909$0$2046$426a...@news.free.fr...
>
> Le 06/12/2013 13:45, DanielCo a écrit :
>>>> C'est un problème de syntaxe. Excel, cette merde, sépare les régions
>>>> avec des points virgules, comme il sépare les arguments des fonctions.
>>>> Donc il faut 2 SOMME.SI.ENS comme indiqué par DanielCo.
>>> Si le problème vient de la syntaxe, peut être y'aurait il moyen de
>>> passer par une définition de Nom ?
>>>
>>> @+
>>> HD
>>
>> Ca ne fonctionne pas.
>> Daniel
>
> Non. Et ça fait bien long temps que je pense qu'il manque
> à Excel une fonction PLAGE(...;...;...) qui réunit des plages

Jacquouille

unread,
Dec 6, 2013, 11:07:44 AM12/6/13
to
Merci Daniel
Donc, si je comprends bien, la question:
=SOMME.SI.ENS(Ecritures!F2:G2460;Ecritures!$C$2:$C$2460;"=7*")
Cette formule demande à Excel d'aller dans la feuille nommée Ecritures et
d'y faire la somme des plages(F2:F2460 ) et (C2:C2460) si la cel à
additionner commence par 7.
J'ai supposé que G2460 voulait dire F2460.
Si c'est bien de cela qu'il s'agit, un petit sommeprod ne conviendrait-il
pas?
ou un =Si(et(gauche...... ?

Ou bien mon neurone cale-t-il quelque part?
Mille mercis de tes explications.


Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"DanielCo" a écrit dans le message de groupe de discussion :
l7src3$nmo$1...@speranza.aioe.org...

DanielCo

unread,
Dec 6, 2013, 11:27:15 AM12/6/13
to
Tu peux fonctionner avec des plages inᅵgales donc F2:G2640 est licite
(regarde l'aide de SOMME.SI). Sinon, oui, ton raisonnement est correct,
sauf que SOMMEPROD est soupᅵonnᅵe d'ᅵtre une fonction matricielle, donc
gourmande en ressources; c'est peut-ᅵtre aussi le cas de SOMME.SI
(.ENS) qui travaille ᅵgalement sur des plages de cellules. Je manque de
certitudes. L'avantage de SOMMEPROD est qu'il est compatible avec les
versions antᅵrieures.
Daniel


> Merci Daniel
> Donc, si je comprends bien, la question:
> =SOMME.SI.ENS(Ecritures!F2:G2460;Ecritures!$C$2:$C$2460;"=7*")
> Cette formule demande ᅵ Excel d'aller dans la feuille nommᅵe Ecritures et d'y
> faire la somme des plages(F2:F2460 ) et (C2:C2460) si la cel ᅵ additionner
> commence par 7.
> J'ai supposᅵ que G2460 voulait dire F2460.

Jacquouille

unread,
Dec 6, 2013, 12:57:43 PM12/6/13
to
Re
Merci pour cette prᅵcision.
Je resterai donc avec mon vieux complice Sommeprod, mᅵme s'il est soupᅵonnᅵ
de gourmandise. -))

Jacquouille

" Le vin est au repas ce que le parfum est ᅵ la femme."
"DanielCo" a ᅵcrit dans le message de groupe de discussion :
l7stsq$vmm$1...@speranza.aioe.org...

MichD

unread,
Dec 6, 2013, 1:48:49 PM12/6/13
to
Bonjour,

La fonction "SOMME.SI" permet un seul critère, avec la
fonction "SOMME.SI.ENS", tu as 127 possibilités de plages
et de critères. Ça laisse de la marge.

= SOMME.SI.ENS (somme de la plage ; plage du critère 1 ; critère 1 ; plage
du critère 2 ; critère 2 ; … )

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

Jacquouille

unread,
Dec 6, 2013, 2:24:07 PM12/6/13
to
Bonsoir Denis,
Pour bien terminer la soirée, et seulement si tu as le temps,
pourrais-tu me définir les termes " plage du critère 1" et "critère 1 " ?
Le ".ens" signifierait donc "ensemble avec les 126 autres?
-))
Pour info, du temps où j'étais secrétaire de la SPA ( SommeProd Académie
présidée par Alain Vallon), j'ai testé SP avec 33 critères.
Je suppose donc que 2007 ou 2010 devraient lui permettre de monter aussi à
du 127. Non?
-))
Merci et bonne fin de soirée.


Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"MichD" a écrit dans le message de groupe de discussion :
l7t66e$qjs$1...@speranza.aioe.org...

MichD

unread,
Dec 6, 2013, 3:14:34 PM12/6/13
to
Le principe est simple,

Tu veux additionner la colonne A1:A10
comme critère 1 : Range("B1:B10") = "Toto"
comme critère 2 : Range("C1:D10") = "Cadeau"

La formule est :
SOMME.SI.ENS(A1:A10;B1:B10,"Toto";C1:C10;"Cadeau")

A1:A10 = Plage à additionner
B1:B10 la plage qui doit être égale à "Toto" le critère pour B1:B10
C1:C10 la plage qui doit être égale à "Cadeau" le critère pour C1:C10

Il ne faut pas chercher des chinoiseries où il n'y en a pas!


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

GL

unread,
Dec 6, 2013, 3:55:39 PM12/6/13
to
Le 06/12/2013 20:24, Jacquouille a écrit :
> Bonsoir Denis,
> Pour bien terminer la soirée, et seulement si tu as le temps,
> pourrais-tu me définir les termes " plage du critère 1" et "critère 1 " ?
> Le ".ens" signifierait donc "ensemble avec les 126 autres?
> -))
> Pour info, du temps où j'étais secrétaire de la SPA ( SommeProd Académie
> présidée par Alain Vallon), j'ai testé SP avec 33 critères.
> Je suppose donc que 2007 ou 2010 devraient lui permettre de monter aussi
> à du 127. Non?
> -))
> Merci et bonne fin de soirée.

C'est surtout que SOMME.SI.ENS est plus claire que SOMME.SI :

SOMME.SI (plage;critère;plage_a_sommer) n'est pas naturelle
SOMME.SI.ENS(plage_a_sommer;plage_de_critère;critère) est nettement
plus mémorisable.

Cdt.

Jacquouille

unread,
Dec 6, 2013, 4:44:10 PM12/6/13
to
... et je suppose que c'est un ET qui signifie + et non ou.
Donc, sommer la col A si colB="toto" ET col C=""cadeau" ?



Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"MichD" a écrit dans le message de groupe de discussion :
l7tb77$arp$1...@speranza.aioe.org...

MichD

unread,
Dec 6, 2013, 6:39:12 PM12/6/13
to
Tu as tout compris!


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

Jacquouille

unread,
Dec 7, 2013, 4:51:46 AM12/7/13
to
Bon prof -------> bon élève.
Bon WE!

Jacquouille

" Le vin est au repas ce que le parfum est à la femme."
"MichD" a écrit dans le message de groupe de discussion :
l7tn95$fbq$2...@speranza.aioe.org...

HD

unread,
Dec 9, 2013, 5:32:43 AM12/9/13
to
> Donc, si je comprends bien, la question:
> =SOMME.SI.ENS(Ecritures!F2:G2460;Ecritures!$C$2:$C$2460;"=7*")
> Cette formule demande � Excel d'aller dans la feuille nomm�e Ecritures et
> d'y faire la somme des plages(F2:F2460 ) et (C2:C2460) si la cel �
> additionner commence par 7.
Non. Je voudrais en fait faire la somme des plages F2:F2460 et G2:G2460 (via
la plage F2:G2460) l� o� l'on trouve sur les lignes de ces plages la
condition C2:C2460 "=7*" (soit en colonne C une valeur qui commence par 7).

@+
HD


HD

unread,
Dec 9, 2013, 5:35:56 AM12/9/13
to
> Je resterai donc avec mon vieux complice Sommeprod, m�me s'il est
> soup�onn� de gourmandise. -))
Ouille, par contre dans mon cas, �a serait pour utiliser cette formule en
VBA afin d'en faire une fonction permettant dans les formules de ressortir
les sommes des valeurs correspondants � un compte comptable donn�. Par
exemple, j'aurai =D�bit(701) qui me cherchera dans toutes les �critures
comptables le d�bit du 701. En sachant que sur un classeur je risque
d'utiliser de nombreuses fois cette formule... Il me faudrait donc quelque
chose de rapide/pas gourmand.

@+
HD


DanielCo

unread,
Dec 9, 2013, 6:17:05 AM12/9/13
to
>> Je resterai donc avec mon vieux complice Sommeprod, mᅵme s'il est soupᅵonnᅵ
>> de gourmandise. -))
> Ouille, par contre dans mon cas, ᅵa serait pour utiliser cette formule en VBA
> afin d'en faire une fonction permettant dans les formules de ressortir les
> sommes des valeurs correspondants ᅵ un compte comptable donnᅵ. Par exemple,
> j'aurai =Dᅵbit(701) qui me cherchera dans toutes les ᅵcritures comptables le
> dᅵbit du 701. En sachant que sur un classeur je risque d'utiliser de
> nombreuses fois cette formule... Il me faudrait donc quelque chose de
> rapide/pas gourmand.
>
> @+
> HD

Bonjour,
A ta place, j'essaierais d'abord avec les formules; 3000 lignes, ce
n'est pas la mer ᅵ boire. Maintenant, effectivement, ᅵa dᅵpend aussi du
nombre de formules.
Voici une foction VBA. Le premier paramᅵtre est la chaᅵne recherchᅵe,
les second, la plage ou se fait la recherche; la seconde plage est la
plage ᅵ additionner. Il peut y avooir une seconde plage ᅵ additionner.
Les plages doivent avoir la mᅵme taille. eg.
=dᅵbit("7*";C2:C14;F2:F14)
=dᅵbit("7*";C2:C14;F2:F14;L2:L14)

Function Dᅵbit(Quoi As String, Cherche As Range, Add As Range, Optional
Add2 As Range) As Double
Dim C As Range
Application.Volatile
If Add2 Is Nothing Then
For i = i To Cherche.Count
If Cherche(i) Like Quoi Then
Dᅵbit = Dᅵbit + Add(i)
End If
Next i
Else
For i = i To Cherche.Count
If Cherche(i) Like Quoi Then
Dᅵbit = Dᅵbit + Add(i) + Add2(i)
End If
Next i
End If
End Function

Daniel

HD

unread,
Dec 9, 2013, 6:41:47 AM12/9/13
to
J'ai adapt� le script :
Function Debit2(Quoi As String) As Double
Dim C As Range
Dim Cherche As Range
Dim Add As Range

Set Cherche = Sheets("Ecritures").Columns(3)
Set Add = Sheets("Ecritures").Columns(6)
Application.Volatile

For i = i To Cherche.Count
If Cherche(i) Like Quoi Then Debit2 = Debit2 + Add(i)
Next i
End Function

Mais lorsque je fais =Debit2(7) dans une cellule j'obtiens un #VALEUR!

@+
HD


DanielCo

unread,
Dec 9, 2013, 6:56:20 AM12/9/13
to
Ca fonctionnerait comme ceci, mais tu parcours des colonnes entiᅵres,
donc c'est trᅵs long :

Function Debit2(Quoi As String) As Double
Dim C As Range
Dim Cherche As Range
Dim Add As Range

Set Cherche = Sheets("Ecritures").Columns(3).Cells
Set Add = Sheets("Ecritures").Columns(6).Cells
Application.Volatile

For i = 1 To Cherche.Count
If Cherche(i) Like Quoi Then Debit2 = Debit2 + Add(i)
Next i
End Function

Daniel

> J'ai adaptᅵ le script :

HD

unread,
Dec 9, 2013, 8:04:32 AM12/9/13
to
> Ca fonctionnerait comme ceci, mais tu parcours des colonnes enti�res, donc
> c'est tr�s long
M�me en r�duisant la plage cela reste encore tr�s long... en tout cas
beaucoup plus l'on qu'avec la fonction Somme.Si.Ens que l'on utiliserait en
VBA.

Comme je l'ai �cris dans mes pr�c�dents messages de ce fil de discussion, je
risque d'utiliser de nombreuses fois ma fonction "D�bit" sur le classeur
(peut �tre une centaine de fois voir plus...).

@+
HD


HD

unread,
Dec 9, 2013, 8:12:21 AM12/9/13
to
Bonjour MichD,

J'ai voulu utiliser la fonction Evaluate pour utiliser la formule
Somme.Si.Ens en vba mais cela me renvoi 0 l� o� je devrais avoir un autre
montant.

Avec:
FEcr="Ecritures"
ColCpt=3
ColDebit=6
et Cpt=7

MsgBox Evaluate("SUMIFS(Sheets(" & Fecr & ").Columns(" & ColDebit & "),
Sheets(" & Fecr & ").Columns(" & ColCpt & "), ""="" & cpt & ""*"")")
me renvoi 0...

MsgBox Evaluate("=SUMIFS(Ecritures!C6,Ecritures!C3,""=7*"")")
Me renvoi 0...

alors qu'avec ma formule directement sur la cellule
=SOMME.SI.ENS(Ecritures!$F:$F;Ecritures!$C:$C;"=7*")
j'obtiens 92 763,29.

M�me en enregistrant une macro avec double clic sur la formule pour voir ce
que cela donne en VBA j'obtiens une formule qui une fois lanc�e en VBA me
ressort encore 0.

@+
HD


DanielCo

unread,
Dec 9, 2013, 8:26:44 AM12/9/13
to
>> Ca fonctionnerait comme ceci, mais tu parcours des colonnes entiᅵres, donc
>> c'est trᅵs long
> Mᅵme en rᅵduisant la plage cela reste encore trᅵs long... en tout cas
> beaucoup plus l'on qu'avec la fonction Somme.Si.Ens que l'on utiliserait en
> VBA.
>
> Comme je l'ai ᅵcris dans mes prᅵcᅵdents messages de ce fil de discussion, je
> risque d'utiliser de nombreuses fois ma fonction "Dᅵbit" sur le classeur
> (peut ᅵtre une centaine de fois voir plus...).
>
> @+
> HD

VBA est plus long que les fonctions Excel, c'est pourquoi je t'ai
recommandᅵ de commencer par utiliser des formules.
Daniel

HD

unread,
Dec 9, 2013, 8:29:11 AM12/9/13
to
> VBA est plus long que les fonctions Excel, c'est pourquoi je t'ai
> recommand� de commencer par utiliser des formules.
Sauf qu'avec Evaluate l'on peut utiliser des formules Excel directement dans
le VBA. Cela m'a d�j� par le pass� permis de gagner beaucoup de temps par
rapport � du code en "vba pur".

@+
HD


DanielCo

unread,
Dec 9, 2013, 9:07:25 AM12/9/13
to
Mais avec Evaluate, tu exᅵcutes la fonction Excel, donc tu nas de gain
que dans le cas oᅵ tu n'as qu'une partie de la feuille ᅵ recalculer.
Daniel


>> VBA est plus long que les fonctions Excel, c'est pourquoi je t'ai
>> recommandᅵ de commencer par utiliser des formules.
> Sauf qu'avec Evaluate l'on peut utiliser des formules Excel directement dans
> le VBA. Cela m'a dᅵjᅵ par le passᅵ permis de gagner beaucoup de temps par
> rapport ᅵ du code en "vba pur".
>
> @+
> HD

MichD

unread,
Dec 9, 2013, 10:17:14 AM12/9/13
to
Bonjour,

Voici un exemple avec "Evaluate"
Ce crit�re Crit = """>7*""" s'applique seulement si
tu fais r�f�rence � une cha�ne de caract�re texte o�
que tu aies format� "Texte" la plage de cellules avant
d'y saisir tes nombres.

Cependant, comme dans l'exemple, tu peux utiliser
une autre formule.

'-----------------------------------------
Sub test()
Dim PlgSomme As String
Dim PlgCrit As String
Dim Crit As String

With Worksheets("Ecritures")
derlig = .Range("C65536").End(xlUp).Row
PlgSomme = .Name & "!" & .Range("C2:C" & derlig).Address
PlgCrit = .Name & "!" & .Range("D2:D" & derlig).Address
Crit = """=7*"""
End With

'PlgCrit est per�u comme du texte
MsgBox Evaluate("=SUMIFS(" & PlgSomme & "," & _
PlgCrit & "," & Crit & ")")

'PlgCrit peut-�tre num�rique, texte ou alphanum�rique.
'Si cette formule �tait inscrite dans une cellule, il faudrait la
'valider avec "Maj + Ctrl + Enter" (formule matricielle). Elle
bouffe beaucoup de ressources si les plages sont importantes...

MsgBox Evaluate("SUM(IF(MID(" & PlgCrit & ",1,1)=""7""," & PlgSomme & "))")

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


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

HD

unread,
Dec 9, 2013, 12:11:59 PM12/9/13
to
Bonjour MichD,

> 'PlgCrit est per�u comme du texte
> MsgBox Evaluate("=SUMIFS(" & PlgSomme & "," & _
> PlgCrit & "," & Crit & ")")
> 'PlgCrit peut-�tre num�rique, texte ou alphanum�rique.
> 'Si cette formule �tait inscrite dans une cellule, il faudrait la
> 'valider avec "Maj + Ctrl + Enter" (formule matricielle). Elle
> bouffe beaucoup de ressources si les plages sont importantes...
> MsgBox Evaluate("SUM(IF(MID(" & PlgCrit & ",1,1)=""7""," & PlgSomme &
> "))")

Seule cette derni�re formule bouffe beaucoup de ressources ? Ou la premi�re
en consomme beaucoup �galement ?

J'ai essay� les deux et j'arrive au m�me r�sultat dans les deux cas. Donc si
la premi�re est moins gourmande je la prendrais.

Merci de votre aide

@+
HD


HD

unread,
Dec 9, 2013, 12:17:04 PM12/9/13
to
> Mais avec Evaluate, tu ex�cutes la fonction Excel, donc tu nas de gain que
> dans le cas o� tu n'as qu'une partie de la feuille � recalculer.
Du gain par rapport � des formules Excel ? ou du gain par rapport � une
macro purement VBA sans utilisation de fonction Excel ? Par rapport � une
boucle VBA la diff�rence de rapidit� est en tout cas flagrante. Pour ce qui
est des formules Excel, je cherche � cr�er une fonction du style
D�bit(num�ro de cpte) pour mes coll�gues car ils ne sauront pas utiliser le
Somme.Si.Prod. De plus, via un ancien logiciel, nous avons d�j� des
classeurs avec des formules nomm�es "D�bit" cela me permettra de reprendre
ces classeurs et d'y ajouter la nouvelle fonction "D�bit" avec les m�mes
arguments et l� cela pourra refonctionner directement.

@+
HD


MichD

unread,
Dec 9, 2013, 12:22:51 PM12/9/13
to
Je n'ai jamais test� leur temps d'ex�cution � chacune
et s'il y a une diff�rence notable ce serait surtout sur
de grandes plages. Cependant c'est s�rement plus rapide
qu'une boucle pour chaque cellule de la plage!

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

HD

unread,
Dec 9, 2013, 12:27:58 PM12/9/13
to
> Cependant c'est s�rement plus rapide
> qu'une boucle pour chaque cellule de la plage!

Nous sommes d'accord lol
D'ailleurs, il me semble que c'est d�j� vous MichD qui m'aviez conseill�
d'utiliser les fonctions natives d'Excel via Evaluate en VBA. La diff�rence
d'ex�cution est tr�s importante.

En tout cas, un grand MERCI � vous tous.

@+
HD


HD

unread,
Dec 9, 2013, 12:40:01 PM12/9/13
to
Ouille... je coince encore... mais cette fois si sur les dates...

J'ai voulu ajouter une option sur les dates... mais j'obtiens alors un
#VALEUR!

Function Credit(cpt As String, Optional DateMin As Date, Optional DateMax As
Date) As Double
Dim PlgSomme As String
Dim PlgCrit As String
Dim Crit As String
Dim PlgCritDate As String
Dim Formule As String

With Worksheets("Ecritures")
derlig = .Range("C65536").End(xlUp).Row
PlgSomme = .Name & "!" & .Range("G2:G" & derlig).Address
PlgCrit = .Name & "!" & .Range("C2:C" & derlig).Address
PlgCritDate = .Name & "!" & .Range("A2:A" & derlig).Address
End With
Crit = """=" & cpt & "*"""
Formule = "=SUMIFS(" & PlgSomme & "," & PlgCrit & "," & Crit
If DateMin <> "" Then Formule = Formule & "," & PlgCritDate & "," &
""">=" & CStr(DateMin) & """"
Formule = Formule & ")"
MsgBox Formule
Credit = Evaluate(Formule)
End Function

Pour voir d'o� vient le probl�me j'ai voulu afficher la variable "Formule"
mais elle ne s'affiche pas...

@+
HD


MichD

unread,
Dec 9, 2013, 2:00:26 PM12/9/13
to
Transforme cette proc�dure en fonction

Attention � la double d�claration des variables!

'--------------------------------------
Sub test()
Dim PlgSomme As String
Dim PlgCrit As String
Dim PlgDate As String
Dim DateCrit As String
Dim Crit As String
Dim Formule As String

With Worksheets("Ecritures")
DerLig = .Range("C65536").End(xlUp).Row
PlgSomme = .Name & "!" & .Range("C2:C" & DerLig).Address
PlgCrit = .Name & "!" & .Range("D2:D" & DerLig).Address
PlgDate = .Name & "!" & .Range("A2:A" & DerLig).Address
DateCrit = """>" & CLng(Date) & """"
Crit = """>7*"""
End With

Formule = "=SUMIFS(" & PlgSomme & "," & PlgCrit & "," & Crit & ")"

If DateCrit <> "" Then
Formule = "=SUMIFS(" & PlgSomme & "," & PlgCrit & "," & _
Crit & "," & PlgDate & "," & DateCrit & ")"
Else
Formule = "=SUMIFS(" & PlgSomme & "," & PlgCrit & "," & Crit & ")"
End If

MsgBox Evaluate(Formule)

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



MichD
---------------------------------------------------------------
"HD" a �crit dans le message de groupe de discussion :
l84v7f$1fee$1...@saria.nerim.net...

Ouille... je coince encore... mais cette fois si sur les dates...

J'ai voulu ajouter une option sur les dates... mais j'obtiens alors un
#VALEUR!

Function Credit(cpt As String, Optional DateMin As Date, Optional DateMax As
Date) As Double
Dim PlgSomme As String
Dim PlgCrit As String
Dim Crit As String
Dim PlgCritDate As String
Dim Formule As String

With Worksheets("Ecritures")
derlig = .Range("C65536").End(xlUp).Row
PlgSomme = .Name & "!" & .Range("G2:G" & derlig).Address
PlgCrit = .Name & "!" & .Range("C2:C" & derlig).Address
PlgCritDate = .Name & "!" & .Range("A2:A" & derlig).Address
End With
Crit = """=" & cpt & "*"""
Formule = "=SUMIFS(" & PlgSomme & "," & PlgCrit & "," & Crit
If DateMin <> "" Then Formule = Formule & "," & PlgCritDate & "," &
""">=" & CStr(DateMin) & """"
Formule = Formule & ")"
MsgBox Formule
Credit = Evaluate(Formule)
End Function

Pour voir d'o� vient le probl�me j'ai voulu afficher la variable "Formule"

DanielCo

unread,
Dec 9, 2013, 2:17:15 PM12/9/13
to
>> Mais avec Evaluate, tu exᅵcutes la fonction Excel, donc tu nas de gain que
>> dans le cas oᅵ tu n'as qu'une partie de la feuille ᅵ recalculer.
> Du gain par rapport ᅵ des formules Excel ? ou du gain par rapport ᅵ une macro
> purement VBA sans utilisation de fonction Excel ? Par rapport ᅵ une boucle
> VBA la diffᅵrence de rapiditᅵ est en tout cas flagrante. Pour ce qui est des
> formules Excel, je cherche ᅵ crᅵer une fonction du style Dᅵbit(numᅵro de
> cpte) pour mes collᅵgues car ils ne sauront pas utiliser le Somme.Si.Prod. De
> plus, via un ancien logiciel, nous avons dᅵjᅵ des classeurs avec des formules
> nommᅵes "Dᅵbit" cela me permettra de reprendre ces classeurs et d'y ajouter
> la nouvelle fonction "Dᅵbit" avec les mᅵmes arguments et lᅵ cela pourra
> refonctionner directement.
>
> @+
> HD

Pour une formule, ce qui est le plus rapide, c'est la formule ᅵ base de
fonctions natives Excel. Pour une question de commoditᅵ d'emploi, la
fonction VBA est presque aussi rapide, et plus facile ᅵ manier. Dans
les deux cas, tu seras pᅵnalisᅵ si tu utilises de grandes plages et /
ou beaucoup de ces formules. Dans certains cas, s'il esst possible de
ne pas tout recalculer (par exemple, si seule une portion de ligne doit
ᅵtre recalculᅵe, il est avantageux de remplacer la formule par sa
valeur et de ne recalculer par macro que les cellules impactᅵes.
Daniel

MichD

unread,
Dec 9, 2013, 4:43:56 PM12/9/13
to
Une fa�on d'�crire la fonction personnalis�e � copier
dans un module STANDARD.

� partir d'une proc�dure, pour appeler la fonction :

'------------------------------------------------
Sub test2()
Dim LaDate As Variant ' Laisser ce "type" pour cette variable
LaDate = CDate("09/12/2013")

'Les param�tres de la fonction personnalis�e
'1 - Nom de la feuille o� sont les donn�es
'2 - Lettre de la colonne � additionner
'3 - Lettre de la colonne servant de crit�re
'4 - Crit�re : cela peut �tre une date ou une chaine de
caract�re d�butant par le chiffre que l'on inscrit

MsgBox Credit("Ecritures", "C", "A", LaDate)
MsgBox Credit("Ecritures", "C", "D", 7)

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

Si on veut appeler cette fonction � partir d'une cellule :
Voici la syntaxe :
A3 est l'adresse d'une cellule contenant la date crit�re
Excel doit reconnaitre le contenu de cette cellule comme �tant une date.
On ne peut pas inscrire : "09/12/2013" (trop long � expliquer pourquoi)

=Credit("Ecritures"; "C"; "A"; A3)
OU
=Credit("Ecritures"; "C"; "D"; 7)


'------------------------------------------------
Function Credit(NomFeuille As String, _
ColonneAdd As String, ColonneCritere As String, _
Crit As Variant, Optional DateMin As Date, _
Optional DateMax As Date) As Double

Dim DerLig As Long
Dim PlgSomme As String
Dim PlgCrit As String
Dim Formule As String

With Worksheets(NomFeuille)
DerLig = .Cells(65536, ColonneAdd).End(xlUp).Row
PlgSomme = .Name & "!" & .Range(.Cells(1, ColonneAdd), _
.Cells(DerLig, ColonneAdd)).Address
PlgCrit = .Name & "!" & .Range(.Cells(1, ColonneCritere), _
.Cells(DerLig, ColonneCritere)).Address
End With

If IsDate(Crit) Then Crit = """>" & CLng(Crit) & _
"""" Else: Crit = """=" & CStr(Crit) & "*"""

Formule = "=SUMIFS(" & PlgSomme & "," & PlgCrit & "," & Crit & ")"
Credit = Evaluate(Formule)
End Function
'------------------------------------------------

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

0 new messages