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
    1. EXCUSE MOI !!! J etais encore en train de teste ta solution que j essaye d adapter a mon cas!!
      0
  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
    0
    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
      0
      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...
        0
    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 .
      0
      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
        0
        1. bonsoir

          reste a modifier les constantes

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

          bonne suite
          0
          1. @paf

            desolé, pas vu le post 5
            0
          2. est ce que ca va pas etre trop long pour 500 a 2000 itereation??
            0
          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
            0
        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
          0
          1. MErci a tous pour vos solutions, je vais voir celle que j arrive le mieux a adapter !
            0