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

sommeprod avec array

11 réponses
Avatar
stefdestroy
Bonjour tout le monde,

Par curiosit=E9 je me demandais s'il =E9tait possible d'utiliser des foncti=
ons telles que nb.si, Sommeprod etc. sur des variables tableaux en VBA.

Par exemple, j'ai un tableau Excel avec des codes et une valeur :
ColA ColB
A 1
A 2
B 3
B 4
B 5
C 6
C 7
D 8
D 9
D 10


Ces lignes fonctionnent :
a =3D Range("A1:B10").Value
MsgBox Application.Sum(Application.Index(a, , 2)) 'somme 2i=E8me col
MsgBox Application.CountA(Application.Index(a, , 2)) 'compte nb valeurs 2i=
=E8me col
MsgBox Application.Match(5, Application.Index(a, , 2), 0) 'Recherche
=20

En revanche, je n'y arrive pas avec celles-ci :
MsgBox Application.CountIf(Application.Index(a, , 2), ">=3D10")
MsgBox Application.SumProduct((Application.Index(a, , 1) =3D "A") * (Applic=
ation.Index(a, , 2)))

Peut-=EAtre n'est-ce pas possible !
Aucune urgence ! C'est juste pour ma culture personnelle :-)

Merci
Steph

10 réponses

1 2
Avatar
DanielCo
Bonjour,
Non. Tu es parfois obligé de passer par une cellule avec FormulaArray
Cordialement.
Daniel


Bonjour tout le monde,

Par curiosité je me demandais s'il était possible d'utiliser des fonctions
telles que nb.si, Sommeprod etc. sur des variables tableaux en VBA.

Par exemple, j'ai un tableau Excel avec des codes et une valeur :
ColA ColB
A 1
A 2
B 3
B 4
B 5
C 6
C 7
D 8
D 9
D 10


Ces lignes fonctionnent :
a = Range("A1:B10").Value
MsgBox Application.Sum(Application.Index(a, , 2)) 'somme 2ième col
MsgBox Application.CountA(Application.Index(a, , 2)) 'compte nb valeurs 2ième
col MsgBox Application.Match(5, Application.Index(a, , 2), 0) 'Recherche


En revanche, je n'y arrive pas avec celles-ci :
MsgBox Application.CountIf(Application.Index(a, , 2), ">")
MsgBox Application.SumProduct((Application.Index(a, , 1) = "A") *
(Application.Index(a, , 2)))

Peut-être n'est-ce pas possible !
Aucune urgence ! C'est juste pour ma culture personnelle :-)

Merci
Steph
Avatar
isabelle
bonjour Steph,

celle-ci fonctionne

MsgBox [CountIf(Index(a, , 2), ">")]

isabelle

Le 2015-07-23 11:04, a écrit :
Bonjour tout le monde,

Par curiosité je me demandais s'il était possible d'utiliser des fonctions telles que nb.si, Sommeprod etc. sur des variables tableaux en VBA.

Par exemple, j'ai un tableau Excel avec des codes et une valeur :
ColA ColB
A 1
A 2
B 3
B 4
B 5
C 6
C 7
D 8
D 9
D 10


Ces lignes fonctionnent :
a = Range("A1:B10").Value
MsgBox Application.Sum(Application.Index(a, , 2)) 'somme 2ième col
MsgBox Application.CountA(Application.Index(a, , 2)) 'compte nb valeurs 2ième col
MsgBox Application.Match(5, Application.Index(a, , 2), 0) 'Recherche


En revanche, je n'y arrive pas avec celles-ci :
MsgBox Application.CountIf(Application.Index(a, , 2), ">")
MsgBox Application.SumProduct((Application.Index(a, , 1) = "A") * (Application.Index(a, , 2)))

Peut-être n'est-ce pas possible !
Aucune urgence ! C'est juste pour ma culture personnelle :-)

Merci
Steph

Avatar
isabelle
et celle-ci aussi

MsgBox [SumProduct((Index(a, , 1) = "A") * (Index(a, , 2)))]

isabelle

Le 2015-07-23 13:48, isabelle a écrit :
bonjour Steph,

celle-ci fonctionne

MsgBox [CountIf(Index(a, , 2), ">")]

isabelle
Avatar
DanielCo
Bonjour Isabelle,
Oui, ça doit dépendre du niveau de complexité de la formule. Je suis
sûr qu'il m'est arrivé au moins une fois de devoir faire le calcul en
cellule.
Cordialement.
Daniel


bonjour Steph,

celle-ci fonctionne

MsgBox [CountIf(Index(a, , 2), ">")]

isabelle

Le 2015-07-23 11:04, a écrit :
Bonjour tout le monde,

Par curiosité je me demandais s'il était possible d'utiliser des fonctions
telles que nb.si, Sommeprod etc. sur des variables tableaux en VBA.

Par exemple, j'ai un tableau Excel avec des codes et une valeur :
ColA ColB
A 1
A 2
B 3
B 4
B 5
C 6
C 7
D 8
D 9
D 10


Ces lignes fonctionnent :
a = Range("A1:B10").Value
MsgBox Application.Sum(Application.Index(a, , 2)) 'somme 2ième col
MsgBox Application.CountA(Application.Index(a, , 2)) 'compte nb valeurs
2ième col
MsgBox Application.Match(5, Application.Index(a, , 2), 0) 'Recherche


En revanche, je n'y arrive pas avec celles-ci :
MsgBox Application.CountIf(Application.Index(a, , 2), ">")
MsgBox Application.SumProduct((Application.Index(a, , 1) = "A") *
(Application.Index(a, , 2)))

Peut-être n'est-ce pas possible !
Aucune urgence ! C'est juste pour ma culture personnelle :-)

Merci
Steph
Avatar
isabelle
j'oubliais de mentionné:

Dim a As Range
Set a = Range("A1:B10")

isabelle

Le 2015-07-23 13:51, isabelle a écrit :
et celle-ci aussi

MsgBox [SumProduct((Index(a, , 1) = "A") * (Index(a, , 2)))]

isabelle

Le 2015-07-23 13:48, isabelle a écrit :
bonjour Steph,

celle-ci fonctionne

MsgBox [CountIf(Index(a, , 2), ">")]

isabelle
Avatar
isabelle
bonjour Daniel,

oui, ça se complique beaucoup si on utilise des variables...

isabelle

Le 2015-07-23 13:52, DanielCo a écrit :
Bonjour Isabelle,
Oui, ça doit dépendre du niveau de complexité de la formule. Je suis sûr qu'il
m'est arrivé au moins une fois de devoir faire le calcul en cellule.
Cordialement.
Daniel


bonjour Steph,

celle-ci fonctionne

MsgBox [CountIf(Index(a, , 2), ">")]

isabelle

Le 2015-07-23 11:04, a écrit :
Bonjour tout le monde,

Par curiosité je me demandais s'il était possible d'utiliser des fonctions
telles que nb.si, Sommeprod etc. sur des variables tableaux en VBA.

Par exemple, j'ai un tableau Excel avec des codes et une valeur :
ColA ColB
A 1
A 2
B 3
B 4
B 5
C 6
C 7
D 8
D 9
D 10


Ces lignes fonctionnent :
a = Range("A1:B10").Value
MsgBox Application.Sum(Application.Index(a, , 2)) 'somme 2ième col
MsgBox Application.CountA(Application.Index(a, , 2)) 'compte nb valeurs 2ième
col
MsgBox Application.Match(5, Application.Index(a, , 2), 0) 'Recherche


En revanche, je n'y arrive pas avec celles-ci :
MsgBox Application.CountIf(Application.Index(a, , 2), ">")
MsgBox Application.SumProduct((Application.Index(a, , 1) = "A") *
(Application.Index(a, , 2)))

Peut-être n'est-ce pas possible !
Aucune urgence ! C'est juste pour ma culture personnelle :-)

Merci
Steph
Avatar
stefdestroy
Bonjourno,

Merci Daniel et Isa pour vos éclaircissements.

Quand je me trouve dans l'idée de faire des calculs un peu plus complexes sur des array sans boucler, je boucle un peu :-)

Je n'ai pas encore réussi à faire fonctionner les solutions d'Isabelle, je dois pêcher sur une bêtise. mais je liste, on ne sait jamais le cod e si cela peut servir.

Merci à vous deux, bon we
Steph

'======================== ==========

Sub JE_TESTE()
Dim a
a = Range("A1:B10").Value
[D1] = Application.Sum(Application.Index(a, , 2))
[D2] = Application.CountA(Application.Index(a, , 2))
[D3] = Application.Match(5, Application.Index(a, , 2), 0)

Dim c, d
Set c = Range("A1:A10")
Set d = Range("B1:B10")
[D4].FormulaArray = "=SUMPRODUCT((" & c.Address & "=""A"")*(" & d .Address & "))"
[D5] = Evaluate("SUMPRODUCT((" & c.Address & "=""A"")*(" & d.Addres s & "))")

'= par Dico
Dim MonDico
Dim MaCell As Range
Set MonDico = CreateObject("Scripting.Dictionary")
For Each MaCell In Range("A1:A10")
If MaCell.Value = "A" Then
If Not MonDico.exists(MaCell.Value) Then
MonDico(MaCell.Value) = MaCell.Offset(, 1).Value
Else
MonDico(MaCell.Value) = Application.Sum(MonDico(MaCell.Val ue), MaCell.Offset(, 1).Value)
End If
End If
Next MaCell
[D6].Resize(MonDico.Count, 1) = Application.Transpose(MonDico.items)

'= Par Fonction
[D7] = COMPTE("B", Range("A1:A10"), 1)

'NE MARCHE PAS : #NOM ****
Dim b
Set b = Range("A1:B10")
[E1] = [CountIf(Index(b,,2),">")]
[E2] = [SumProduct((Index(b,,1) = "A")*(Index(b,,2)))]
[E3].FormulaArray = "=SUMPRODUCT((Index(a, , 1) = ""A"") * (Index (a, , 2)))"

End Sub


Function COMPTE(MA_VAL$, MA_PLAGE_REC As Range, IndexCumul#)
Dim MonDico
Dim MaCell As Range
Set MonDico = CreateObject("Scripting.Dictionary")
For Each MaCell In MA_PLAGE_REC
If MaCell.Value = MA_VAL Then
If Not MonDico.exists(MaCell.Value) Then
MonDico(MaCell.Value) = MaCell.Offset(, IndexCumul)
Else
MonDico(MaCell.Value) = Application.Sum(MonDico(MaCell.Val ue), MaCell.Offset(, IndexCumul))
End If
End If
Next MaCell
COMPTE = Application.Transpose(MonDico.items)
End Function
Avatar
isabelle
bonjour steph,

essaie comme ça,

Sub JE_TESTE_2()
Dim sSheet As String
sSheet = "þuil1!" 'nom de l'onglet des données
ActiveWorkbook.Names.Add Name:="b", RefersTo:=sSheet & Range("A1:B10").Address
Range("E1") = [CountIf(Index(b, , 2), ">")]
Range("E2") = [SumProduct((Index(b, , 1) = "A") * (Index(b, , 2)))]
End Sub

isabelle

Le 2015-07-24 09:38, a écrit :
Bonjourno,

Merci Daniel et Isa pour vos éclaircissements.

Quand je me trouve dans l'idée de faire des calculs un peu plus complexes sur des array sans boucler, je boucle un peu :-)

Je n'ai pas encore réussi à faire fonctionner les solutions d'Isabelle,


je dois pêcher sur une bêtise. mais je liste, on ne sait jamais le code si cela
peut servir.

Merci à vous deux, bon we
Steph
Avatar
GL
Le 25/07/2015 03:36, isabelle a écrit :
bonjour steph,

essaie comme ça,

Sub JE_TESTE_2()
Dim sSheet As String
sSheet = "þuil1!" 'nom de l'onglet des données
ActiveWorkbook.Names.Add Name:="b", RefersTo:=sSheet &
Range("A1:B10").Address
Range("E1") = [CountIf(Index(b, , 2), ">")]
Range("E2") = [SumProduct((Index(b, , 1) = "A") * (Index(b, , 2)))]
End Sub

isabelle



Oui. Je pense que le crochet équivaut à utiliser la fonction
Evaluate("chaine à évaluer")

En général, j'arrive à évaluer des fonctions matricielles avec
Evaluate, sauf en cas de formules matricielles imbriquées, auquel
cas seul un calcul dans une cellule semble possible.

Florent.
Avatar
isabelle
bonjour Florent,

je ne crois pas, à moins que le problème soit plus complexe...

http://www.cjoint.com/c/EGAdA572h7a

isabelle

Le 2015-07-25 18:44, GL a écrit :
sauf en cas de formules matricielles imbriquées, auquel
cas seul un calcul dans une cellule semble possible.

Florent.
1 2