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 - Liste déroulante - décochez un seul choix


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ergonome
    Inscrit en
    Octobre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2019
    Messages : 45
    Par défaut Macro - Liste déroulante - décochez un seul choix
    Bonjour à toutes et tous,

    en cette période de fin d'année je vous souhaite tout d'abord de joyeuses fêtes que vous passez surement entre amis et en famille

    Voilà mon problème....

    jusque là tout va bien avec le code

    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
    Sub JourFR()
     
            Call runes_commun_1
     
            Dim Plage As Range                              '   Tests des conditions recherchées : Grade inf à vitale + Emplacement de la rune différent de "Inventaire"
            Dim T1() As String
            Dim i As Byte
            Dim a As Integer
     
                    Range("C2").Value = "=MAX(A:A)+2"
                    a = Range("C2").Value   ' Nbre ligne maximum de pièces dans l'hopital
     
                        Range("B2").Select
     
                        Set Plage = Range(Selection, Cells(a, "M"))
                        If Existe(Plage, 5, "Sérum") Then i = i + 1: ReDim Preserve T1(1 To i): T1(i) = "Sérum"
                        If Existe(Plage, 5, "Vaccin") Then i = i + 1: ReDim Preserve T1(1 To i): T1(i) = "Vaccin"
                        If Existe(Plage, 5, "Placebo") Then i = i + 1: ReDim Preserve T1(1 To i): T1(i) = "Placebo"
                        i = 0
     
                        '    pour voir ce que contiennent les tableaux
                        '    For I = 1 To UBound(T1): Debug.Print T1(I): Next I
     
     
                        Plage.AutoFilter 5, T1, xlFilterValues
    Ensuite, sur ma base de données, colonne B j'ai ensuite plein de choix, et je désire décocher les éléments qui contiennent "Inventaire"...

    Dans l'absolu en mode "manuel" quand je décoche "Inventaire" sur ma liste déroulante, j'ai bien le reste et ce que je désire avoir...

    Par contre avec l'enregistreur de macro, il ne me désélectionne pas ce choix "Inventaire", mais m'ajoute tous les autres choix...

    Le soucis c'est que la liste peut être très longue (plus de 1300 choix différents (liste des emplacements des salles de l'hôpital)

    et je ne peux pas faire 1300 lignes comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                         If Existe(Plage, 1, "Opération chirurgie 1") Then i = i + 1: ReDim Preserve T2(1 To i): T2(i) = "Opération chirurgie 1"
    qui inclus toutes les pièces de l'hôpital en question

    Comment faire s'il vous plait, avez vous une idée à laquelle je n'aurai pas pensé ?. J'ai cherché de longues heures sur le net , mais rien ne correspond

    ce que je souhaiterai dans l'absolu... et qu'il me sélectionne tous ce qu'il y a dans la liste déroulante de la colonne B mais qu'il décoche uniquement "Inventaire", y'a t'il une fonction qui peut faire ca ?

    un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ActiveSheet.Range("$B$2",a).AutoFilter Field:=1, Criteria1:=Array false( "Inventaire *", Operator:=xlFilterValues
    merci pour toute l'aide et toutes les idées que vous pourrez me conseiller

  2. #2
    Membre averti
    Homme Profil pro
    Ergonome
    Inscrit en
    Octobre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2019
    Messages : 45
    Par défaut
    Comme je planche sur ce problème depuis 27 heures non stop (avec une dose de cafés dans le sang... ahaha)

    J'avais pensé faire un premier jet...

    en récoltant les résultats du 1er filtre... (en ne gardant que les "sérum" , "vaccin" , "placebo")

    copier le tableau obtenu...

    le coller sur une feuille temporaire

    et supprimer ensuite dans ce tableau, toute les lignes qui sont déjà dans la pièce "Inventaire" et qui contient déjà les sérums, vaccin, placebo

    copier le tableau, et le coller au bon endroit cette fois

    s'il n'y a pas de meilleures possibilités... ca sera bcp plus long

    qu'en pensez vous les amis ?

  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
    13 171
    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 : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Difficile d'apporter une aide quelconque avec si peu d'information.
    En plus dans le code que tu publies, que tu ferais bien de placer entre les balises [Code] prévues à cet effet par le forum et qui se trouve dans l'éditeur, tu invoques des procédures dont on ignore ce quelles font comme ces lignes ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Existe(Plage, 5, "Sérum") Then i = i + 1: ReDim Preserve T1(1 To i): T1(i) = "Sérum"
    If Existe(Plage, 5, "Vaccin") Then i = i + 1: ReDim Preserve T1(1 To i): T1(i) = "Vaccin"
    If Existe(Plage, 5, "Placebo") Then i = i + 1: ReDim Preserve T1(1 To i): T1(i) = "Placebo"
    Ces trois lignes qui sont "hardcodée"' pourraient à mon avis se résumer à une seule et sans constante mais sans avoir une vue en image des données impossible de donner son avis.

    Que veux-tu faire exactement ?
    Une liste limitée à certains mots ou ne contenant pas certains mots ?
    Une liste en cascade ?

    [EDIT]
    J'avais pensé faire un premier jet...
    en récoltant les résultats du 1er filtre... (en ne gardant que les "sérum" , "vaccin" , "placebo")
    copier le tableau obtenu...
    le coller sur une feuille temporaire
    Je prends connaissance de ton deuxième post et à sa lecture, je ne peux que te conseiller de t'intéresser au filtre avancé d'excel (méthode AdvancedFilter de l'objet Range) Pratiquement une ligne de code après avoir préciser les zones des données, critères et cible

    A lire pour en savoir plus Les filtres avancés ou élaborés dans Excel
    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 averti
    Homme Profil pro
    Ergonome
    Inscrit en
    Octobre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2019
    Messages : 45
    Par défaut
    Coucou philippe, ça fait plaisir de te revoir, je te passe le code attends stp :

    le premier choix avec la sélection des "Sérum", "vaccin" et "placebo" fonctionne, jusque là pas de problème
    dans le code que tu peux voir j'appelle une fonction que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function Existe(Plage As Range, NumCol As Integer, Valeur) As Boolean
     
        Dim Cel As Range
     
        Set Cel = Plage.Columns(NumCol).Find(Valeur, , xlValues, xlWhole)
     
        If Not Cel Is Nothing Then Existe = True
     
    End Function
    j'ai du mettre cette fonction privée car j'avais rencontré un problème antérieur que cela à réglé, car quand le choix que je voulais sélectionner n'était pas dispo, ça me crée une erreur dans le code VBA mais la fonction privée à résolu ce problème à l'époque

    après le premier filtre donc, qui va sélectionner toutes les salles de l'hopital qui contiennent des "sérum" ,"vaccin" et "placebo", je voudrai dans la colonne B qui contient la base des salles listées, décocher uniquement la salle "Inventaire" ... en mode manuel ça fonctionne impec mais quand je mets l'enregistreur de macro... il me sélectionne les 1127 salles (qui peut varier d'ailleurs et peut en contenir plus de 1300... suivant le lieu de l'Hopital)... ça me fait un code à rallonge (et la rallonge est vraiment très grande... alors que je lui demande de décocher simplement de la liste déroulante, seulement le choix "Inventaire")

    pour faire simple, tous les pièces sauf la pièce "Inventaire"

    je ne sais pas ce que c'est Cascade mais je progresse tu sais

    Bien à toi
    David (j'en profite pour te souhaiter de joyeuses fêtes de fin d'années)

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    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 : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour David,
    Donc si je résume dans une colonne nous devons filtrer sur trois mots "Sérum", "vaccin" et "placebo" et dans une deuxième colonne un filtre sur <>Inventaire
    Si c'est le cas, voir les filtres avancés d'excel et comme je l'ai écrit cela représente pratiquement une ligne de code
    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

  6. #6
    Membre averti
    Homme Profil pro
    Ergonome
    Inscrit en
    Octobre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2019
    Messages : 45
    Par défaut
    coucou Philippe,

    le premier filtre est bon, je ne veux pas te déranger sur la première liste car elle fonctionne c'est le deuxième qui me pose problème

    car au lieu de décocher simplement "Inventaire" (1 action), l'enregistreur de macro me liste les 1127 salles sauf "inventaire" ahaha...
    oui c'est ca pour le filtre de la colonne B ... tout sauf les cellules de la colonne B qui contiennent "Inventaire" ou <> "Inventaire"

    merci tout plein

    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour David,
    Donc si je résume dans une colonne nous devons filtrer sur trois mots "Sérum", "vaccin" et "placebo" et dans une deuxième colonne un filtre sur <>Inventaire
    Si c'est le cas, voir les filtres avancés d'excel et comme je l'ai écrit cela représente pratiquement une ligne de code

  7. #7
    Membre Expert Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 733
    Par défaut
    Bonjour,
    J'avais pensé faire un premier jet...
    en récoltant les résultats du 1er filtre... (en ne gardant que les "sérum" , "vaccin" , "placebo")
    copier le tableau obtenu...
    le coller sur une feuille temporaire
    et supprimer ensuite dans ce tableau, toute les lignes qui sont déjà dans la pièce "Inventaire" et qui contient déjà les sérums, vaccin, placebo
    copier le tableau, et le coller au bon endroit cette fois
    Lisez attentivement le lien que vous a conseillé de lire PhilippeTulliez sur les filtres élaborées. parceque vous pourriez faire tout ce décrit plus haut avec une seule ligne de code (sauf erreur ou omission de ma part)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("BDTravail").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("ZonCritTravail"), CopyToRange:=Range("ZExtBD"), Unique:=False
    Dans le code ci-dessus, les "Range" ont été nommées et le transfert doit ce faire depuis la feuille de réception. Bien sur les noms doivent être remplacés par les votres ou les références aux feuilles/tableaux.
    Cordialement

    Oups, j'ai un métro de retard sur PhilippeTulliez

  8. #8
    Membre averti
    Homme Profil pro
    Ergonome
    Inscrit en
    Octobre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2019
    Messages : 45
    Par défaut
    Non transitoire, ça c'est l'option de secours si il n'existe pas une commande en une ligne juste pour déselectionner ce fameux choix "Inventaire" de la liste

    je n'ai pas tout compris dans ton code, mais je le copierai ce soir en le décortiquant

Discussions similaires

  1. [XL-2010] Macro liste déroulante pour choix type graphique
    Par V.meca dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/05/2013, 10h13
  2. Concaténer deux liste déroulante en une seule
    Par jules_diedhiou dans le forum Langage
    Réponses: 8
    Dernier message: 12/05/2009, 14h45
  3. Liste déroulante et restriction de choix
    Par Frederick_Etudiant dans le forum Composants
    Réponses: 1
    Dernier message: 22/11/2008, 14h50
  4. Réponses: 2
    Dernier message: 23/06/2008, 16h24
  5. macro liste déroulante
    Par le_phoenix dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/07/2007, 01h09

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