sommeprod avec array

Le
stefdestroy
Bonjour tout le monde,

Par curiosité je me demandais s'il était 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 = 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), ">=10")
MsgBox Application.SumProduct((Application.Index(a, , 1) = "A") * (Applic=
ation.Index(a, , 2)))

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

Merci
Steph
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
DanielCo
Le #26361114
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
isabelle
Le #26361131
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

isabelle
Le #26361138
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
DanielCo
Le #26361137
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
isabelle
Le #26361136
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
isabelle
Le #26361134
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
stefdestroy
Le #26361207
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
isabelle
Le #26361262
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
GL
Le #26361321
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.
isabelle
Le #26361323
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.
Publicité
Poster une réponse
Anonyme