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 :

Réalisation d'un filtre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Par défaut Réalisation d'un filtre
    Bonjour à tous!

    Etant nouveau sur le forum je tiens à préciser que j'ai fait la fonction "recherche" mais que je n'ai pas trouvé ma réponse... Je suis novice en VBA et je dois réaliser un filtre. Je vous explique: je clique sur un bouton qui me charge un filtre avec plusieurs listes. Une fois cette fenêtre ouverte je peux donc choisir dans mes différents ComboBox ce que je souhaite. Jusque là tout va bien. Là où ça se corse c'est que je souhaite que l'utilisateur puisse rentrer une valeur lui même si il le souhaite dans un autre Label. A partir de là le label devient menant. jusque là j'y arrive.

    Je voudrais en fait savoir comment coder le fait que si la valeur entrée par l'utilisateur est dans ma liste alors il fait ce que je lui demande de faire après sinon si il ne la trouve pas alors il quitte. Du genre avec un ".Find" quelque chose mais je ne trouve pas... Je mets un morceau de mon code:



    Voila pour le moment c'est du bricolage, je ne sais pas si j'ai été clair... Merci d'avance pour votre aide!

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 567
    Par défaut
    tu dois utiliser find mais sans boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With Worksheets("mafeuille").Range("a" & lnmin & ":a" & lnmax)
    Set c = .Find(obj.value, LookIn:=xlValues)
    If Not c Is Nothing Then
    call cpltrue
    else exit sub
    end if
    j'ai pas testé ce bout de code mais l'essentiel y est

  3. #3
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Par défaut
    Un grand merci, j'essaie ça et je tiens au courant!

  4. #4
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Par défaut
    Bon je m'y suis mis très rapidement ce soir et j'ai quelques petits ennuis!! Voici le programme remis à ma sauce:



    Premièrement, j'ai un message d'erreur quand je compile, à savoir que j'ai mis Next sans For... Je ne comprends pas!

    Ensuite je souhaiterais que cela ne s'applique que sur une "range" de ma feuille shD et pas sur "Worksheets("mafeuille").Range("a" & LnMin & ":a" & LnMax)". Je bloque complet je sature un peu là...

    Merci de votre aide.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 567
    Par défaut
    oui, tu dois saturer
    If Not c Is Nothing Then ... signifie si c n'est pas rien, donc traduire si c existe donc traduire si il trouve l'occurence et donc par consequent ... pas le moment de demander a l'utilisateur de taper un autre n°
    il te demande un next mais en fait c'est un end with qu'il attend
    ps, j'edite juste pour dire que ça serai plus facile si tu plaçais du code sur le forum, et en utilisant les balises plutot que ta copie d'écran qui oblige a retaper le code au lieux de faire un simple copier coller

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Par défaut
    Merci pour tes explications, mais je dois être trop bête... Je ne comprends pas clairement la signification de "If Not c Is Nothing Then". Et je n'arrive pas à ce que le filtre regarde d'abord si ma valeur entrée est bien dans ma liste... Soit la valeur entrée y est (dans ma liste) alors le programme s'éxécute, soit il envoit le message d'erreur "taper un autre numéro...

    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
    For nLn = LnMin To LnMax
                With Worksheets("D").Range("3" & LnMin & ":3" & LnMax)
                Set c = .Find(Obj.Value, LookIn:=xlValues)
                    If Not c Is Nothing Then
        '            Call cpltrue
        '               Boite à message indiquant que le numéro d'objet rentré n'est pas égal à un numéro de la liste:
                            Rep = MsgBox("Entrez un autre N° d'objet", vbOKOnly, "N° d'objet non valide")
                        Exit Sub
                    End If
                End With
                    'Si la valeur de la cellule (Matrice: Colonne "ColObj"/Ligne "nLn") est égale
                    'à la valeur rentrée dans la zone de texte "N° d'objet" alors:
                    If shD.Cells(nLn, ColObj) = Obj.Value Then
                        'Boucles sur les lignes. La ou les ligne(s) contenant les valeurs
                        'recherchées ne doivent pas être cachées:
                        For n = nLn To nLn + shD.Cells(nLn, ColLotp).MergeArea.Count - 1
                            shD.Rows(n).EntireRow.Hidden = False
                        Next n
            '        MaVerif = False
                    'Sinon:
                    Else
                        Call CpltTrue(nLn)
                    End If
    '                MaVerif = True
                nLn = nLn + shD.Cells(nLn, ColObj).MergeArea.Count - 1
            Next nLn
    End If
    End Sub

  7. #7
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Par défaut
    En fait ce que je n'ai pas dit c'est qu'une fois qu'il a trouvé ma valeur il doit cacher toutes les lignes sauf celle contenant ma valeur... Voila pourquoi une fois qu'il a trouvé ma valeur dans ma liste je relance! Je n'ai pas trouvé d'autres solutions parce que je ne sais pas comment dire de caché toutes les lignes sauf celle qui m'intéressent...

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu ne peux pas utiliser un filtre Excel ? (j'ai pris en route et n'ai pas relu depuis le début)

  9. #9
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Tu ne peux pas utiliser un filtre Excel ? (j'ai pris en route et n'ai pas relu depuis le début)
    En fait j'ai des lignes qui sont mergées jusqu'à un certain nombre de colonnes ensuite j'ai d'autres données, lorsque je fais un filtre automatique j'ai des données qui disparaissent... Je ne sais pas trop comment expliquer mais j'ai des ennuis avec le filtre auto

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 567
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Tu ne peux pas utiliser un filtre Excel ? (j'ai pris en route et n'ai pas relu depuis le début)
    si tu stagnes, as tu essayé d'autres piste? aprés tout, excel fais trés bien

  11. #11
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Par défaut
    J'ai abandonné c'est pas grave je n'ai pas le niveau... Je reviendrais sur ce post une fois que j'aurais plus de bagage technique! Merci à tous en tout cas

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 567
    Par défaut
    alors tu pourrais tenter
    une fois que tu as C, tu a C.row qui est le n° de la ligne de "objet"
    ensuite tu cache l'integralité de ton tableau
    set mon tableau = range patincoufin
    montableau.hidden = true
    et ensuite tu démasque :C.row.hidden = false
    j'édite pour un détail
    C ne "se met pas a nothing". C est égal a quelque chose ou a rien, donc si il n'est pas rien, c'est que la recherche à trouvé quelque chose.
    comme set C veut dire a peu près : nous dirons que C est un objet qui represente l'objet de la recherche, cet objet n'as pas de valeur, il a des propriétés.
    C.row est la ligne de C.
    C.value est la valeur de C

  13. #13
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Par défaut
    Citation Envoyé par alsimbad Voir le message
    alors tu pourrais tenter
    une fois que tu as C, tu a C.row qui est le n° de la ligne de "objet"
    ensuite tu cache l'integralité de ton tableau
    set mon tableau = range patincoufin
    montableau.hidden = true
    et ensuite tu démasque :C.row.hidden = false
    j'édite pour un détail
    C ne "se met pas a nothing". C est égal a quelque chose ou a rien, donc si il n'est pas rien, c'est que la recherche à trouvé quelque chose.
    comme set C veut dire a peu près : nous dirons que C est un objet qui represente l'objet de la recherche, cet objet n'as pas de valeur, il a des propriétés.
    C.row est la ligne de C.
    C.value est la valeur de C
    Oui effectivement je vais essayer ça! Merci pour ton aide et ne le prends pas mal si je suis maladroit, j'essaie de comprendre du mieux que je peux sachant que je débute vraiment...

  14. #14
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 35
    Par défaut
    Voila j'ai essayé de faire quelque chose avec ce que tu m'as proposé mais un message d'erreur apparaît lors de l'exécution:

    erreur d'exécution '1004':
    Impossible de définir la propriété Hidden de la classe Range

    ...

    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
    Else
    'Permet de figer l'écran pendant la réalisation de tri de mon filtre:
    Application.ScreenUpdating = False
    '    Déclaration de la valeur de "objet":
        objet = Obj.Value
    '        Avec dans la Range de ma feuille "D":
            With Worksheets("D").Range(Cells(LnMin, ColObj), Cells(LnMax, ColObj))
    '            Initialisation de "c" qui recherche l'objet dans ma Range:
                Set c = .Find(objet)
    '                Si "c" n'est pas rien. Donc si "c" est une de mes valeurs de ma liste alors:
                    If Not c Is Nothing Then
                    ColMax = shD.UsedRange.Columns.Count
                    Set MesDonnees = Range(Cells(LnMin, ColLotp), Cells(LnMax, ColMax))
                        MesDonnees.Hidden = True
                    c.EntireRow.Hidden = False
                    Else
    '                    Message d'erreur demandant à l'utilisateur de saisir un autre numéro d'objet:
                        Rep = MsgBox("Entrez un autre N° d'objet", vbOKOnly, "N° d'objet non valide")
                    End If
            End With
    Application.ScreenUpdating = True
    End If
    End Sub

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu ne peux pas masquer des cellules, donc un range, tu ne peux masquer que des colonnes ou des lignes.

Discussions similaires

  1. Réaliser un filtre dans un List control
    Par damdam78 dans le forum MFC
    Réponses: 1
    Dernier message: 28/11/2009, 02h32
  2. Réaliser un filtre à partir d'un tableau SAS
    Par Debsas dans le forum SAS Base
    Réponses: 6
    Dernier message: 25/12/2008, 13h27
  3. [XSLT] Réalisation d'un filtre
    Par enael dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/05/2007, 15h22
  4. Réponses: 7
    Dernier message: 29/12/2006, 14h12
  5. Réalisation d'un filtre ISAPI
    Par cyrille2k5 dans le forum MFC
    Réponses: 32
    Dernier message: 26/04/2005, 16h28

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