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 :

aide sur une macro masquer/afficher [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Ragnart
    Homme Profil pro
    Electricien
    Inscrit en
    Novembre 2013
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 99
    Par défaut aide sur une macro masquer/afficher
    Bonjour la communauté,
    j'ai une feuille de calcul comprenant 52 semaines à la verticale, j'ai une macro qui fonctionne très bien mais m'affiche quelques lignes en trop et je n'arrive pas à trouver l'erreur.
    voici une capture d'écran des semaines (pour mieux comprendre)
    Nom : Photo 1.PNG
Affichages : 250
Taille : 58,5 Ko

    voici la macro :
    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
    Sub masque_semaines()Const col_semaine As Byte = 2 'détermine la colonne contenant les N° de semaine, ici la col B
    Const nbligne_semaine As Byte = 15 'détermine le nbre de lignes pour afficher une semaine
        'on demande quelle est la semaine à traiter
        semaine = CDbl(InputBox("Merci d'indiquer le N° de semaine à faire afficher", "Saisie"))
        'début du tableau en ligne 1
        'desactivation de la mise à jour de l'écran pour execution plus rapide
        Application.ScreenUpdating = False
        ligne = 5
        'boucle jusqu'à la fin du tableau
        Do While Cells(ligne, col_semaine).Value <> 0
            'si c'est la bonne semaine on l'affiche
            If Cells(ligne, col_semaine).Value = semaine Then
                Cells(ligne, col_semaine).Rows("1:15").EntireRow.Hidden = False
            ' sinon on masque la ligne
            Else
                Cells(ligne, col_semaine).Rows("1:15").EntireRow.Hidden = True
            End If
            'passage à la ligne suivante
            ligne = ligne + nbligne_semaine
        Loop
        'réactivation de la mise à jour de l'écran
        Application.ScreenUpdating = True
    End Sub
    et voici une autre capture d'écran qui montre le résultat de la macro lorsqu'elle est exécutée : j'aimerai que les lignes 18 et 19 soit masquées je n'y arrive pas... merci pour votre aide
    Nom : photo 2.PNG
Affichages : 281
Taille : 48,1 Ko

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une autre solution qu'avec Do While à tester, notamment pour la semaine 52 suivant l'année.

    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
     
    Sub Masque_Semaines_EK()
     
    Dim LigneDeButTableau As Long
    Dim LigneFinTableau As Long
    Dim PremiereLigne As Long
    Dim DerniereLigne As Long
    Dim Semaine As Byte
    Dim I As Long
     
     
        'on demande quelle est la semaine à traiter
        Semaine = CDbl(InputBox("Merci d'indiquer le N° de semaine à faire afficher", "Saisie"))
     
        Application.ScreenUpdating = False
     
        With ActiveSheet
             .Rows.Hidden = False
             PremiereLigne = 4
             DerniereLigne = .Cells(.Rows.Count, 2).End(xlUp).Row + 5  ' Visiblement, il y a 5 lignes en dessous du dimanche
     
             LigneDeButTableau = 0
             For I = PremiereLigne + 1 To DerniereLigne '
                 If .Cells(I, 2) = Semaine Then
                    LigneDeButTableau = I - 1
                    LigneFinTableau = LigneDeButTableau + 14
                    Exit For
                 End If
             Next I
             If LigneDeButTableau > 0 Then
                Select Case LigneDeButTableau
                         Case 4
                             .Range(.Rows(LigneFinTableau + 1), .Rows(DerniereLigne)).Hidden = True
                         Case Else
                              .Range(.Rows(4), .Rows(LigneDeButTableau - 1)).Hidden = True
                              If Semaine < 52 Then
                                 .Range(.Rows(LigneFinTableau + 1), .Rows(DerniereLigne)).Hidden = True
                              End If
                 End Select
             End If
        End With
     
        'réactivation de la mise à jour de l'écran
        Application.ScreenUpdating = True
     
    End Sub
    Cordialement.

  3. #3
    Membre confirmé Avatar de Ragnart
    Homme Profil pro
    Electricien
    Inscrit en
    Novembre 2013
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 99
    Par défaut
    bonjour Eric,
    Merci pour le coup de main, ça fonctionne parfaitement ! c'est super sympa.
    J'aimerai comprendre le fonctionnement pas à pas de ta macro, si c'est possible bien sûr.
    je sais faire des macros basiques, celle-ci étant pour moi trop sophistiqué

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ragnart Voir le message
    J'aimerai comprends le fonctionnement pas à pas de ta macro, si c'est possible bien sûr.
    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
     
     Sub Masque_Semaines_EK()
     
    Dim LigneDeButTableau As Long
    Dim LigneFinTableau As Long
    Dim PremiereLigne As Long
    Dim DerniereLigne As Long
    Dim Semaine As Byte
    Dim I As Long
     
     
        'on demande quelle est la semaine à traiter
        Semaine = CDbl(InputBox("Merci d'indiquer le N° de semaine à faire afficher", "Saisie"))
     
        Application.ScreenUpdating = False
     
        With ActiveSheet
              ' On définit d'abord les limites de la recherche ( Première ligne, dernière ligne).
              ' On fait apparaître toutes les lignes, dans le cas où certaines sont déjà masquées.
             .Rows.Hidden = False
             PremiereLigne = 4
             DerniereLigne = .Cells(.Rows.Count, 2).End(xlUp).Row + 5  ' Visiblement, il y a 5 lignes en dessous du dimanche
     
             ' On recherche la ligne de la semaine choisie, sachant que le ligne de la semaine 1 est la première ligne + 1
             LigneDeButTableau = 0
             For I = PremiereLigne + 1 To DerniereLigne '
                 If .Cells(I, 2) = Semaine Then
                    ' Si la ligne de la semaine est trouvée, la première ligne du tableau correspond à la ligne trouvée - 1, et la ligne de fin à + 14 (1+14=15 lignes), et on quitte la boucle
                    LigneDeButTableau = I - 1
                    LigneFinTableau = LigneDeButTableau + 14
                    Exit For
                 End If
             Next I
     
             ' Si on a trouvé la ligne, alors on peut cacher les autres lignes
             If LigneDeButTableau > 0 Then
                ' On distingue le cas où la semaine est la semaine 1 du reste, car il n'y a rien à cacher avant.
                Select Case LigneDeButTableau
                         Case 4
                             .Range(.Rows(LigneFinTableau + 1), .Rows(DerniereLigne)).Hidden = True
                         Case Else
                              .Range(.Rows(4), .Rows(LigneDeButTableau - 1)).Hidden = True
                              ' Si la semaine est la dernière de l'année, il n'y a rien à cacher après.
                              If Semaine < 52 Then
                                 .Range(.Rows(LigneFinTableau + 1), .Rows(DerniereLigne)).Hidden = True
                              End If
                 End Select
             End If
        End With
     
        'réactivation de la mise à jour de l'écran
        Application.ScreenUpdating = True
     
    End Sub
    Cordialement.

  5. #5
    Membre confirmé Avatar de Ragnart
    Homme Profil pro
    Electricien
    Inscrit en
    Novembre 2013
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 99
    Par défaut
    Merci à toi Eric, c'est grâce à des personnes comme toi et tant d'autres,
    que nous, les débutants, pouvons perfectionner notre apprentissage.
    Merci encore Eric

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    un autre principe, inverse de celui déjà présenté, afin d'éviter les boucles chronophages et l'obligation d'appuyer sur un bouton :

    - créer une liste de validation permettant de choisir un chiffre entre 0 et 52
    - nommer la cellule
    - à chaque changement de la valeur de cette cellule (entre 0 et 52), il y aurait :

    ==> Si valeur = 0 : on affiche toute la feuille
    ==> Sinon : on masque TOUT et on n'affiche QUE la zone concernée


    tout ceci, directement dans l'évènement Change de la feuille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
    Const DEB_PLAGE As Long = 4
    Const TAILLE_SEM As Long = 14
    Const PLAGE_NOMMEE As String = "MaPlageNommee"
        If Not Intersect(Target, Range(PLAGE_NOMMEE)) Is Nothing Then
            If Target.Value > 0 Then
                Cells(DEB_PLAGE, 1).Resize(UsedRange.Rows.Count, 1).EntireRow.Hidden = True
                Cells(DEB_PLAGE + ((Target.Value - 1) * TAILLE_SEM), 1).Resize(TAILLE_SEM, 1).EntireRow.Hidden = False
            Else
                UsedRange.EntireRow.Hidden = False
            End If
        End If
    End Sub
    Dans cet exemple, la cellule a été nommée "MaPlageNommee"

  7. #7
    Membre confirmé Avatar de Ragnart
    Homme Profil pro
    Electricien
    Inscrit en
    Novembre 2013
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Electricien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 99
    Par défaut
    Salut Joé,
    une autre variante intéressante, qui peut servir, c'est toujours enrichissant de proposer plusieurs solutions, à chacun d'y trouver son besoin.
    en ce qui me concerne, je l'enregistre dans mon dossier "macro" merci Joé

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

Discussions similaires

  1. Aide sur une macro qui change la couleur de police
    Par bruxmu dans le forum VBA Word
    Réponses: 4
    Dernier message: 26/03/2020, 16h36
  2. [XL-2010] aide sur une macro de majoration automatique 5% par an
    Par chermiti10 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 14/04/2015, 09h49
  3. Besoin d'aide sur une macro
    Par kyros21 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/11/2011, 09h33
  4. [XL-2007] aide sur une macro
    Par ozaland dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/06/2011, 17h32
  5. petite aide sur une macro pour transfere de valeur
    Par fpouzou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/06/2007, 16h54

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