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 :

Remplir une combobox avec le contenu d'une colonne d'un autre fichier Excel


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Remplir une combobox avec le contenu d'une colonne d'un autre fichier Excel
    Bonjour à tous. Je suis novice en VBA, et je connais très, peu de commandes. Je me demandais s'il n'existe pas un code pour que les choix contenus dans une combobox correspondent au contenue d'une colonne d'un classeur excel qui n'ait rien à voir avec celui auquel est associé le userform qui contient cette combobox.
    Comme il est possible de faire cela, mais avec le contenu d'une colonne d'une feuille du projet en question, de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Initialize()
        ComboBox1.List() = Range("A1:A10").Value
    End Sub
    je suppose que s'il est possible de le faire à partir d'un tout autre classeur, le code est semblable, mais contient quelque part le chemin pour accéder au document contenant la colonne souhaitée.

    Merci d'avance.

    PS : je travaille sur XL-2007, mais mon projet doit tourner sur XL-2003 (ce qui est le cas jusqu'à présent)

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Alors, soit ton second classeur est ouvert et dans ce cas tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ComboBox1.List() = Workbooks("Classeur2.xls").Worksheets("Feuil1").Range("A1:A10").Value
    soit il est fermé et dans ce cas ci c'est un peu plus compliqué mais pas impossible, tu peux utiliser ADO pour récupérer la liste :
    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
     
    Private Sub ConnectCLasseur(ConnectCL As Object, _
                                Fichier As String, _
                                Optional Rs)
     
        Set ConnectCL = CreateObject("ADODB.Connection")
     
        If Not IsMissing(Rs) Then
            Set Rs = CreateObject("ADODB.Recordset")
        End If
     
        ConnectCL.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                  "Data Source=" & Fichier & ";" & _
                  "Extended Properties=""Excel 8.0;HDR=NO;IMEX= 1;"""
     
    End Sub
     
    Private Sub UserForm_Initialize()
     
        Dim ConnectCL As Object
        Dim Rs As Object
        Dim Tbl()
        Dim Classeur As String
        Dim NomFeuille As String
        Dim Plage As String
        Dim I As Integer
     
        'chemin du classeur cible
        Classeur = "D:\Classeur2.xls"
     
        'cellules à lire
        Plage = "A1:A10"
     
        'nom de la feuille où se trouve la plage
        NomFeuille = "Feuil1"
     
        'connecxion
        ConnectCLasseur ConnectCL, Classeur, Rs
     
        With Rs
            .CursorType = 1
            .LockType = 3
     
            'récup des valeurs
            .Open "SELECT * FROM `" & NomFeuille & "$" & _
            Plage & "` ", ConnectCL
     
            'dimensionne le tableau au nombre de valeurs (ici 10)
            .MoveFirst
            ReDim Tbl(1 To .RecordCount)
            .MoveFirst
     
            'rempli le tableau
            Do While Not .EOF
                I = I + 1
                Tbl(I) = .Fields(0).Value
                .MoveNext
            Loop
     
        End With
     
        'ferme la connexion
        ConnectCL.Close
     
        'rempli le combo
        ComboBox1.List() = Tbl
     
        Set Rs = Nothing
        Set ConnectCL = Nothing
     
    End Sub
    Hervé.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Février 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci infiniment Hervé. Ca marche exactement comme je voulais.

    J'ai juste une autre question (encore une fois je ne sais pas si c'est possible) :

    Comment faire en sorte qu'au lieu de se remplir avec le contenu des cellule A1 à A10, la combobox se remplisse avec le contenu de toutes les cellules non vides de la colonne A ? (Comme cela, on peut éventuellement agrandir la liste des choix sans avoir à repasser par VBA)

    Merci d'avance.

    Paul.

  4. #4
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Il faudrait savoir si le classeur est ouvert ou non ? Mais dans l'hypothèse où le classeur est ouvert, teste 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
     
    Sub Remplir()
     
    Dim Tbl()
    Dim I As Integer
    Dim J As Integer
     
    'vide le combobox
    ComboBox1.Clear
     
    'parcour la colonne et stocke les valeurs
    'des cellules non vides dans un tableau
    For I = 1 To Workbooks("Classeur2.xls").Worksheets("Feuil1").[A65536].End(xlUp).Row
     
        If Range("A" & I) <> "" Then
     
            J = J + 1
            ReDim Preserve Tbl(1 To J)
            Tbl(J) = Range("A" & I)
     
        End If
     
    Next I
     
    'rempli le combobox
    ComboBox1.List() = Tbl()
     
    End Sub
    Hervé.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Février 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Ça ne marche pas

    Mais je n'ai peut être pas compris comment l'utiliser, il faut bien entrer ce code dans la fenêtre code du userform qui contient une combobox qui s'appelle combobox1 ?

    Sinon, avez vous une idée pour le cas où le classeur "classeur2" est fermé ?

    Merci de votre aide.

    Paul

Discussions similaires

  1. Remplir une comboBox avec le contenu d'une feuille excel
    Par monichou86 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 20/01/2010, 13h46
  2. Remplir une ListView avec le contenu d'une feuille
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 05/02/2008, 11h50
  3. Réponses: 1
    Dernier message: 07/08/2007, 13h05
  4. Remplir une ListView avec le contenu d'une requête
    Par callo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/10/2006, 08h44
  5. [C#] Remplir une combobox avec le champs d'une table Access
    Par Damsou dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/06/2005, 15h31

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