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 :

Cacher les colonnes par 2, sous condition. [XL-2019]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2018
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 82
    Par défaut Cacher les colonnes par 2, sous condition.
    Bonsoir,

    Je tente de faire une macro, une boucle qui check si ma cellule = 0 et qui cache deux colonnes si c'est le cas : la colonne de la cellule concernée par zéro et la colonne de la cellule concernée par zéro +1. Il n'y a pas de fusions de cellule de mon tableau.

    Par exemple, lorsque J3=0 (il ne s'agit pas de fusion de cellule J3 et K3, mais d'une mise en forme soit un alignement horizontal centré sur plusieurs colonnes) alors cacher la colonne J et K.

    Nom : CODE.PNG
Affichages : 187
Taille : 11,6 Ko

    La macro ci-dessous permet de cacher seulement les colonnes dont la cellule de ligne est = 0 de tout le tableau (soit seulement la colonne J dans mon extrait visuel au lieu de J et K)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Masque_Click()
        Dim rng As Range
        For Each rng In [F3:AG3]
            If rng.Value = 0 Then rng.EntireColumn.Hidden = Not rng.EntireColumn.Hidden
        Next rng
    End Sub
    Merci d'avoir pris le temps de me lire. Quelqu'un à une solution à me proposer ?

  2. #2
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Bonjour,

    Une proposition simple. D'abord afficher toutes les colonnes masquées puis trouver le nombre de colonnes maximum (donc tu peux même en ajouter ou supprimer si besoin) puis faire le test = 0 pour masquer la paire de colonnes.
    On pourrait bien sûr faire différemment avec Range, masquer les 2 colonnes en même temps, ... J'ai fait au plus simple.

    Un point; je n'ai pas inclus dans le code des contrôles de typage de valeur ou d'erreur Excel. Tes valeurs en ligne 3 ne doivent donc pas être en erreur "#N/A" par exemple. Si besoin pense à ajouter ces contrôles.

    A noter que pour éviter toute erreur de feuille de travail il faudrait préciser la feuille à chaque action du code ("activesheet." pour la feuille ouverte, "sheets.("nom_feuille")" pour une feuille quelconque).

    A noter aussi que j'ai figé l'écran avec "Application.ScreenUpdating" alors pense à le défiger en cas d'erreur en cours de 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Dim nbre_colonnes_max As Long
    Dim colonne_cours As Long
     
    'Figer écran
    Application.ScreenUpdating = False
     
    'tout démasquer
    Columns.EntireColumn.Hidden = False
     
    'trouver nbre colonnes max
    nbre_colonnes_max = Range("XFD3").End(xlToLeft).Column
     
    'si nbre colonnes max > 3 (puisque les colonnes 1 à 3 sont des en-têtes)
    If nbre_colonnes_max > 3 Then
     
        'parcourir 1 colonne sur 2 à partir de la colonne 4
        For colonne_cours = 4 To nbre_colonnes_max Step 2
     
            'tester si 0
            If Cells(3, colonne_cours) = 0 Then
     
                'masquer colonne en cours de test
                Columns(colonne_cours).EntireColumn.Hidden = True
     
                'masquer colonne suivante
                Columns(colonne_cours + 1).EntireColumn.Hidden = True
     
            End If
     
        Next colonne_cours
     
    End If
     
    'Défiger écran
    Application.ScreenUpdating = True
     
    End Sub
    Teste et dis nous.

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2018
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 82
    Par défaut
    J'ai un bien galéré mais je n'avais pas réadapté votre code à mes changements entre temps.. quel sot je suis ! C'est donc un perfect pour vous merci.

    Je ne comprend pas à quoi fait référence XFD3 dans la ligne 11, il s'agit d'une cellule éloignée pour y saisir nbre_colonnes_max ?

  4. #4
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    C'est l'idée oui: trouver le nombre de colonnes max. Mais non pas par saisie utilisateur. C'est automatique.

    XFD3 est la référence de cellule la plus à droite de la ligne 3.
    Le reste de cette ligne de code permet de décaler à gauche pour trouver le numéro de la dernière colonne non vide.
    Ainsi tu peux ajouter ou supprimer des paires de colonnes à masquer ou afficher.

  5. #5
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 288
    Par défaut
    Salut
    Au lieu de chercher à masquer des colonnes je me serai plus tôt amusé à en créer 2 selon besoin du moment.
    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
    Sub test()
    Dim rngFrom As Range, rngTo As Range, rngNewStr As Range
    Dim newStr As String
    Dim iCols As Long, iRows As Long
     
    iRows = Worksheets(1).Range("A3").CurrentRegion.Rows.Count
    iCols = Worksheets(1).Range("A3").CurrentRegion.Columns.Count
     
    Set rngFrom = Worksheets(1).Range(Cells(1, iCols).Offset(0, -1), Cells(iRows, iCols).Offset(2))
    Set rngTo = Worksheets(1).Cells(1, iCols).Offset(0, 1)
    rngFrom.Copy Destination:=rngTo
     
    Set rngNewStr = Worksheets(1).Cells(3, iCols).Offset(0, -1)
    newStr = Mid(rngNewStr.Value, 1, 3) & Format(GetNumeric(Worksheets(1).Cells(3, iCols).Offset(0, -1)) + 1, "00")
     
    Worksheets(1).Cells(3, iCols).Offset(0, 1).Value = Mid(rngNewStr.Value, 1, 3) & Format(GetNumeric(Worksheets(1).Cells(3, iCols).Offset(0, -1)) + 1, "00")
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function GetNumeric(CellRef As String)
    Dim StringLength As Integer
     
    StringLength = Len(CellRef)
    For i = 1 To StringLength
        If IsNumeric(Mid(CellRef, i, 1)) Then Result = Result & Mid(CellRef, i, 1)
    Next i
    GetNumeric = Result
    End Function

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/10/2015, 19h58
  2. Réponses: 5
    Dernier message: 17/02/2015, 19h14
  3. Cacher les détails d'un sous formulaire
    Par momowell dans le forum IHM
    Réponses: 2
    Dernier message: 07/07/2007, 15h39
  4. [VB6] Datagrid afficher ou cacher des colonnes par code
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 06/02/2003, 17h19

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