SumProduct (utilisation en VBA)
Bonjours,
Je n'arrive pas à me servir de la fonction Sumproduct en VBA qui pourtant marche bien en Excel. J'aurai aimer savoir comment on peut introduire des constante dans une fonction Sumproduct.
Imaginons les valeurs suivantes:
A_________B____C_____D_______ Résultat (Excel)____Résultat (VBA)
2.5_______ 2____25____32_______8.967539539______
1_________3____32____12_______-1.727402497______
2_________7____66____24_______-2.173019259______
3_________9____55____78_______1.029013732_______
4_____________________________14.18208467_______
5_____________________________-4.731036159______
6_____________________________-7.243988707______
En Excel, le Résultat (Excel) s'écrit:
Code:
=SOMMEPROD($C$2:$C$5; SIN(($D$2:$D$5 * $A2) + RADIANS($E$2:$E$5)))
http://img11.hostingpics.net/thumbs/...nsousExcel.png http://img11.hostingpics.net/thumbs/...sousExcel2.png
Cela fonctionne bien. Le résultat est bon. La constante introduit (A2) dans la formule ne pose pas de problème. Excel la prends comme valeur unique. En faisant glisser la formule dans la feuille, la valeur A2 change et passe en A3, puis A4 etc...
En VBA, cela ne marche pas dutout, pourquoi ? Même en utilisant une boucle for pour la constante.
Quel code puis-je appliquer pour avoir le même résultat qu'en Excel ?
Merci.
J'ai enfin trouvé une solution !!!
Petite mise à jour, j'ai trouvé une méthode, certainement peu efficace, mais je verrai par la suite si ça vaut le coup de continuer ou pas. Si c'est trop lent, l'intérêt de la fonction SOMMEPROD se perd.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| Option Explicit
Sub form()
Dim atext As String
Dim ctext As String, dtext As String, etext As String
Dim itext1 As String, itext2 As String
Dim ModeCalc As Integer
ModeCalc = Application.Calculation
Application.Calculation = xlCalculationManual
atext = "$A2" ' A écrire sur la Feuille Excel en $K$20 :=> $K$20 = $A2 'Sans les guillemets
ctext = "$C$2:$C$5" ' A écrire sur la Feuille Excel en $K$21 :=> $K$21 = $C$2:$C$5 'Sans les guillemets 'ADRESSE par calcul dans feuille
dtext = "$D$2:$D$5" 'idem
etext = "$E$2:$E$5" 'idem
itext = "$I$2:$I$8" 'idem
itext1 = "$I$2" 'idem
itext2 = "$I$8" 'idem
With Range(itext1)
.Formula = "=" & "SUMPRODUCT(" & ctext & "," & " SIN((" & dtext & " * " & atext & ") + RADIANS(" & etext & ")))"
.AutoFill Destination:=Range(itext), Type:=xlFillDefault
End With
ActiveSheet.Range(itext).Calculate 'Obligatoire : Pour les cas où le calcule auto n'est pas actif, avec Nom classeur actif
With Range(itext)
.Value = .Value 'Transformation de Formule en Valeur
End With
Application.Calculation = ModeCalc
End Sub |
Nos chemins se croisent !
Merci, je vais essayer ta solution pour voir.
EDIT: Ah, elle n'utilise pas de SOMMEPROD hélas.
C'est sympa de ta part de m'avoir fait une petite fonction, mais je ne pense pas que j'utiliserai de fonction perso pour l'instant. Mon but est surtout d'essayer d'apprendre le VBA enfaite et bien sûr pouvoir faire des trucs avec comme ici. Mais je commence à connaitre de mieux en mieux le VBA (création de boucle avec pause/marche/arrêt, création de tableau, et même un tout petit peu d'OpenGL pour les graphiques etc...) et j'arrive bien à utiliser la plupart des fonctions VBA sauf justement les fonctions interne à Excel.
Comparaison temps de calcul: SOMMEPROD vs. Fonction personnelle
Bonjours,
Le sujet est résolu, j'ajoute simplement ici une comparaison du temps de calcul entre la fonction perso de SMBeccaria et la fonction Excel SOMMEPROD pour montrer le gain qu'il y a entre des boucles et les fonctions en Excel.
Test n°1: Fonction SOMMPROD // Fonction perso
A = 320 // 320
B = 8000 // 8000
C = 8000 // 8000
D = 8000 // 8000
Temps de calcul: 1,15 s à 1,8s // 33 s
------------------------------------------------
Test n°2: Fonction SOMMPROD
A = 6400 // 6400
B = 8000 // 8000
C = 8000 // 8000
D = 8000 // 8000
Temps de calcul: 24 s en .Value et 33 s en .Formula // 672 s
-----------------------------------------------
Le temps de calcul est divisé par 28 en utilisant un SOMMEPROD plutôt qu'en utilisant des boucles avec la fonction perso. Utiliser des tableau (travaille en mémoire vive) ne semble pas changer la donne pour la fonction perso.
Le temps de calcul en supprimant les lignes du code:
Code:
1 2 3
| With Range(itext)
.Value = .Value 'Transformation de Formule en Valeur
End With |
présant dans ce code:
Code:
1 2 3 4 5 6 7 8
| With Range(itext1)
.Formula = "=" & "SUMPRODUCT(" & ctext & "," & " SIN((" & dtext & " * " & atext & ") + RADIANS(" & etext & ")))"
.AutoFill Destination:=Range(itext), Type:=xlFillDefault
End With
ActiveSheet.Range(itext).Calculate 'Obligatoire : Pour les cas où le calcule auto n'est pas actif, avec Nom classeur actif
With Range(itext)
.Value = .Value 'Transformation de Formule en Valeur
End With |
augmente très bizarrement le temps de calcul !!!!
C'est très bizarre, et le " ActiveSheet.Range(itext).Calculate " doit y être pour quelquechose. Pourtant, il est placé avant le " Range(itext).Value = .Value "
Donc, je pense qu'on peut dire que la fonction "AutoFill" associé à un ".Value= .Value" est très efficace.
Voilà.
-------------------------------- Mise à jour --------------------------------------
EDIT: J'arrive enfaite à 11,8 s en remplaçant:
Code:
ActiveSheet.Range(itext).Calculate
par:
Donc, le ratio passe à 672/11,8 = 57
L'application du "Autofill" couplé à "Calculate" et à ".Value = .Value" est 57 fois plus rapide !!! Et maintenant, la différence entre .Formula et .Formula + .Value est négligeable. Le .Value = .Value ne prends pas de temps de calcul.