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 :

masquer les colonnes dont toutes les cellules VISIBLES ont leur valeur="N"


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Points : 39
    Points
    39
    Par défaut masquer les colonnes dont toutes les cellules VISIBLES ont leur valeur="N"
    Bonjour,

    aujourd'hui j'essaie de faire la macro suivante sous Excel 2003 (en gros on l'executerait apres avoir applique un filtre auto manuellement sur l'une des colonnes):

    --> masquer les colonnes dont toutes les cellules VISIBLES ont leur valeur="N" (dans le range N2:EK400)

    Mon bout de code est le suivant:

    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
    'Sub MasquerColonnesVidesTest()
     
    'Dim Plage As Range
    'Dim c As Range
     
    'On Error Resume Next
     
    'With ActiveSheet
     
     
    'Set Plage = .Range("N2:EK400")
     
    '    For Each c In Plage
    '        If c.Value = "N" Then Selection.EntireColumn.Hidden = True
    '    Next c
     
     
    'End With
     
    'End Sub
    J'ai essayé plusieurs bouts de code trouvés sur internet mais je n'ai pas encore trouvé ma combinaison pour que ça fonctionne pour mon cas).

    Merci de votre aide!!
    Sylvaine

  2. #2
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,
    essayes comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub MasquerColonnesVidesTest()
    Dim Plage As Range
    Dim c As Range
    On Error Resume Next
    With ActiveSheet
        Set Plage = .Range("N2:EK400")
        For Each c In Plage
            If c.Value = "N" Then c.Columns.EntireColumn.Hidden = True
        Next c
    End With
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Points : 39
    Points
    39
    Par défaut
    Merci pour ton aide. On y est Presque!
    J'ai bien vu les lignes en train d'etre parcourues mais Excel a eu l'air de tourner en boucle et s'est planté.
    Je vais regarder encore ce qui se passe.
    ce qui me pose surtout la difficulté pour moi c'est de dire "toutes les cellules dont la valeur est égale à "N" et qui sont affichées actuellement" (donc celles que le filtre auto a épargnées)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Points : 39
    Points
    39
    Par défaut
    Les nouvelles:

    finalement Excel n'est plus planté.
    Le résultat: est inversé:
    Toutes les lignes et toutes les colonnes ont été masquées

    Je vais encore investiguer un peu en repartant sur la base de ta proposition

    Est-ce que cela signifie que Column serait une propriété de c (et c serait une cellule ou une plage? mais si c'est une plage elle ne peut pas avoir la valeur N, n'est ce pas?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.Columns.EntireColumn.Hidden

  5. #5
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Je regrette, j'ai testé le code et il fonctionne. Dans ton cas "C" est une cellule range => variable range.
    il faudrait voir ton fichier
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Points : 39
    Points
    39
    Par défaut
    En fait, apres avoir mieux observé, je vois que ça ne masque pas "tout" - ça masque toutes les colonnes.
    Mais ton aide m'est déjà précieuse, je vais avancer un petit peu et je verrai demain si je n'ai pas trouvé de solution (je suis un peu lente car je fais d'autres choses en meme temps)
    Encore merci

  7. #7
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Code amélioré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub MasquerColonnesVidesTest()
    Dim Plage As Range
    Dim c As Range
    With ActiveSheet
        Set Plage = .Range("N2:EK400")
        For Each c In Plage
            If c.Value = "N" Then
                c.Columns.EntireColumn.Hidden = True
                Set Plage = .Range(Cells(2, c.Column + 1).Address, "EK400") ' passe à la colonne suivante
            End If
        Next c
    End With
    End Sub
    le "N" est'il toujours en majuscule ?, si oui, code ci-dessus, si non code ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub MasquerColonnesVidesTest()
    Dim Plage As Range
    Dim c As Range
    With ActiveSheet
        Set Plage = .Range("N2:EK400")
        For Each c In Plage
            If UCase(c.Value) = "N" Then
                c.Columns.EntireColumn.Hidden = True
                Set Plage = .Range(Cells(2, c.Column + 1).Address, "EK400") ' passe à la colonne suivante
            End If
        Next c
    End With
    End Sub
    si la cellule commence par N ou n, ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub MasquerColonnesVidesTest()
    Dim Plage As Range
    Dim c As Range
    With ActiveSheet
        Set Plage = .Range("N2:EK400")
        For Each c In Plage
            If UCase(c.Value) Like "N*" Then
                c.Columns.EntireColumn.Hidden = True
                Set Plage = .Range(Cells(2, c.Column + 1).Address, "EK400") ' passe à la colonne suivante
            End If
        Next c
    End With
    End Sub
    si la cellule contient N ou n
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub MasquerColonnesVidesTest()
    Dim Plage As Range
    Dim c As Range
    With ActiveSheet
        Set Plage = .Range("N2:EK400")
        For Each c In Plage
            If UCase(c.Value) Like "*N*" Then
                c.Columns.EntireColumn.Hidden = True
                Set Plage = .Range(Cells(2, c.Column + 1).Address, "EK400") ' passe à la colonne suivante
            End If
        Next c
    End With
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Points : 39
    Points
    39
    Par défaut
    Mon "N" est toujours en majuscule
    Je teste le code du dessus.

    Alors: Excel a masqué encore pas mal de colonnes.. Il me semble qu'il masque une colonne quand elle contient un N et non quand elle ne contient Que des N mais je n'en suis pas certaine car le tout se plante et je dois fermer Excel pour le réouvrir.

    Est-ce que ça serait plus simple si je commencais par remplacer les N par des vides, puis que je masquais "les colonnes vides" (toujours sur les cellules affichées seulement)?

    Sachant que quand toutes les données sont affichées, aucune colonne ne con tient que des "N" il ya toujours un O quelque part dans une colonne
    C'est apres avoir posé un filtre auto qu'on voit apparaitre seulement des N ds certaines colonnes et c'est à ce moment là que le besoin est de les masquer (car il y a beaucoup de colonnes pour le faire à la main).

    Je dois travailler un peu sur un autre truc mais je reviendrai voir le post!! et encore un grand merci

  9. #9
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Si tu veux masquer des colonnes de N2 à EK400 dont des cellules contiennent uniquement la lettre N, mon dernier code doit fonctionner, soit celui-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub MasquerColonnesVidesTest()
    Dim Plage As Range
    Dim c As Range
    With ActiveSheet
        Set Plage = .Range("N2:EK400")
        For Each c In Plage
            If c.Value = "N" Then
                c.Columns.EntireColumn.Hidden = True
                Set Plage = .Range(Cells(2, c.Column + 1).Address, "EK400") ' passe à la colonne suivante
            End If
        Next c
    End With
    End Sub
    si ce code ne te satisfait pas, envoies un fichier exemple pour voir là où ça pêche
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Points : 39
    Points
    39
    Par défaut
    Alors...
    Je vais insérer des images de capture d'Excel, j'ai fait des exemples car mon fichier a trop de colonnes, trop de lignes...
    O=oui et N=non en fait, c'est rempli par un script en Perl que je ne maitrise pas encore, mais le fichier Excel "m'appartient" donc s'il faut passer par la case remplacer les N par des zéro ou carrément par une cellule vide, aucun souci.

    Voici le fichier de base:



    Voici ce qui devrait apparaitre lorsqu'on filtre sur le champ Fonction et que ensuite, on lance le fameux code qui me pose probleme (lancé par macro)







    Ou encore ce qui devrait apparaitre apres execution du code, si on n'a pas appliqué de filtre automatique avant de l'executer. (Dans les 4 dernieres photos on voit que des colonnes ont disparu et que ce ne sont pas les memes)

    J'ai l'impression qu'il parcourt toutes les lignes du fichier au lieu de seulement celles qui sont affichées par le filtrage (car l'éxécution parait tres longue, or en general je n'ai pas plus de 20 lignes affichées à la fois).
    Ou alors qu'il masque toutes les colonnes qui contiennent au moins un "N"ce qui pourrait expliquer qu'il masque toutes les colonnes (sauf bien sûr celles qui ne sont pas dans le range de depart)

  11. #11
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    La colonne N correspondrait à quel niveau dans tes images, tu m'as bien dit "masquer toutes les colonnes dont au moins une cellule = N".

    Ou tu t'es mal expliqué car peu importe le filtre, mon code masque toutes les colonnes dont au moins une cellule = N

    par contre, tes images sont difficilement exploitables pour un essai. Ne pourrais-tu pas envoyer un fichier bidon raccourci basé sur le meme principe ?
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  12. #12
    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
    Bonjour
    masquer les colonnes dont toutes les cellules VISIBLES ont leur valeur="N" (dans le range N2:EK400)
    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
    Private Sub Essai()
    Dim Plage As Range, c As Range
    Dim Oui As Boolean
    Dim i As Long
     
    Application.ScreenUpdating = False
    With Sheets("Feuil1")
        .UsedRange.EntireColumn.Hidden = False
        For i = 14 To 141 'De la colonne N jusqu'à la colonne EK
            Set Plage = .Columns(i).SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeConstants)
            For Each c In Plage
                If c.Value = "O" Then
                    Oui = True
                    Exit For
                End If
            Next c
            If Not Oui Then .Columns(i).Hidden = True
            Oui = False
            Set Plage = Nothing
        Next i
    End With
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Points : 39
    Points
    39
    Par défaut
    Bonjour!
    Je reviens sur le forum et je trouve de nouvelles réponses
    Alors en effet c'est possible d'envoyer le fichier mais je ne sais pas comment le mettre sur le forum.
    Mercatog, je vais essayer ce code de ce pas.

    Ce que je veux faire est bien: masquer une (ou plusieurs) colonnes dont Toutes les cellules Visibles auraient la valeur N
    (c'est à dire: dans une colonne il n'y a que des N, par exemple, sur la premiere figure, les colonnes Groupe4 et Groupe16 ne contiennent que des N (suite à l'application d'un filtre) et je souhaite les masquer.

    Je n'ai pas eu le temps de revenir car je devais adapter un script Perl que je ne maitrise pas beaucoup, mais j'ai hate de voir le resultat... merci beaucoup

    Alors, dans ce dernier script, j'ai modifié le titre de la feuille pour le moment, plus tard je mettrai juste feuille courante.

    Le script se bloque sur cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = .Columns(i).SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeConstants)
    Erreur d'éxécution 1004 "Pas de cellules correspondantes".

    L'aide me rapporte ceci:

    Erreur macro
    Il s'agit d'une erreur provoquée par la macro en cours d'exécution. La méthode indiquée ne peut pas être utilisée avec l'objet spécifié pour l'une des raisons suivantes :

    Un argument contient une valeur qui n'est pas valide. Ce problème se produit généralement lors de l'accès à un objet qui n'existe pas, par exemple, Workbooks(5) lorsque seuls trois classeurs sont ouverts.
    La méthode ne peut pas être utilisée dans le contexte. Notamment, certaines méthodes d'objets Range nécessitent une plage qui contient des données. Si la plage ne contient pas de données, la méthode échoue.
    Une erreur externe s'est produite, telle que l'échec de lecture ou d'écriture dans un fichier.
    Une méthode ou une propriété ne peut pas être utilisée en raison des paramètres de sécurité. Par exemple, les propriétés et les méthodes de l'objet VBE servant à manipuler le code VBA (Microsoft Visual Basic pour Applications) stocké dans un document Microsoft Office sont, par défaut, inaccessibles.
    Pour activer l'accès autorisé à Visual Basic Projects :

    Dans le menu Outils, pointez sur Macro, puis cliquez sur Sécurité.
    Sous l'onglet Sources fiables , activez la case à cocher Faire confiance au projet Visual Basic.
    Je suis allée cocher Faire confiance au projet Visual Basic (au cas où) mais l'erreur se reproduit.

    Je me pose la question de savoir si un filtre auto modifie la propriété visible d'une cellule.. je ne sais pas ce que fait concretement le filtre auto sur les objets, les masque t-il, est ce qu'il change leurs propriétés...

  14. #14
    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
    Cette erreur est causée car tu as une colonne entre la colonne 14 To 141 sans données.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Points : 39
    Points
    39
    Par défaut
    Bonjour,
    bon, je n'avais pas MS Office à la maison et je suis rentrée trop tard alors merci pour votre aide, je vous informe que je regarderai ça la semaine prochaine, car chez moi je n'ai "que" OpenOffice
    Bon week end!

Discussions similaires

  1. Update sur toutes les champs de toutes les tables
    Par cmasset dans le forum Requêtes
    Réponses: 2
    Dernier message: 19/12/2013, 19h04
  2. Sélectionner les lignes où toutes les colonnes sont remplies
    Par Stepsbysteps dans le forum Langage SQL
    Réponses: 10
    Dernier message: 18/04/2013, 12h07
  3. Réponses: 14
    Dernier message: 19/12/2011, 13h13
  4. Réponses: 2
    Dernier message: 20/08/2007, 09h22
  5. parcourir toutes les colonnes de toutes les tables???
    Par cha_cha dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 12h31

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