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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| Public varcol As Integer
Public Varfeuille As String, Lg As Integer
Public Tbl(), TblSdoub() 'variables tableau
Public Dl As Integer, x As Integer, y As Integer
Sub replan()
Dim i As Long, z As Integer, w As Integer
Dim Ws As Worksheet 'variable objet représentant une feuille
i = 0 'on initialise cette variable qui servira plus bas
Dl = 113 'j'imagine que tu resteras à 113 au maximum, vu la conception de tes feuilles
For y = 6 To Dl 'une boucle pour les lignes à analyser, on commence à 6 comme tes données
z = 2 'on initialise cette variable à la ligne 2 (pour les dates)
For Each Ws In Worksheets 'une boucle qui parcoure les feuilles triées ci-dessous
If Ws.Name Like "Prévi*" Then 'donc les feuilles "prévi", attention aux accents à respecter
For x = 10 To 49 Step 9 'boucle qui parcoure les colonnes avec une incrémentation de 9 (chaque tableau de dates
With Ws 'pour ne pas répêter "Ws"
If UCase(.Cells(y, x)) = "" And .Cells(y, x - 6) <> "" And CDate(.Cells(z, x - 7)) < Date And _
Trim(.Cells(y, x - 6)) <> "Ref" Then 'les conditions à respecter (pour Ucase et Trim, regardes l'aide)
i = i + 1 'si les conditions sont respectées, on incrémente i de 1
ReDim Preserve Tbl(1 To i) 'on redimensionne un tableau qui reprend les travaux non réalisés (donc au départ à 1)
Tbl(i) = .Cells(y, x - 7) & "|" & .Cells(y, x - 6) & "|" & .Cells(y, x - 5) & "|" & .Cells(y, x - 4) _
& "|" & .Cells(y, x - 3) & "|" & .Cells(y, x - 2)
'ci-dessus,on donne la valeur de la 1ère valeur et des suivantes quand i augmente de 1 (boucle), concrétement _
la 1ère valeur de tbl est égale à C,D,E,F,G,H séparés par "|" (j'évite les espaces pour les Splits qui vont venir _
(regardes l'aide pour Split)
z = z + 28 '+28 car, en vertical, on passe de 2 à 30
End If
End With
Next x
End If
Next Ws
Next y
z = 0 'on remet z à 0
For x = 1 To UBound(Tbl) - 1 'une boucle qui parcoure Tbl et compare chaque valeur à la valeur suivante, jusqu'à l'avant-dernière valeur
If Split(Tbl(x), "|")(1) <> Split(Tbl(x + 1), "|")(1) Then 'pour ne garder que des valeurs différentes
z = z + 1 'si différent, on incrémente z pour dimensionner TblSdoub car les tableaux à 2 dimensions ne peuvent _
être redimensionnés par la suite
End If
Next x
ReDim TblSdoub(1 To z + 1, 1 To 6) 'donc, on dimensionne, la 2ème dimension correspond aux colonnes
z = 0 'on remet z à 0, ça évite d'utiliser 36000 variables
For x = 1 To UBound(Tbl) - 1 'on reparcoure Tbl
If Split(Tbl(x), "|")(1) <> Split(Tbl(x + 1), "|")(1) Then 'pour ne garder que des valeurs différentes
z = z + 1 'si différent, on incrémente z
For w = 1 To 6 'une boucle pour chaque colonne sur 1 ligne
TblSdoub(z, w) = Split(Tbl(x), "|")(w - 1) 'comme je l'ai dit plus haut, voir l'aide pour Split
Next w
End If
Next x
For w = 1 To 6 'cette boucle est uniquement pour la dernière ligne du tableau
TblSdoub(UBound(TblSdoub, 1), w) = Split(Tbl(UBound(Tbl)), "|")(w - 1)
Next w
With Sheets("A replanifier")
Dl = .Range("A" & .Rows.Count).End(xlUp).Row
If Dl > 1 Then .Range("A2:F" & Dl).ClearContents 'on efface toutes les données
.Range("A2").Resize(UBound(TblSdoub, 1), 6) = TblSdoub 'et on affecte le nouveau résultat
End With
'voili, voilou
End Sub |
Partager