Rapport de message :*
 

Re: ecart

Titre du sujet : Re: ecart
par JeanMarie le 19/03/2012 20:27:18

 Bonsoir Mahelnawe, Didier, Le Forum

Ci-joint un code VBA qui traite une cellule colonne, il est facile de l'adapter pour traiter les 7 autres colonnes
Option Base 1

Sub Ecart()
'Déclaration des tableaux
Dim TabEcart() As Integer, TabArv() As Integer
'Déclaration des variables
Dim I As Integer, J As Integer, Z As Integer
Dim Connu As Boolean

'Calcul du dernier écart
'le tableau TabEcart est défini comme tableau à 3 colonnes
    'la première colonne contiendra la valeur de la cellule
    'la deuxième colonne contiendra le dernier écart connu suivant TabEcart(1,n)
    'la troisième colonne contiendra la dernière ligne connue suivant TabEcart(1,n)
   
'le tableau TabArv contiendra la position dans le quinté

'Remise à zéro des variables
ReDim TabEcart(3, 1)
Z = 0

'Récupération de données sur la feuille de calcul "stc"
With Worksheets("stc")
    'on commence à la ligne 3 jusqu'à la ligne ...
    For I = 3 To .Range("J65536").End(xlUp).Row
        Connu = False
        'on teste si la valeur de la cellule Cells(I,10) est déjà connu dans le tableau
        'la variable Z étant le nombre de valeurs uniques connues
        For J = 1 To Z
            If .Cells(I, 10) = TabEcart(1, J) Then
                Connu = True
                'Calcul de l'écart entre la nouvelle ligne et l'ancienne ligne conue de la valeur Cells(I, 10)
                TabEcart(2, J) = I - TabEcart(2, J)
                'Mémorisation de la ligne dans le tableau
                TabEcart(3, J) = I
                'on sort de la boucle
                Exit For
            End If
        Next J
        'Si la variable connu est false, la valeur Cells(I, 10) est une nouvelle valeur unique
        If Connu = False Then
            Z = Z + 1
            'ajout dans le tableau d'uan nouvelle ligne
            ReDim Preserve TabEcart(3, Z + 1)
            'mémorisation des valeurs dans le tableau
            TabEcart(1, Z) = .Cells(I, 10)
            TabEcart(2, Z) = 0
            TabEcart(3, Z) = I
        End If
       
        ReDim Preserve TabArv(I - 2)
        TabArv(I - 2) = -1
        'Cells(I, 10) est-il dans le quinté
        'on commence à la colonne 2, et sur 5 colonnes
        'l'index de ligne est donné par la valeur de la boucle principale
        For J = 2 To 6
            If .Cells(I, 10) = Worksheets("arv").Cells(I - 1, J) Then
                TabArv(I - 2) = J - 1
                Exit For
            End If
        Next J
    Next I
End With

'Calcul de l'écart pondéré entre l'écart et le quinté
With Worksheets("ect")
'on commence à la ligne 18 sur le nombre valeur connue dans TabArv
    For I = 18 To (UBound(TabArv) + 17)
        Cells(I, 6) = IIf(TabArv(I - 17) = -1, .Cells(I - 1, 6) - 1, TabArv(I - 17))
        For J = 1 To UBound(TabEcart())
            If TabEcart(1, J) = TabArv(I - 17) Then
                .Cells(I, 6) = .Celle(I, 6) + (TabEcart(2, J) / 100)
                Exit For
            End If
        Next J
    Next I
End With
End Sub
J'ai testé la macro, uniquement sur les valeurs de ton fichier, teste le STP.
J'espère qu'il n'y a pas trop de bêtises de dites, ou des abérations de programmation... étant plus un spécialiste dans les formules

@+Jean-Marie