Fonction Sommeprod à 3 variables pour vba
Résolu
Praljm
Messages postés
52
Statut
Membre
-
Praljm Messages postés 52 Statut Membre -
Praljm Messages postés 52 Statut Membre -
Bonjour,
Je peine à trouver la formule vba qui me permet d'avoir le résultat à partir de 3 conditions : (sumproduct ? sumif ? )
ma formule excel à convertir => =SOMMEPROD((A2:A27=1)*(D27:D27=380341)*(P2:P27="Eau")*(S2:S27))
Comment faire pour que le résultat apparaisse en cellule a28 ?
Ca marche très bien avec excel/sommeprod mais ça va être très long quand j'aurais 8000 lignes...
Merci d'avance
Cordialement.
Je peine à trouver la formule vba qui me permet d'avoir le résultat à partir de 3 conditions : (sumproduct ? sumif ? )
ma formule excel à convertir => =SOMMEPROD((A2:A27=1)*(D27:D27=380341)*(P2:P27="Eau")*(S2:S27))
Comment faire pour que le résultat apparaisse en cellule a28 ?
Ca marche très bien avec excel/sommeprod mais ça va être très long quand j'aurais 8000 lignes...
Merci d'avance
Cordialement.
5 réponses
-
Bonjour,
Sommeprod étant une vraie-fausse formule matricielle, cela sera effectivement très long
je regarde une solution "rapide"
mais si tu pouvais joindre un extrait de ton classeur (1000 lignes )
pour joindre une pièce
mettre le classeur sans données confidentielles en pièce jointe sur
https://www.cjoint.com/
puis copier l'adresse du lien et la coller dans le message de réponse
-
1° jet
Option Explicit
'ma formule excel à convertir => =SOMMEPROD((A2:A27=1)*(D27:D27=380341)*(P2:P27="Eau")*(S2:S27))
Sub sommeprod()
Dim Derlig As Integer, Tablo(), Idx As Integer, Somme As Double
Dim start As Single
start = Timer
Application.ScreenUpdating = False
Derlig = Columns("A").Find("*", , , , , xlPrevious).Row
Tablo = Range("A2:S" & Derlig).Value
For Idx = 1 To UBound(Tablo)
If Tablo(Idx, 1) = 1 Then
If Tablo(Idx, 4) = 380341 Then
If Tablo(Idx, 16) = "Eau" Then Somme = Somme + Tablo(Idx, 19)
End If
End If
Next
Cells(Derlig + 1, "A") = Somme
Application.ScreenUpdating = True
MsgBox "Calcul sur " & Derlig & " lignes effectué en : " & Timer - start & " Sec."
End Sub
Non testé
Mais suivant la structure de ton tableau, il serait peut-^tre + efficace de passer par 4 tableaux au lieu d'un (1 tableau par colonne: A, D,P,S) -
-
-
Essai 2500 lignes toutes colonnes remplies:
1 tableau=0,25 sec
Essai 8000 lignes
4 tableaux= 0,125 sec
code 4 tableauxOption Explicit
'ma formule excel à convertir => =SOMMEPROD((A2:A27=1)*(D27:D27=380341)*(P2:P27="Eau")*(S2:S27))
Sub sommeprod()
Dim Derlig As Integer, T_a(), T_d(), T_p(), T_s(), Idx As Integer, Somme As Double
Dim start As Single
start = Timer
Derlig = Columns("A").Find("*", , , , , xlPrevious).Row
With Application
.ScreenUpdating = False
T_a = .Transpose(Range("A2:A" & Derlig))
T_d = .Transpose(Range("D2:D" & Derlig))
T_p = .Transpose(Range("P2:P" & Derlig))
T_s = .Transpose(Range("S2:S" & Derlig))
End With
For Idx = 1 To UBound(T_a)
If T_a(Idx) = 1 Then
If T_d(Idx) = 380341 Then
If T_p(Idx) = "Eau" Then Somme = Somme + T_s(Idx)
End If
End If
Next
Cells(Derlig + 1, "A") = Somme
Application.ScreenUpdating = True
MsgBox "Calcul sur " & Derlig & " lignes effectué en : " & Timer - start & " Sec."
End Sub
En espèrant que Praljm daigne bien faire signe....
Michel -
Bonjour,
Merci pour la réponse que je vais essayer de mettre en pratique.
Cordialement. -
Merci ?
Encore quelqu'un de correct ...
Décourageant....
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Bonjour et merci pour toutes les propositions de programmation.
J'ai commencé à batir le futur fichier...
Bien cordialement,
A bientôt