Somme incrémentale en VBA - Excel 2007

Résolu
Bonjour à tous ,

je voudrais réaliser une boucle en vba sou Excel 2007. Voici mon probleme :

Temps X F1 I

1 X1 F1 I1 = X1 * F1
2 X2 F2 I2 = X2 * F1 + X1 * F2
3 X3 F3 I3 = X3 * F1 + X2* F2 +X1 * F3
4 X4 F4 I4 = X4* F1 + X3 * F2 + X2* F2 + X1 * F4
... ... ... ...

Je voudrais calculé mes valeurs de I sur les 500 valeurs de temps.

Est ce que qqn pourrait me conseiller une boucle pour realiser cela?? ou autre chose .. car je m arrache les cheveux!! ...

merci!



--
Bienheureux ceux qui savent rire d'eux mêmes: ils n'ont pas finis de s'amuser!

8 réponses

  1. Contributeur
    Marqué comme résolu par Pyvoudelet le 16/02/2011 à 14:43

    Pyvoudelet ça te fatigue de dire merci ?
    1. EXCUSE MOI !!! J etais encore en train de teste ta solution que j essaye d adapter a mon cas!!
  2. Bonjour,

    Pas compris ce qu'étaient les valeurs de temps . (X1,X2...?)

    En supposant que l'on commence en ligne 1 et que les "X" sont en colonne A et les "F" en colonne B, le résultat est donné en colonne C.
    à adapter selon les besoins:

    PrecProd = 0
    
    For i = 1 To 500
        prod = Cells(i, 1).Value * Cells(i, 2).Value
        Cells(i, 3).Value = prod + PrecProd
        PrecProd = PrecProd + prod
    Next


    Bonne journée
    1. Contributeur
      Bonjour

      1/ta dernière ligne
      4 X4 F4 I4 = X4* F1 + X3 * F2 + X2* F2 + X1 * F4

      ne serait ce pas plutôt
      4 X4 F4 I4 = X4* F1 + X3 * F2 + X2* F3 + X1 * F4

      2/ Xn fn In : références de cellules? sinon ?

      Au besoin, mettre le classeur sans données confidentielles en pièce jointe (format XL97-2003) sur
      http://cijoint.fr/
      et coller le lien proposé dans le message de réponse
      1. Oui tu as raison Michel, je m étais trompé dans la formule.

        voici le lien pour le fichier d exemple http://www.cijoint.fr/cjlink.php?file=cj201102/cijgLulF1X.xls

        J ai don un tableau. je voudrais pouvoir calculer les valeur de I pour 2000 valeur. cC est une boucle a exécuter juste une fois (peut être éventuellement avec une commande bouton mais ça je peux m en charge).

        J arrive pas a recréer l itération incrémentale avec mes boucles. avez vous une idée?? j avais pensé à deux boucle For imbriquées...
    2. heu....

      en voyant la réponse de michel_m, je m'aperçois que ma réponse est complètement hors sujet !!!

      Je vais réapprendre à lire .
      1. Re,

        Si j'ai bien lu et tout compris 'cette fois) ça devrait être ça:

        For i = 1 To 500 
        
            temp = 0 
        
            For j = 1 To i 
                temp = temp + Cells(i + 1 - j, 1).Value * Cells(j, 2).Value 
            Next j 
             
            Cells(i, 3).Value = temp 
             
        Next i


        le tableau de valeurs commençant en ligne 1 colonnes A et B

        edit : pas vu le commentaire avant de poster, modifier boucle i=1 à 2000
        1. bonsoir

          reste a modifier les constantes

          http://www.cijoint.fr/cjlink.php?file=cj201102/cijMd9W1a7.xls

          bonne suite
          1. @paf

            desolé, pas vu le post 5
          2. est ce que ca va pas etre trop long pour 500 a 2000 itereation??
          3. re
            si,
            - donc comme le propose eriic, au post 9, il faut travailler en memoire
            - une autre proposition qui fait les 2000 itérations en moins de 1 s.
            RQ. s a été déclaré en double (precision) , le type (entier) long de mon post précédent n'est peut etre pas adapté

            Private Sub CommandButton1_Click()     
            Const lideb = 3     
            Const lifin = 2002     
            Const cox = "B"     
            Const cof = "C"     
            Const coi = "E"     
            Dim t As Long, j As Long, nbli As Long     
            Dim s As Double     
            Dim tx, tf, ti     
              tx = Range(cox & lideb & ":" & cox & lifin)     
              tf = Range(cof & lideb & ":" & cof & lifin)     
              ti = Range(coi & lideb & ":" & coi & lifin)     
              nbli = lifin - lideb + 1     
              For t = 1 To nbli     
                s = 0     
                For j = 1 To t     
                  s = s + tx(j, 1) * tf(t - j + 1, 1)     
                Next j     
                ti(t, 1) = s     
              Next t     
              Range(coi & lideb & ":" & coi & lifin).Value = ti     
            End Sub


            bonne suite
        2. Contributeur
          Bonsoir,

          Une autre proposition par fonction personnalisée, qui calcule en mémoire (plus rapide).
          Function SommeIncrementale(plage As Range) As Double 
              Dim datas(), lig As Long, derlig As Long 
              If plage.Columns.Count <> 2 Then SommeIncrementale = 0 
              datas = plage 
              derlig = UBound(datas) 
              For lig = 1 To UBound(datas) 
                  SommeIncrementale = SommeIncrementale + datas(lig, 1) * datas(derlig - lig + 1, 2) 
              Next lig 
          End Function

          Syntaxe :
          =sommeincrementale($B$3:$C4)
          $B$3:$C4 : plage des X,F
          à recopier vers le bas si besoin
          exemple : SommeIncrementale.xls

          eric

          PS: s'il faut systématiquement calculer toutes les valeurs on peut, toujours en travaillant en mémoire, le faire sous forme de sub ce qui sera encore plus rapide
          1. MErci a tous pour vos solutions, je vais voir celle que j arrive le mieux a adapter !