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 :

Liste déroulante vba excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de tequillaman
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2016
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 116
    Par défaut Liste déroulante vba excel
    Bonjour à tous,
    J'ai une liste déroulante dans un fichier excel mais j'aimerais faire mieux.
    En effet, j'aimerais que si un des élements de ma liste à été saisie, qu'il ne figure plus dans la liste déroulante.
    exemple, feuille 2 j'ai ma colonne (dynamique avec toutes mes valeurs de ma liste déroulante)
    feuille 1 j'ai ma colonne où je choisi un élément de ma liste déroulante si je choisit l'élément 1, pour la colonne suivante, je voudrait qu'il ne soit plus proposé dans ma liste déroulante.
    voici mon code pour la liste déroulante.

    Merci pour votre aide.

    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
    ' création des listes déroulantes
        Dim nbmax As Integer
     
        nbmax = Application.WorksheetFunction.CountA(Worksheets("Billettes").Range("A:A"))
        If nbmax = 0 Then
        nbmax = 1
        End If
     
        Range("B12:B172").Select
        With Selection.VALIDATION
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=Billettes!$A$1:$A$" & nbmax
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = False
            .ShowError = True
        End With

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Tequillaman (je crains que tu n'en aies abusé un peu...), bonjour le forum,

    Tu parles de deux onglets feuille 1 et feuille 2 mais ton code n'en spécifie qu'un seul : Billettes.
    Ensuite tu dis :

    feuille 1 j'ai ma colonne où je choisi un élément de ma liste déroulante si je choisit l'élément 1, pour la colonne suivante, je voudrait qu'il ne soit plus proposé dans ma liste déroulante.
    Ne voulais-tu pas dire la ligne suivante car la validation de données est attribuée à la plage B12:B172 (des lignes) et non pas B12:FQ12 (des colonnes)...

    Je pense avoir remis les choses en place te propose deux codes. Le premier, à placer dans un module standard et, à mon avis, à lancer à l'ouverture du fichier. Il correspond à ton code à toi avec, cette fois, les onglets spécifiés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Macro1()
    Dim OB As Worksheet 'déclare la variable OB (Onglet Billettes)
    Dim O1 As Worksheet 'déclare la variable O1 (Onglet 1)
    Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
     
    Set OB = Worksheets("Billettes") 'définit l'onglet OB
    Set O1 = Worksheets(1) 'définit l'onglet O1 (à adapter à ton cas)
    DL = OB.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de lá colonne A de l'onglet OB
    With O1.Range("B12:B172").Validation 'prend en compte la validation de données de la plage B12:B172 de l'onglet O1
        .Delete 'supprime un éventuelle validation de données existante
        'ajoute la liste des cellules éditées en colonne A de l'onglet "BILLETTES", comme liste de validation de données
        .Add xlValidateList, Formula1:="=Billettes!A1:A" & DL
    End With 'fin de la prise en compte de la plage B12:B172 de l'onglet O1
    End Sub
    Ensuite le code événementiel Change ci-dessous à placé dans le composant de l'onglet de la plage B12:B172 (comme tu ne l'as pas spécifié, tu adapteras éventuellement) :
    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
    Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
    Dim OB As Worksheet 'déclare la variable OB (Onglet Billettes)
    Dim PVD As Range 'déclare la variable PVD (PLage des Validation de Données)
    Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
    Dim TVU As Variant 'déclare la variable TVU (Tableau des Valeurs Utilisées)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim J As Integer 'déclare la variable J (incrément)
    Dim L As String 'déclare la variable L (Liste)
    Dim TEST As Boolean 'définit la variable TEST
     
    Set OB = Worksheets("BILLETTES") 'définit l'onglet OB
    Set PVD = Range("B12:B172") 'définit la plage PVD des validations de données
    'si la plage PVD est vide lance la macro [Macro1] du module [Module1], sort de la procédure
    If Application.WorksheetFunction.CountBlank(PVD) = PVD.Cells.Count Then Module1.Macro1: Exit Sub
    'si le changement a lieu ailleurs que dans la plage PVD, sort de la procédure
    If Application.Intersect(Target, PVD) Is Nothing Then Exit Sub
    TVU = PVD 'définit le tableau TVU des valeurs utilisées
    TV = OB.Range("A1").CurrentRegion 'définit les tableau des valeurs TV
    For I = 1 To UBound(TV, 1) 'boucle 1 sur toutes les lignes I du tableau des valeurs TV
        TEST = False 'réinitialise la variable TEST
        For J = 1 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs utilisées TVU
            'si la valeur TV(I,1) est déjà utilisée, redéfinit la variable TEST, sort de la boucle 2
            If TV(I, 1) = TVU(J, 1) Then TEST = True: Exit For
        Next J 'prochaine ligne de la boucle 2
        'si TEST est [VRAI] redéfinit la liste L (TV(I,1) si L est vide, sinon L suivie d'une virgule, suivi de TV(I,1))
        If TEST = False Then L = IIf(L = "", TV(I, 1), L & "," & TV(I, 1))
    Next I 'prochaine ligne de la boucle 1
    With PVD.Validation 'prend en compte la validation de données de la plage PVD
        .Delete 'supprime une éventuelle ancienne validation de données
        .Add xlValidateList, Formula1:=L 'ajoute la liste L comme liste de validation de données
    End With 'fin de la prise en compte de la plage PVD
    End Sub
    Ainsi, chaque fois que tu changeras une valeur dans la plage B12:B172, la liste sera mise à jour et ne permettra plus d'avoir 2 fois le même élément...

  3. #3
    Membre confirmé Avatar de tequillaman
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2016
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 116
    Par défaut
    Bonjour,
    Merci pour ta réponse. Effectivement, c'est bien ligne suivante et non colonne.
    La feuille avec les éléments devant figurer dans la liste s'appelle billettes et celle avec ma colonne dans laquelle j'ai mes cellules listées est EVERTZ.
    je n'ai pas tout compris à ton code mais je vais regarder cela.
    Merci encore

  4. #4
    Membre confirmé Avatar de tequillaman
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Avril 2016
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 116
    Par défaut MERCI
    Bon tout est parfait,
    merci beaucoup pour ton aide (ou plutôt ta solution).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/05/2011, 11h30
  2. Copier des cellules excel dans une liste déroulante vba
    Par Papillon34 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/01/2010, 16h03
  3. [XL-2003] Liste Déroulante VBA EXCEL 2003
    Par Alexandra 01 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/12/2009, 15h55
  4. Mettre nom table dans liste déroulante vba Excel
    Par Fred246 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/12/2009, 08h20
  5. masquer une liste déroulante sous Excel/VBA
    Par Krovax dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/08/2008, 15h58

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