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 :

Gérer des Combobox


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Par défaut Gérer des Combobox
    Bonjour à tous,

    Je début sur VBA et je comprend pas grand chose pour être honnête.
    Après avoir parcouru le net et le forum j'ai vu pas mal de chose sur les combobox et les listbox qui semblent fonctionner quasiment pareil...

    Cependant mon niveau actuel ne me permet pas de résoudre mon problème que je vais vous exposer :


    Je dois créer une carte de contrôle qualité avec mes collègues et je suis en charge de faire fonctionner 2 combobox (et c'est un calvaire pour moi )

    La première combobox doit récupérer la colonne A de la feuille 2, seulement quand je rentre le code, la combobox1 compte également les cases vide et je ne trouve pas (net ou forum : http://silkyroad.developpez.com/VBA/ControlesUserForm/) la commande qui dit : "afficher uniquement les case avec une valeur..."

    La deuxième combobox doit afficher les côtes liées à la pièce sélectionnée précédemment via la combobox1.
    J'arrive à afficher la liste exel dans ma combobox avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserForm_Initialize()
     
    ComboBox1.List() = Range("Feuil2!B2:B100").Value
     
    End Sub
    Seulement voila, j'aimerais également savoir comment on peut lui faire comprendre que je veux afficher uniquement les valeurs de ma pièce sélectionner (ex : pièce 1 donc les valeurs 1,10,15,4,5) alors vous allez me dire "Feuil2!B2:B6" mais si je rajoute une ligne dans ma feuille exel pour ma pièce 1 il faudra que je retourne dans le code modifier "Feuil2!B2:B7"

    Possibilité "d'automatiser" ?

    Je vous mets des screen de mon tableau exel et de ma userform pour plus de compréhension (enfin j'espère )...


    Merci pour vos réponses.

    (Si le sujet à déjà été abordé, ce qui ne m'étonnerais pas, merci de me passer le lien du post, soit j'ai pas vu soit je suis passé dessus sans même comprendre de quoi il s'agissait )
    Images attachées Images attachées   

  2. #2
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    bonjour, pour remplir ta combobx sans les blancs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub UserForm_Initialize()
    Dim plage As Range
    With Sheets("Feuil1")
    Set plage = .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)
    End With
    For Each c In plage
    If c.Value <> "" Then Me.ComboBox1.AddItem c.Value
    Next c
     
    End Sub
    Si le nom de ta feuille n'est pas "Feuil1" change ce nom dans le code par le nom de ta feuille

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Par défaut
    SUPER !

    Dommage que je ne comprenne pas bien le code mais ça marche parfaitement.
    Merci beaucoup !

    Maintenant j’essaie de mettre une condition pour ma combobox 2, y a tellement de "truc" différent sur internet c'est affreux quand on y comprend rien.

    J'ai tenté ça mais ... EPIC FAIL !

    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
    Private Sub UserForm_Initialize()
    Dim plageA As Range
    With Sheets("Feuil2")
    Set plage = .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)
    End With
    For Each c In plage
    If c.Value <> "" Then Me.ComboBox1.AddItem c.Value
    Next c
     
     
        If ComboBox1.Value = "Pièce 1" Then
        ComboBox2.List() = Range("B2:B6").Value
        End If
     
        If ComboBox1.Value = "Pièce 2" Then
        ComboBox2.List() = Range("B7:B9").Value
        End If
     
    End Sub

  4. #4
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    regarde Cette discussion.

    Tu trouveras des liens intéressants qui présentent ton problème et un fichier exemple qui fait exactement ce que tu souhaites faire.
    Il suffit de l'adapter à tes besoins.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Par défaut
    OUA !

    Ça fonctionnement parfaitement, exactement ce qu'il me fallait !
    Vraiment merci beaucoup !

    J'ai renommé ma "feuille 2" en "Cote" ; ma "Combox1" en "listepiece" et ma "combobox2" en "listecote"

    Voila 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Private Sub listepiece_Change()
     
    Dim vlistepiece As Range
     
    Me.listecote.Clear
    With Sheets("cote")
    Set vlistepiece = .Columns(1).Find(Me.listepiece.Value)
     
    If Not vlistepiece Is Nothing Then
    For i = vlistepiece.Row To .Range("B65536").End(xlUp).Row
      If .Range("A" & i) = Me.listepiece.Value Or .Range("A" & i) = "" Then
        If .Range("B" & i) <> "" Then
        Me.listecote.AddItem (.Range("B" & i).Value)
        End If
      Else
       Exit Sub
      End If
    Next i
    End If
    End With
    End Sub
     
    Private Sub UserForm_Initialize()
    Dim i As Long, derlign As Long
     
    With Sheets("Cote")
    derlign = .Range("A65536").End(xlUp).Row
     
      For i = 1 To derlign
      If .Range("A" & i) <> "" Then
      Me.listepiece.AddItem (.Range("A" & i).Value)
      End If
     Next i
    End With
     
    End Sub

    Par contre, vous pourriez m'expliquer ce que les lignes veulent dire j'ai du mal à comprendre (à vrai dire j'ai fait du copier/coller)
    De plus j'ai pas du tout réutilisé le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub UserForm_Initialize()
    Dim plage As Range
    With Sheets("Feuil1")
    Set plage = .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)
    End With
    For Each c In plage
    If c.Value <> "" Then Me.ComboBox1.AddItem c.Value
    Next c
     
    End Sub
    J'ai du mal à percuter

    MERCI !

  6. #6
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    re, j'ai essayer de commenter le code pour qu'il soit plus compréhensible:
    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
    'je déclare mes variables
    Dim plage As Range
     
    'Avec la feuille 1
    With Sheets("Feuil1")
    'j'initialize ma variable plage en partant de la cellule A2 jusqu'à la
    'dernière cellule remplis de la colonne A
    Set plage = .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)
    End With
     
    'je fais une boucle sur chaque cellule de ma plage
    For Each c In plage
    'si la valeur de la cellule est différent de rien alors je remplis le combobox
    'avec la valeur de la cellule
    If c.Value <> "" Then Me.ComboBox1.AddItem c.Value
    Next c
    n'hésite pas à regarder l'aide d'excel (F1) sur les termes que tu ne comprend pas.

    heureux d'avoir pu t'aider

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Par défaut
    Super ! Franchement merci
    Je vais encore fouiller dans le forum pour avancer le plus possible dans mon projet


  8. #8
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    je viens de voir que je n'avais pas commenté le bon code.

    voici le tiens commenté:
    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
    Private Sub listepiece_Change()
    Dim vlistepiece As Range
     
    'je met à zéro ma combo 
    Me.listecote.Clear
     
    With Sheets("cote")
    'je recherche dans la colonne 1 la valeur choisie dans la combo listepiece
    Set vlistepiece = .Columns(1).Find(Me.listepiece.Value)
     
    'si cette valeur existe alors
     If Not vlistepiece Is Nothing Then
     
     'je vais boucler sur les cellules à partir de la ligne trouvée
    'jusqu'à la dernière ligne non vide de la colonne B
     For i = vlistepiece.Row To .Range("B65536").End(xlUp).Row
     
     'si la valeur de la cellule en A est égale à la valeur choisie dans la combo listepiece
     'ou si la valeur en A est null alors
     If .Range("A" & i) = Me.listepiece.Value Or .Range("A" & i) = "" Then
     
      'si la valeur dans la cellule voisine "B" est non null alors
      If .Range("B" & i) <> "" Then
      'je met la valeur trouvée en B dans la combo listecote
      Me.listecote.AddItem (.Range("B" & i).Value)
      End If
     
     'si je ne trouve pas la valeur alors 
     Else
      'je sors de la procédure
      Exit Sub
     End If
    Next i
    End If
    End With
    End Sub
     
    Private Sub UserForm_Initialize()
    Dim i As Long, derlign As Long
     
    With Sheets("Cote")
    'je récupère le n° de la dernière ligne utilisée de la colonne A
    derlign = .Range("A65536").End(xlUp).Row
     
      'je boucle à partir de la 1ere ligne jusqu'a la dernière ligne
      For i = 1 To derlign
     
     'si la valeur en A est différente de null alors
     If .Range("A" & i) <> "" Then
     
     ' je met dans la combo listepiece la valeur de la cellule A
     Me.listepiece.AddItem (.Range("A" & i).Value)
     
     End If
      Next i
    End With
     
    End Sub

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Par défaut
    Merci le détail est super je comprend (un peu) mieux.

    Sinon j'ai un autre problème.
    Lorsque je sélectionne ma pièce dans la combobox 1, je voudrais obliger l'utilisateur à cliquer sur OK avant d'afficher la liste de la combobox2 liée à la pièce (combobox 1)

    J'ai vu des trucs du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim ok1 as boolean
     
    If ok1 = true then
    Mais j'arrive pas à m'en servir et je sais pas ou placer le code dans toutes ses lignes.

    Un petit coup de pouce serrait magnifique !

    Merci

  10. #10
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    je voudrais obliger l'utilisateur à cliquer sur OK avant d'afficher la liste de la combobox2
    il ne faut pas utiliser l'événement change de la combo. Tu dois mettre le code dans l'événement click de ton bouton.

    Si ton bouton s'appelle 'commandbutton1' met ceci:
    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
    Private Sub CommandButton1_Click()
    Dim vlistepiece As Range
     
    'je met à zéro ma combo 
    Me.listecote.Clear
     
    With Sheets("cote")
    'je recherche dans la colonne 1 la valeur choisie dans la combo listepiece
    Set vlistepiece = .Columns(1).Find(Me.listepiece.Value)
     
    'si cette valeur existe alors
     If Not vlistepiece Is Nothing Then
     
     'je vais boucler sur les cellules à partir de la ligne trouvée
    'jusqu'à la dernière ligne non vide de la colonne B
     For i = vlistepiece.Row To .Range("B65536").End(xlUp).Row
     
     'si la valeur de la cellule en A est égale à la valeur choisie dans la combo listepiece
     'ou si la valeur en A est null alors
     If .Range("A" & i) = Me.listepiece.Value Or .Range("A" & i) = "" Then
     
      'si la valeur dans la cellule voisine "B" est non null alors
      If .Range("B" & i) <> "" Then
      'je met la valeur trouvée en B dans la combo listecote
      Me.listecote.AddItem (.Range("B" & i).Value)
      End If
     
     'si je ne trouve pas la valeur alors 
     Else
      'je sors de la procédure
      Exit Sub
     End If
    Next i
    End If
    End With
    End Sub
    supprime le code liée à la combo:
    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
    Private Sub listepiece_Change()
    Dim vlistepiece As Range
     
    'je met à zéro ma combo 
    Me.listecote.Clear
     
    With Sheets("cote")
    'je recherche dans la colonne 1 la valeur choisie dans la combo listepiece
    Set vlistepiece = .Columns(1).Find(Me.listepiece.Value)
     
    'si cette valeur existe alors
     If Not vlistepiece Is Nothing Then
     
     'je vais boucler sur les cellules à partir de la ligne trouvée
    'jusqu'à la dernière ligne non vide de la colonne B
     For i = vlistepiece.Row To .Range("B65536").End(xlUp).Row
     
     'si la valeur de la cellule en A est égale à la valeur choisie dans la combo listepiece
     'ou si la valeur en A est null alors
     If .Range("A" & i) = Me.listepiece.Value Or .Range("A" & i) = "" Then
     
      'si la valeur dans la cellule voisine "B" est non null alors
      If .Range("B" & i) <> "" Then
      'je met la valeur trouvée en B dans la combo listecote
      Me.listecote.AddItem (.Range("B" & i).Value)
      End If
     
     'si je ne trouve pas la valeur alors 
     Else
      'je sors de la procédure
      Exit Sub
     End If
    Next i
    End If
    End With
    End Sub

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Par défaut
    Ça marche nikel !

    J'étais loin avec mon bouton = true

    Merci beaucoup.

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

Discussions similaires

  1. [Excel] Gérer des combobox dynamiques
    Par VBall dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 11/09/2006, 14h23
  2. Gèrer des fichiers (documents .doc) via Struts.
    Par LESOLEIL dans le forum Struts 1
    Réponses: 7
    Dernier message: 22/08/2005, 16h26
  3. [XSLT] Comment procéder pour gérer des langues ?
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/03/2005, 11h01
  4. Comment (si possible) gérer des dll en Asm?
    Par @drien dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 06/01/2004, 15h59
  5. Une unité pour gérer des très grands nombres
    Par M.Dlb dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2003, 12h07

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