Bonjour,
suite à un problème de reclassement de données, on m'a proposé via le forum une macro VBA fonctionnelle (et dans un temps record ! - encore merci Mercatog !) qui m'a facilité la vie.
La voici (légèrement remaniée pour qu'elle colle à mes données) :
Malheureusement, il me reste encore un problème que je ne parviens à résoudre (et qui provient de toute évidence de mon ignorance en termes de syntaxe VBA)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33
34
35
36
37
38
39 Sub ReclassementData() Dim LastLig As Long, i As Long, j As Long Dim N As Long, M As Long, Nb As Long Dim k As Byte Dim Tb, Res() Application.ScreenUpdating = False ActiveSheet.Name = "Feuil1" Sheets.Add After:=ActiveSheet With Worksheets("Feuil1") LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row N = 20 If N > 0 Then M = Application.Max(.Range("B2:B" & LastLig)) Nb = M / N + 1 Tb = .Range("A2:P" & LastLig) ReDim Res(1 To Nb, 1 To 14) For i = 1 To Nb Res(i, 1) = N * (i - 1) For j = 1 To LastLig - 1 If Res(i, 1) >= Tb(j, 1) And Res(i, 1) <= Tb(j, 2) Then For k = 2 To 14 If Res(i, k) = "" And Tb(j, k + 2) <> "" Then Res(i, k) = Tb(j, k + 2) Next k End If Next j Next i End If With Sheets("Feuil2").Range("A1") .Resize(1, 14) = Array("Temps", "Var1", "Var2", "Var3", "Var4", "Var5", "Var6", "Var7", "Var8", "Var9", "Var10", "Var11", "Var12") .Offset(1).Resize(Nb, 14) = Res End With End With End Sub
Il me faut aller en réalité plus loin dans l'adaptation de cette macro, de façon à ce qu'elle s'applique à des tableaux de départ où les nombres de colonnes (variables) peuvent différer.
J'ai donc tenté différentes manière d'implémenter un "LastCol" (voir définition exacte dans le code ci-dessous) pour prendre en compte la dernière colonne dans les différentes formules du code. Mais rien n'y fait...
Voici la dernière version du code (qui bloque à partir de la définition du Tb, dans la boucle If, avec une erreur 1004 - Erreur définie par l'application ou par l'objet) :
Je vous remercie pour toute suggestion ou éléments de syntaxe qui pourraient me sortir de ce mauvais pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33
34
35
36
37
38
39
40
41
42
43 Sub NEWReclassementData() Dim LastLig As Long, i As Long, j As Long Dim N As Long, M As Long, Nb As Long Dim k As Byte Dim Tb, Res() Dim LastCol As Long Application.ScreenUpdating = False ActiveSheet.Name = "Feuil1" Sheets.Add After:=ActiveSheet With Worksheets("Feuil1") LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row LastCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column N = 20 If N > 0 Then M = Application.Max(.Range("B2:B" & LastLig)) Nb = M / N + 1 Tb = .Range(Cells(2, 1), Cells(LastLig, LastCol)) ReDim Res(1 To Nb, 1 To LastCol - 2) '--> Je souhaite utiliser un LastCol - 2, car les deux premières colonnes de "Feuil1" ne sont pas concernées par le reclassement For i = 1 To Nb Res(i, 1) = N * (i - 1) For j = 1 To LastLig - 1 If Res(i, 1) >= Tb(j, 1) And Res(i, 1) <= Tb(j, 2) Then For k = 2 To LastCol - 2 If Res(i, k) = "" And Tb(j, k + 2) <> "" Then Res(i, k) = Tb(j, k + 2) Next k End If Next j Next i End If With Sheets("Feuil2").Range("A1") .Resize(1, LastCol - 2) = Array(Range(Worksheets("Feuil1").Cells(1, 3), Worksheets("Feuil1").Cells(1, LastCol))) .Offset(1).Resize(Nb, LastCol - 2) = Res .Range("A1").Select End With End With End Sub
Cordialement,
PS : A toutes fins utiles, je peux joindre un fichier de données en exemple...
Partager