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 :

Macro Afficher/Masquer colonnes suivant 2 critères de recherche


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Macro Afficher/Masquer colonnes suivant 2 critères de recherche
    Bonjour,

    Je dispose d'un tableau L(300)xC(100) dont mes données d'entrées sont mes colonnes et mes critères sont en ligne : d'après ce que j'ai lu sur internet, pour ce genre de configuration, la fonction "filtrer par ..." n'est plus adaptée car elle permet uniquement de filtrer par ligne (? corriger si nécessaire).

    Je me lance donc donc des subroutines dans lesquelles je souhaite afficher ou ne pas afficher mes colonnes suivants mes critères de recherches:

    1. CRITERE 1: Valeurs de la ligne 10 = entre 190 et 200 (exemple: si L10xC12 = 198, j'affiche la colonne C12 en entier, sinon je masque les autres colonnes ne répondant pas au critère1).
    2. CRITERE 2: Texte de la ligne 1 = "High" / "Low" / ou "Average" (exemple: si L1xC5 = "Low", j'affiche la colonne C5 en entier, sinon je masque les autres colonnes ne répondant pas au critère2).

    Ces routines doivent être indépendantes : je veux pouvoir chercher avec le critère 1 ou le critère 2 (séparément).
    Mais également avec les critère 1 ET 2 simultanément!! (autrement dit si une colonne est déjà masquée par mon premier critère, elle devra le rester en appliquant mon second critère: ce qui me permettra d'affiner ma recherche ...)

    J'ai donc commencé ceci (appelé dans un UserForm):

    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
    Sub Lancement1()
    Dim FBP1 As Single
    Dim FBP2 As Single
    Dim i As Integer
    Application.ScreenUpdating = False
    On Error GoTo fin
     
    FBP1 = InputBox("Trier les data entre FBP1 et FBP2", "valeur FBP1")
    FBP2 = InputBox("Trier les data entre FBP1 et FBP2" ", "valeur FBP2")
     
    For i = 2 To 1000
        If Columns(i).EntireColumn.Hidden = True Then
        GoTo suivant
        End If
        ' Je souhaite ici prendre en compte la possibilité qu'une colonne soit déjà masquée par un autre critère et la garder masquée
        ' ici cela ne semble pas marcher lorsque je cumule mes critères ... 
            If Cells(10, i).Value < FBP1 Or Cells(10, i).Value > FBP2 Then
            Columns(i).EntireColumn.Hidden = True
            Else
            Columns(i).EntireColumn.Hidden = False
            End If
     
    suivant:
    Next
     
    Application.ScreenUpdating = True
    Exit Sub
    fin:
    MsgBox "Vous devez saisir une donnée valide"
    End Sub   
     
    --------------------------------------------------------------------
    Sub Lancement2()
    Dim CASE As String
    Dim z As String
    Dim i As Integer
    Application.ScreenUpdating = False
    On Error GoTo fin
     
    CASE = InputBox("CASE=?")
    For i = 2 To 1000
        z = Cells(1, i).Value
     
        If Columns(i).EntireColumn.Hidden = True Then
        GoTo suivant
        End If
        ' Je souhaite ici prendre en compte la possibilité qu'une colonne soit déjà masquée par un autre critère et la garder masquée
        ' ici cela ne semble pas marcher lorsque je cumule mes critères ...  
     
            If CASE Like z Then
            Columns(i).EntireColumn.Hidden = False
            Else
            Columns(i).EntireColumn.Hidden = True
            End If
     
    suivant:
    Next
    Application.ScreenUpdating = True
     
    Exit Sub
    fin:
    MsgBox "Vous devez saisir une donnée valide"
    End Sub
    PROBLEME:
    Je ne parviens pas à sévériser mes recherches lorsque j'applique la subroutine1 PUIS la subroutine2: la macro compile mais n'applique pas ce que je souhaite ? En effet, elle me garder des colonnes qui devraient être masquées (car hors de mes critères), ce qui montre que mes boucles de calcul sont mal agencées ... Je ne parvient donc pas à garder uniquement les colonnes avec LOW en ligne L1 ET 190-200 en ligne L10.

    Qqun pourrait-il me déboguer SVP ? Merci par avance.

  2. #2
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    Si je comprends bien ce que tu demande c'est d'afficher certaines colonnes sur certaines ligne, mais pas sur d'autre ligne ?

    Ligne 1 affiche les colonnes A,B,C,E,F
    Ligne 2 affiche les colonnes B,C,H
    Ligne 3 affiche les colonnes A,E

    C'est ça ?
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

  3. #3
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Précision
    Non non ! C'est beaucoup plus simple que cela:
    Je veux afficher mes colonnes entières si elles répondent:
    au CRITERE1 (tout seul) --> avec bouton d'action dédié
    au CRITERE2 (tout seul) --> avec bouton d'action dédié
    au CRITERE1 ET 2 --> en cliquant sur le bouton 1 PUIS sur le bouton 2

    Exemple:

    ________C1_____C2______C3______C4_____C5_____C6
    L1_____HIGH____LOW___AVERAGE__LOW__HIGH___AVERAGE
    Lxx_____xx______xx______xx_______xx_____xx______xx
    L10____191_____220_____195_____198____210_____185
    Lyy____yy______yy______yy_______yy_____yy_____yy

    si je clique sur le bouton 1 (CRITERE 1: 190-200), je veux afficher/masquer les colonnes entières de cette façon :
    ________C1_____C2______C3______C4_____C5_____C6
    L1_____HIGH_____/____AVERAGE___LOW____/_______/
    Lxx_____xx______/_______xx_______xx_____/_______/
    L10____191_____/_______195______198____/_______/
    Lyy____yy______/_______yy_______yy_____/_______/

    si je ré-initialise (bouton dédié) et je clique sur le bouton 2 (CRITERE 2: sur le texte "LOW"), je veux afficher/masquer les colonnes entières de cette façon :
    ________C1_____C2______C3______C4_____C5_____C6
    L1______/______LOW_____/______LOW_____/_______/
    Lxx_____/_______xx______/_______xx______/_______/
    L10_____/______220_____/_______198_____/_______/
    Lyy_____/______yy______/_______yy______/_______/

    Enfin, si je ré-initialise (bouton dédié) et je clique sur le bouton 1 PUIS sur le bouton 2 (CRITERE 1 ET 2), je ne veux garder que les colonnes entières de cette façon:
    ________C1_____C2______C3______C4_____C5_____C6
    L1______/_______/________/______LOW____/_______/
    Lxx_____/_______/________/_______xx_____/_______/
    L10_____/_______/_______/_______198____/_______/
    Lyy_____/______/________/_______yy_____/_______/

    où / = colonne masquée

    Et hop !! J'ai affiné ma recherche en sévérisant mes critères . C'est finalement exactement ce que fait la fonction filtre d'excel: mais sur les lignes ... (merci de ne pas me proposer de transposer mes données colonnes --> lignes sur ce tableau qui est conçu "en colonne") ...

    Toute aide me sera benefique => Merci par avance.

  4. #4
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    la première idée qui me vient a l'esprit me vaudrait la chaise electrique, mais je dirais "mets la couleur du texte en blanc" ^^

    Ton problème est le cache du system, si tu efface les colonnes, tu peux pas les récupérer.
    Ou alors !
    Au moment ou tu actionne tes critère, tu créé une collection de "Range", ou tu stocke toutes les cellules (utilisée) de ta feuille, tu applique tes filtres en vidant les cellules ne correspondant pas a tes critere, et quand tu réinitialise, tu reload ta collection avec une boucle.

    Méthode un peu gourmande, mais efficace à mon avis.
    Sinon tu créé une feuille "Mémoire" qui servira de feuille de référence en cas de reload.
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

  5. #5
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    Pour parcourir toute les cellules utilisées, tu as une propriété magique :

    Thisworkbook.sheets(maFeuilleDeTravail).UsedRange --> Retourne la plage de cellule équivalente à Ctrl+SHIFT+FIN.

    Du coup, avec ca, tu peux faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Public Sub toto()
        Dim cell_ As Range
     
        For Each cell_ In ThisWorkbook.Sheets(1).UsedRange.Cells
             'ici, ton code
        Next
     
    End Sub
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

  6. #6
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Novembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Nako_lito Voir le message
    la première idée qui me vient a l'esprit me vaudrait la chaise electrique, mais je dirais "mets la couleur du texte en blanc" ^^

    Ton problème est le cache du system, si tu efface les colonnes, tu peux pas les récupérer.
    Ou alors !
    Au moment ou tu actionne tes critère, tu créé une collection de "Range", ou tu stocke toutes les cellules (utilisée) de ta feuille, tu applique tes filtres en vidant les cellules ne correspondant pas a tes critere, et quand tu réinitialise, tu reload ta collection avec une boucle.

    Méthode un peu gourmande, mais efficace à mon avis, sinon tu créé une feuille "Mémoire" qui servira de feuille de référence en cas de reload.

    C'est bien pour éviter de les effacer que je veux juste les masquer/afficher.
    Ta méthode garde-t-elle également les mises en forme conditionnelle ? et autres formules calculée sur la page ?

  7. #7
    Membre éclairé Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Points : 827
    Points
    827
    Par défaut
    Par définition, tu enregistre une "Range", donc tout ce qui caractérise cette range. Les alignement, les couleurs, tout.

    et je reviens sur la boucle que j'ai mis, pas besoin de faire sur toute les cellules, il te suffit de stocker la range globale dans une variable.
    Parmis ses propriété, elle a un membre "items" qui contient toutes les cellules qui la compose.

    Donc tu peux juste faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim range_sage as Range
    set range = thisworkbook.sheets(1).usedRange
    tant que tu ne touche pas a cette variable, tes données sont en sécurité.

    La limitation est que si tu ferme le fichier excel en sauvegardant pendant qu'il y a un filtre en cours, adios les données dans la variable.
    Je préconiserai donc plutot la méthode de la feuille "mémoire"
    - La dernière fois que j'ai testé ca fonctionnait !
    - Vous n'avez rien modifié ?
    - Non ! Je suis pas idiot non plus.
    - ....
    - Enfin si, juste le fichier .dll, mais a 4Ko, ca devait pas être important.

Discussions similaires

  1. [XL-2010] Macro Afficher/Masquer des colonnes suivant 2 critères de recherches
    Par josselin.janvier dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 19/11/2014, 17h56
  2. [XL-2003] Aficher une colonne suivant un critère de selection dans une page
    Par Imitator92 dans le forum Excel
    Réponses: 1
    Dernier message: 21/01/2011, 20h30
  3. Réponses: 14
    Dernier message: 20/09/2010, 21h10
  4. [XAML] Afficher/Masquer colonnes dans une DataGrid
    Par igloof dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 06/02/2009, 09h01
  5. Réponses: 4
    Dernier message: 15/04/2008, 18h06

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