IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Décaler l'affichage dans des labels toutes les semaines


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2012
    Messages : 143
    Points : 93
    Points
    93
    Par défaut Décaler l'affichage dans des labels toutes les semaines
    Bonsoir à tous,
    J'ai appris beaucoup de choses ici grace aux différentes aides que j'ai recues mais pour ce qui suit j'avoue que celà m'a surtout permis de finaliser mon programme saans comprendre comment ce code fonctionne.

    j'ai plusieurs labels les uns au dessus des autres qui recoivent chacun des noms puisés dans des cellules de la feuil1 et j'aimerais que chaque semaine les noms se décallent d'un cran?

    Que le nom du label 1 la premiere semaine passe dans le label 2 la seconde semaine, etc...
    Avec le code suivant celà fonctionne mais à l'envers. c'est à dire qu'au lieu de passer du label 1 au label2 en seconde semaine, lenom du label 1 passe dans le dernier le dernier label, le nom du label 2 passe dans le label 1, etc...
    En fait, ca remonte au lieu de descendre.

    Quelqu'un peut-il m'aiguiller? Je comprendrais également ainsi une partie de ce code.

    Voici la bête :

    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
    44
    45
    46
    47
    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 = .Range("A11")
        Nb = Val(.Range("B2"))
        If Nb > 1 Then
            Tb = .Range("E2").Resize(Nb, 1).Value
     
            Sem = DateDiff("ww", DteDeb, Date, vbMonday)
            Organise Tb, Sem
            For i = 1 To Nb
                Me.Controls("Label" & 9 * i - 7).Caption = Tb(i, 1)
            Next i
        Else
            Me.Label1.Caption = .Range("E2")
        End If
    End With
    End Sub
     
    Private Sub Organise(ByRef Tb, ByVal S As Integer)
    Dim Nb As Byte, i As Byte
    Dim Str As String
    Dim T As Integer
    Dim Tmp, Tablo
     
    Nb = UBound(Tb, 1)
    ReDim Tmp(1 To Nb)
    T = S Mod Nb
    If T > 0 Then
        For i = 1 To Nb
            Tmp(i) = IIf(i = T + 1, "@", "") & Tb(i, 1)
        Next i
     
        Str = Join(Tmp, "|")
        Tablo = Split(Str, "|@")
        Str = Tablo(1) & "|" & Tablo(0)
        Tablo = Split(Str, "|")
     
        For i = 1 To Nb
            Tb(i, 1) = Tablo(i - 1)
        Next i
    End If
    End Sub
    Merci par avance à ceux qui se pencheront sur mon probleme.

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Il suffit de remplacer la ligne 35 de ton code par celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Tmp(i) = IIf(i = Nb - T + 1, "@", "") & Tb(i, 1)

    Edit:

    Code entier commenté avec exemple
    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
    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
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2012
    Messages : 143
    Points : 93
    Points
    93
    Par défaut Fantastique
    Je te remercie beaucoup.
    Avec tes explications j'y vois plus clair et je comprend enfin l'intégralité de ce code.
    Vraiment merci, c'st trés sympa d'avoir pris le temps.
    Laurent

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Pour simplifier, la sub Organise peut être écrite comme ceci (sans gymnastique et d'ailleurs je ne sais pas pourquoi j'avais penser jongler comme le code précédent)
    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
    Private Sub Organise(ByRef LeTab, ByVal S As Integer)
    Dim Nb As Byte, i As Byte, j As Byte
    Dim T As Integer
    Dim Tmp() As String
     
    Nb = UBound(LeTab, 1)
    ReDim Tmp(1 To Nb)
    T = S Mod Nb
    If T > 0 Then
        j = Nb - T + 1
        For i = 1 To Nb
            Tmp(i) = LeTab(j, 1)
            j = j + 1
            If j > Nb Then j = 1
        Next i
     
        For i = 1 To Nb
            LeTab(i, 1) = Tmp(i)
        Next i
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] [VB2008] "Trier" des chars reçus et les afficher dans des labels
    Par rolf34 dans le forum VB.NET
    Réponses: 6
    Dernier message: 20/07/2011, 11h39
  2. Affichage des labels pour les courbes
    Par spakhen dans le forum iReport
    Réponses: 6
    Dernier message: 29/07/2009, 15h03
  3. mise à jour des données toutes les semaines...
    Par Toff !!!!! dans le forum Access
    Réponses: 20
    Dernier message: 22/12/2005, 11h38
  4. grouper des evenements toutes les 10 minutes
    Par aline dans le forum Oracle
    Réponses: 2
    Dernier message: 16/11/2005, 13h53
  5. Réponses: 3
    Dernier message: 05/05/2004, 00h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo