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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| Option Explicit
Private Sub UserForm_Initialize()
Dim Nb As Byte, i As Byte
Dim Sem As Integer
Dim DteDeb As Date
Dim Tb
With Worksheets("Feuil1")
'DteDeb: Date de référence pour le déphasage des données des labels
DteDeb = .Range("A11")
'Nb: Nombre de noms
Nb = Val(.Range("B2"))
'Si on a plus d'un nom
If Nb > 1 Then
'Tb: variable tableau qui comporte la liste des noms! Resize signifie on agrandit la plage E2 par Nb lignes et 1 colonne.
Tb = .Range("E2").Resize(Nb, 1).Value
'Sem: Nombre de semaines à partir de la date de référence DteDeb (avec Lundi comme premier jour de la semaine)
Sem = DateDiff("ww", DteDeb, Date, vbMonday)
'On réorganise notre tableau Tb en fonction de la semaine
'Càd, on fait décaller les données
'Cf. xplication dans la procédure ci-après
Organise Tb, Sem
'Après réorganisation du tableau Tb, on affecte successivement ses valeurs au Labels respectifs
'1er élément dans Label2, 2ème élément dans Label11, 3ème en Label20....
For i = 1 To Nb
Me.Controls("Label" & 9 * i - 7).Caption = Tb(i, 1)
Next i
'Si on a un seul nom, on l'écrit directement dans Label2
Else
Me.Label2.Caption = .Range("E2")
End If
End With
End Sub
'Procédure qui réorganise les éléments de la variable en parametre LeTab
'LeTab est ByRef, c'est à dire les changements opérés au sein de la procédure sont répercutés sur LeTab
'Fais une recherche de la différence entre ByRef et ByVal
Private Sub Organise(ByRef LeTab, ByVal S As Integer)
Dim Nb As Byte, i As Byte
Dim Str As String
Dim T As Integer
Dim Tmp, Tablo
'Nb: nombre d'éléments du tableau LeTab (càd nombre de noms)
Nb = UBound(LeTab, 1)
'On redimensionne notre tableau temporaire Tmp à Nb éléments
ReDim Tmp(1 To Nb)
'S étant le nombre de semaines à partir de la date de référence
'on prend le modulo au cas où S>Nb pour avoir plusieurs cycles
T = S Mod Nb
'/!\ On suppose que LeTab={A1; A2; A3; A4; A5; A6; A7} et S=2
' On désire avoir le résultat suivant pour S=2 {A6; A7; A1; A2; A3; A4; A5}
'Si T =0 on ne fais rien, sinon
If T > 0 Then
'On remplit le tableau temporaire Tmp par les éléments de LeTab avec le Sème élément à partir de la fin conacéténé avec @
'Dans notre cas S=2 et Nb=7=> T=2
'Le 2ème avant drnier élément est Nb-T+1=6 càd A6
'Avec cette boucle on aura Temp={A1; A2; A3; A4; A5; @A6; A7}
For i = 1 To Nb
Tmp(i) = IIf(i = Nb - T + 1, "@", "") & LeTab(i, 1)
Next i
'Dans Str on joigne les éléments de Tmp avec | comme caractère de séparation
'On aura Str=A1|A2|A3|A4|A5|@A6|A7
Str = Join(Tmp, "|")
'Dans Tablo, on sépare le mot Str par rapport au caractère |@
'On aura dans Tablo, 2 éléments {A1|A2|A3|A4|A5; A6|A7}
Tablo = Split(Str, "|@")
'Dans Str on fait la concaténation du 2ème élément de Tablo et du premier séparés par |
'On aura dans Str: A6|A7|A1|A2|A3|A4|A5
Str = Tablo(1) & "|" & Tablo(0)
'On sépare une dernière fois le mot Str par rapport au caractère |
'On aura dans Tablo, nos 7 éléments réorganises comme voulu {A6; A7; A1; A2; A3; A4; A5}
Tablo = Split(Str, "|")
'Enfin on modifie notre tableau d'origine LeTab
'LeTab est dimensionné (1 to Nb, 1 to 1) alors que Tablo(0 to Nb-1)
'd'où l'indice
For i = 1 To Nb
LeTab(i, 1) = Tablo(i - 1)
Next i
End If
End Sub |
Partager