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 :

Listes déroulantes liées et bug variable "Control"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2015
    Messages : 5
    Par défaut Listes déroulantes liées et bug variable "Control"
    Bonjour,

    J'ai recherché sur le forum des réponses à mes questions, à savoir comment créer des listes déroulantes liées les unes aux autres, chaque liste faisant référence à une colonne spécifique et chaque liste impactant la suivante. J'ai trouvé ce bout de code qui m'avait l'air intéressant :

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    'Les données sont dans les colonnes C à D, d'un onglet nommé "Matrice Secteur-Unité + Métiers".
    'La procédure effectue un remplissage conditionnel des Combobox en fonction de
    'ce qui est sélectionnée dans le contrôle précédent:
    'La sélection du ComboBox1 (données colonne C) définit le contenu du ComboBox2 (données colonne D) ,
    'La sélection du ComboBox2 pourrait définir le contenu du ComboBox3 (données colonne E) …etc...
    '
     
    Private Sub UserForm_Initialize()
     
    Dim Ws As Worksheet
    Dim NbLignes As Integer
        'Définit la feuille contenant les données
        Set Ws = Worksheets("Matrice Secteur-Unité + Métiers")
        'Définit le nombre de lignes dans la colonne C
        NbLignes = Ws.Range("C65536").End(xlUp).Row
     
        'Remplissage du ComboBox1
        Alim_Combo 1
     
    End Sub
     
     
    Private Sub ComboBox1_Change()
        'Remplissage Combo2
        Alim_Combo 2, ComboBox1.Value
    End Sub
     
     
    Private Sub ComboBox2_Change()
        'Remplissage Combo3
        Alim_Combo 3, ComboBox2.Value
    End Sub
     
     
    Private Sub ComboBox3_Change()
        'Remplissage Combo4
        Alim_Combo 4, ComboBox3.Value
    End Sub
     
     
     
    'Procédure pour alimenter les ComboBox
    Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
        Dim j As Integer
        Dim Liste As Control
     
        'Définit le ComboBox à remplir
        Set Liste = Me.Controls("ComboBox" & CbxIndex)
        'Supprime les anciennes données
        Liste.Clear
     
        'alimente le Combobox initial (Combobox1)
        If CbxIndex = 1 Then
            'Boucle sur les lignes de la colonne A (à partir de la 2eme ligne)
            For j = 2 To NbLignes
                Liste = Ws.Range("C" & j)
                'Remplit le ComboBox sans doublons
                If Liste.ListIndex = -1 Then Liste.AddItem Ws.Range("C" & j)
            Next j
        Else
            'Alimentation conditionnelle des autres Combobox en fonction de
            'ce qui est sélectionnée dans le contrôle précédent:
            '(La sélection du ComboBox1 définit le contenu du ComboBox2,
            'La sélection du ComboBox2 définit le contenu du ComboBox3 …etc...)
            For j = 2 To NbLignes
                If Ws.Range("C" & j).Offset(0, CbxIndex - 2) = Cible Then
                    Liste = Ws.Range("C" & j).Offset(0, CbxIndex - 1)
                    If Liste.ListIndex = -1 Then Liste.AddItem Ws.Range("C" & j).Offset(0, CbxIndex - 1)
                End If
            Next j
       End If
     
       'Enlève la sélection dans le ComboBox
       Liste.ListIndex = -1
    End Sub
    Toutefois, quelques questions subsistent pour moi...
    Comment définir la case où se situe la liste déroulante ? Et lorsque je lance la macro, il m'affiche sur ce bout de code une erreur de compilation ayant pour intitulé "Type défini par l'utilisateur non défini en surlignant en bleu la ligne

    Si l'un d'entre vous peut m'aider, je vous en serait infiniment reconnaissant ! Merci d'avance pour le temps que vous prendrez à lire tout ça

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2015
    Messages : 5
    Par défaut Petite modification
    J'ai changé d'optique finalement, je vais mettre en place un tri automatique des données sur la base du quel je vais lier mes listes déroulantes avec la fonction INDIRECT().

    Du coup mes lignes de code pour pré-remplir les listes sur lesquelles va se base mon INDIRECT() sont les suivantes :

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    Workbooks("Outil GPEC (en construction).xlsm").Sheets("Matrice Secteur-Unité + Métiers").Activate
     
    Dim cellule As Range
     
    Range("C3").Select
    Range("M3").Value = Range("C3").Value
     
    'Création des intitulé des différentes colonnes recueillis dans une première colonne
     
    For Each cellule In Range("c3:c1000")
     
            If cellule <> Range("M3") Then
     
                Range("N3:z3").Value = Range("M3:y3").Value
                Range("M3").Value = cellule
     
            End If
     
    Next cellule
     
    'Suppression des doublons présents dans les intitulés
     
    Range("N3").Select
     
    While ActiveCell <> ""
     
        For Each cellule In Range(ActiveCell.Offset(0, 1).Address & ":Z3")
     
            If cellule = ActiveCell Then
     
            cellule.EntireColumn.Delete 'ici un bug se présente, c'est que la variable cellule a pris pour valeur celle de mon activecell, ce qui devrait pas être le cas...
     
            End If
     
        Next cellule
     
        ActiveCell.Offset(0, 1).Select
     
    Wend
     
    'Remplissage des différentes colonnes à partir des données présentes sur une deuxième colonne
     
    Dim numéro_colonne As Byte
     
    For Each cellule In Range("D3:D1000")
     
        numéro_colonne = 13
     
        While cellule.Offset(0, -1) <> Range(Chr(numéro_colonne + 65) & "3")
     
            numéro_colonne = numéro_colonne + 1
     
        Wend
     
        If cellule <> Range(Chr(numéro_colonne + 65) & "3") Then
     
            Range(Chr(numéro_colonne + 65) & "5:" & Chr(numéro_colonne + 65) & "1002").Value = Range(Chr(numéro_colonne + 65) & "4:" & Chr(numéro_colonne + 65) & "1001").Value
            Range(Chr(numéro_colonne + 65) & "4").Value = cellule
     
        End If
     
    Next cellule
     
     
    'Nomination des différentes plages en fonction de l'intitulé des colonnes
     
    Dim Unité As String
     
    For numéro_colonne = 13 To 25
     
        If Range(Chr(numéro_colonne + 65) & "3") = "" Then
     
            Exit For
     
        End If
     
        Unité = Range(Chr(numéro_colonne + 65) & "3")
     
        Range(Chr(numéro_colonne + 65) & "4:" & Chr(numéro_colonne + 65) & "1001").RemoveDuplicates Columns:=1, Header:=xlNo
     
        Dim liste_nommée As Range
        Set liste_nommée = Worksheets("Matrice Secteur-Unité + Métiers").Range(Chr(numéro_colonne + 65) & "4:" & Chr(numéro_colonne + 65) & "600")
        ActiveWorkbook.Names.Add Name:=Unité, RefersTo:=liste_nommée
     
    Next numéro_colonne
    Comme vous avez pu le lire dans le code, le problème se passe au moment de supprimer les colonnes présentes en doublon, ce que je ne comprend pas vraiment...
    Quelqu'un aurait une idée pour m'aider ? Je vais continuer à réfléchir de mon côté, bon courage à vous !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2015
    Messages : 5
    Par défaut Terminé \o/
    Bon finalement j'ai contourné le problème via l'enregistreur de macro, voici la correction de mon bout de code qui fonctionnait pas :

    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
    'Suppression des doublons présents dans les intitulés
     
    Range("N3").Select
     
    While ActiveCell <> ""
     
        For Each cellule In Range(ActiveCell.Offset(0, 1).Address & ":Z3")
     
            If cellule = ActiveCell Then
     
            cellule.value = ""
     
            End If
     
        Next cellule
     
        ActiveCell.Offset(0, 1).Select
     
    Wend
    Je pense qu'il doit y avoir plus performant comme manière de faire, du coup je suis toujours ouvert à de nouvelles propositions !

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Juin 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2015
    Messages : 5
    Par défaut Au temps pour moi...
    Complètement désolé, mais finalement ça ne semble pas marcher une fois le tri fais une fois, le relancer m'amène à une erreur sur mes listes liées. J'ai bien les noms de plages qui sont créées, mais pour l'une d'entre elles, le lien indirect est reconnu comme erroné (je ne peux donc pas sélectionner de données dans la deuxième liste, puisque pour l'ordi il y a une erreur et donc une impossibilité que je choisisse quelque chose dans cette liste ...). Quelqu'un pourrait-il m'aider ?

Discussions similaires

  1. [AC-2010] Bug listes déroulantes liées et problème de correspondance.
    Par Alialyn dans le forum IHM
    Réponses: 12
    Dernier message: 07/09/2011, 14h36
  2. Listes déroulantes liées entre elles
    Par denisC dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 27/07/2002, 16h53

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