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 des colonnes selon critères


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2012
    Messages : 20
    Points : 16
    Points
    16
    Par défaut Cacher des colonnes selon critères
    Bonjour,

    J'ai une feuille Excel ou j'ai les notes d'élèves par matières. je souhaite créer un champs de recherche au niveau de A1:B3, lancer un bouton (ou appuyer tout simplement sur Entrée) afin de cacher toutes les colonnes qui ne correspondent pas à ma recherche. Est ce que c'est faisable?

    Ci-joint mon fichier Excel pour exemple.

    Je vous remercie par avance,
    Cdlt
    Fichiers attachés Fichiers attachés

  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
    Mets ce code dans le module de ta feuille
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim n As Integer
    Dim c As Range
     
    Application.ScreenUpdating = False
    'Si l'une des cellules B1:B3 est modifiée
    If Not Intersect(Target, Range("B1:B3")) Is Nothing Then
        'On affiche toutes les colonnes
        UsedRange.EntireColumn.Hidden = False
        'n: Nombre de colonnes
        n = UsedRange.Columns.Count - 4
        'Pour chaque cellule de la ligne 7
        For Each c In Range("E7").Resize(1, n)
            'Si B1 est non vide et B1<> la cellule de la ligne 7: Nom
            'OU
            'Si B2 est non vide et B2<> la cellule de la ligne 8: matière
            'OU
            'Si B3 est non vide et B3<> la cellule de la ligne 12: note
            'Alors on cache la colonne
            c.EntireColumn.Hidden = (c <> Range("B1") And Range("B1") <> "") Or (c.Offset(1, 0) <> Range("B2") And Range("B2") <> "") Or (c.Offset(5, 0) <> Range("B3") And Range("B3") <> "")
        Next c
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Mercatog m'a devancé.
    Voici une autre solution avec un tableau commençant en A1 contenant les données générales et devant rester visible, et à partir des colonnes B et suivantes le nom des libellés Matières (Par exemple Excel, Word etc ...).
    Les cellules A1:XX1 sont nommées lstMat
    En A25 une cellule Validation de données - Liste faisant références à lstMat
    Si l'on sélectionne dans la liste le titre se trouvant en A1, toutes les colonnes s'affichent si l'on sélectionne un autre éléments de la liste la colonne A et la colonne correspondant au choix s'affiche
    Code à placer dans le module de la feuille contenant le tableau
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
     Const addr As String = "$A$25"
     If Target.Address = addr Then
      Dim position As Byte
      Columns.EntireColumn.Hidden = True
      Columns("A").EntireColumn.Hidden = False
      position = Application.WorksheetFunction.Match(Range(addr), Range("lstMat"), 0)
      Select Case position
       Case Is > 1
        Columns(position).EntireColumn.Hidden = False
       Case Else
        Columns.EntireColumn.Hidden = False
      End Select
      Range("A1").Show
     End If
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2012
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Merci Mercatog et Corona pour vos reponses rapides.

    J'ai oublie de specifier que mon champs de criteres est plutot D1 : D3 et que les colonnes: B, C sont cachees ainsi que les lignes 7 et 8. (et je souhaite qu'elle reste cachees)

    J'ai change cela dans le code de Mercatog mais je recois erreur 1004.

    Merci pour l'aide

  5. #5
    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
    Adapte la constante Debut

    Dans l'exemple, la première cellule comportant les nom est E7, la matière en E8 et la note en E12
    La 2ème cellule comportant le 2ème nom en F7, la matière en F8 et la note en F12...etc
    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 Worksheet_Change(ByVal Target As Range)
    Const Debut As String = "E7"                       'Adapte l'adresse de la première cellule des nom
    Dim n As Integer
    Dim c As Range
     
    Application.ScreenUpdating = False
    If Not Intersect(Target, Range("D1:D3")) Is Nothing Then
        UsedRange.EntireColumn.Hidden = False
        n = UsedRange.Columns.Count - Range(Debut).Column + 1
        If n > 0 Then                                  'Par précaution
            For Each c In Range(Debut).Resize(1, n)
                c.EntireColumn.Hidden = (c <> Range("D1") And Range("D1") <> "") Or (c.Offset(1, 0) <> Range("D2") And Range("D2") <> "") Or (c.Offset(5, 0) <> Range("D3") And Range("D3") <> "")
            Next c
        End If
        Range("B1:C1").EntireColumn.Hidden = True
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2012
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    La feuille etait protegee d'ou le pbm. Run-time error ‘1004’
    Unable to set the Hidden property of the Range class

    J'ai cree une nouvelle feuille et le code marche maintenant. Par contre: si je saisie MAXIME au lieu de Maxime la procedure ne trouve rien.

    Est ce que c'est possible de saisir le nom que ca soit en majiscule ou minuscule ou juste un bout dans le champs des criteres pour que la procedure retourne quelquechose?

    ou si cela ne marche pas, est ce que c'est possible de faire plutot des listes deroulantes pour les criteres en D1 : D3

    Merci,

  7. #7
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                c.EntireColumn.Hidden = (UCase(c) <> UCase(Range("D1")) And Range("D1") <> "") Or (UCase(c.Offset(1, 0)) <> UCase(Range("D2")) And Range("D2") <> "") Or (c.Offset(5, 0) <> Range("D3") And Range("D3") <> "")
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2012
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Merci Mercatog ca marche tres bien. Sinon est ce que c'est possible de faire des listes deroulantes a la place?

    Merci

  9. #9
    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
    Oui, absolument et c'est même conseillé d'utiliser des listes de validation en D1: D3
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Citation Envoyé par Charlesraheb Voir le message
    Merci Mercatog ca marche tres bien. Sinon est ce que c'est possible de faire des listes deroulantes a la place?
    Merci
    C'est ce que j'avais d'ailleurs suggéré dans mon intervention
    Citation Envoyé par corona Voir le message
    Bonjour,
    Mercatog m'a devancé.
    Voici une autre solution avec un tableau commençant en A1 contenant les données générales et devant rester visible, et à partir des colonnes B et suivantes le nom des libellés Matières (Par exemple Excel, Word etc ...).
    Les cellules A1:XX1 sont nommées lstMat
    En A25 une cellule Validation de données - Liste faisant références à lstMat
    Si l'on sélectionne dans la liste le titre se trouvant en A1, toutes les colonnes s'affichent si l'on sélectionne un autre éléments de la liste la colonne A et la colonne correspondant au choix s'affiche
    Code à placer dans le module de la feuille contenant le tableau
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
     Const addr As String = "$A$25"
     If Target.Address = addr Then
      Dim position As Byte
      Columns.EntireColumn.Hidden = True
      Columns("A").EntireColumn.Hidden = False
      position = Application.WorksheetFunction.Match(Range(addr), Range("lstMat"), 0)
      Select Case position
       Case Is > 1
        Columns(position).EntireColumn.Hidden = False
       Case Else
        Columns.EntireColumn.Hidden = False
      End Select
      Range("A1").Show
     End If
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Membre à l'essai
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2012
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Je vous remercie tous les deux pour votre aide precieuse. Derniere question: J'ai fait la meme chose mais cette fois sur les lignes. A savoir je souhaite filtrer ma feuille selon le champs C2 (Matiere), les matieres etant dans la colonne A a partir de la cellule A5. Je veux cacher toutes les lignes qui ne correspondent pas à ma recherche. PBM, j'ai des graphs partout dans ma feuilel excel et quand je souhaite executer la macro ca rame et l'excel bug. Comment je peux resoudre ce probleme?

    Voila pour le code de Mercatog applique a mon cas:

    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
    Sub Worksheet_Change(ByVal Target As Range)
    Const Debut As String = "A5"
    Dim n As Integer
    Dim c As Range
     
    Application.ScreenUpdating = False
    If Not Intersect(Target, Range("C2")) Is Nothing Then
        UsedRange.EntireRow.Hidden = False
        n = UsedRange.Rows.Count - Range(Debut).Row + 1
        If n > 0 Then                                  'Par précaution
            For Each c In Range(Debut).Resize(n, 1)
                'c.EntireColumn.Hidden = (c <> Range("D1") And Range("D1") <> "") Or (c.Offset(1, 0) <> Range("D2") And Range("D2") <> "") Or (c.Offset(7, 0) <> Range("D3") And Range("D3") <> "")
                c.EntireRow.Hidden = (UCase(c) <> UCase(Range("C2")) And Range("C2") <> "")
            Next c
        End If
        'Range("A1").EntireRow.Hidden = True
    End If
    End Sub
    Je vous remercie par avance pour l'aide,

    A+

Discussions similaires

  1. Masque des colonnes selon certains critères sans les filtres
    Par CLAUDE19 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/10/2011, 17h23
  2. Réponses: 1
    Dernier message: 04/11/2010, 13h10
  3. [XL-2003] Cacher des colonnes selon le mois en cours
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/04/2009, 10h05
  4. affichage des champs selon critère dans un formulaire
    Par emmablue dans le forum Access
    Réponses: 5
    Dernier message: 31/07/2006, 09h39
  5. [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