Un vrai défi (enfin, pour moi) !

elmomo

XLDnaute Nouveau
Bonjour,

Voici une question pour les torturés de la macro, pour les artistes du vba, pour les magiciens d'excel.

Vous trouverez ci joint un tableau. Sauf qu'il est trop gros.... D'un côté, une dizaine de séries discontinues, de l'autre, leur retraitement. (j'ai enlevé les valeurs mais la macro tourne toujours, j'ai réduit à 3 séries pour que le fichier passe...)

Ma macro (module1) fonctionne jusqu'à un certain point : elle agrège effectivement les données sans trop de problèmes.

Ce qui est plus difficile, c'est le retraitement. Car j'aurais besoin d'un retraitement rétroactif, cad que les 1eres valeurs soient retraitées selon la moyenne des écarts sur tout le tableau et les dernières seulement par la fin du tableau.

Je m'explique : dans ma série agrégée, il y a des "sauts" que j'ai repérés lorsqu'il y a des écarts de plus de 5%

Admettons qu'il y ait 2 sauts, un à la ligne 65 et un 2eme à la ligne 120.

Dans ce cas, on calcule pour chacune de ses occurrences un coefficient "value" qui est égal au rapport des 3 valeurs suivantes sur les 3 précédentes.

Ensuite, il faut multiplier les valeurs agrégées par ce coefficient, mais pas de n'importe quelle manière.

Il faut multiplier la série entière par valeur(65)*valeur(120), entre les lignes 65 et 120 par valeur(120) et après par 1 (ne rien toucher).

Voila le principe, mais moi j'ai 11 sauts^^.

J'ai pas mal fouillé, voir le code.

Je remercie quiconque aura l'amabilité de se prendre la tête la dessus.Peut etre un regard frais fera-t-il du bien (je suis dessus depuis un moment...).

Merci encore...

Pour réduire le volume du fichier, je joins le code ici :

Sub Retraitement_itrxxo()

'permet de partir d'un tableau avec
'plusieurs colonnes pur finir avec un tableau avec une seule colonne

'A inputer à la main (mesures du tableau): a=1ere ligne ; col=1ere colonne ; colmax = derniere colonne
'i doit aller de 1ere ligne a derniere ligne
'copycol est le num de colonne ou copier

Dim a As Integer, col As Integer, i As Integer, colmax As Integer, copycol As Integer, nbligne As Integer, j As Integer, k As Integer, b As Integer
Dim valeur As Variant, correction As Variant, value As Variant

a = 9
col = Range("a1").Column
colmax = Range("c1").Column
copycol = Range("n1").Column
nbligne = Cells(a, colmax).End(xlDown).Row - a
j = 1
b = nbligne - a
correction = 1

Cells(2, copycol) = nbligne
col = col + 1




For i = 1 To nbligne





'de la 1ere a l'avant derniere colonne
If col < colmax + 1 Then
Do While WorksheetFunction.IsNA(Cells(a, col))
valeur = Cells(a, col).Offset(0, -1)

'permet de copier/coller les #N/A
If WorksheetFunction.IsNA(Cells(a, col).Offset(0, -1)) Then
valeur = CVErr(xlErrNA)
End If

Cells(a, copycol) = valeur
a = a + 1
Loop

col = col + 1

Else
'pour la derniere colonne
valeur = Cells(a, colmax)
Cells(a, copycol) = valeur
a = a + 1

End If


If Cells(a, copycol) > 1.05 * Cells(a - 1, copycol) Or Cells(a, copycol) < 0.95 * Cells(a - 1, copycol) Then

value = (Cells(a, copycol) + Cells(a + 1, copycol) + Cells(a + 2, copycol)) / (Cells(a, copycol) + Cells(a - 1, copycol) + Cells(a - 2, copycol))
Range("q1") = value
Range("q2") = b
Range("q3") = a
Range("q4") = correction
correction = value * correction
End If


For k = a To b
Cells(k, copycol + 1) = correction * Cells(k, copycol)
b = nbligne - a
Next k




'If Cells(a, copycol) > 1.05 * Cells(a - 1, copycol) Then
'Cells(a, copycol + 1) = Cells(a - 1, copycol) * 1.01
'End If
'If Cells(a, copycol) < 0.95 * Cells(a - 1, copycol) Then
'Cells(a, copycol + 1) = Cells(a - 1, copycol) * 0.99
'End If

'ElseIf 0.95 * Cells(a - 1, copycol) < Cells(a, copycol) < 1.05 * Cells(a - 1, copycol) Then
'Cells(a, copycol + 1) = Cells(a, copycol)


Next i





End Sub
 

Pièces jointes

  • Book1.zip
    17.9 KB · Affichages: 23
  • Book1.zip
    17.9 KB · Affichages: 23
  • Book1.zip
    17.9 KB · Affichages: 22
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 664
Messages
2 090 676
Membres
104 633
dernier inscrit
benabidwajih