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 :

Comment faire pour que les éléments de ma combobox soient ceux de la plage du classeur fermé [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Par défaut Comment faire pour que les éléments de ma combobox soient ceux de la plage du classeur fermé
    Salut le forum

    J'ai un classeur fermé initulé "MODELE_VISA_zb" qui se trouve dans le dossier "VISA_CHEQUE" du répertoire "Z:".
    J'ai un autre classeur qui est actif. Ce classeur comporte un usf comportant une combobox.
    Les éléments de ma combobox devront être ceux du classeur fermé et plus précisément la plage BASE_DE_DONNEES!A2:A).
    Voici le chemin d'accès du classeur fermé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Z:\VISA_CHEQUE\MODELE_VISA_zb.xlsx"
    Le code ci-dessous permet de se connecter au classeur fermé mais la suite j'y arrive pas.
    Je salut au passage l'auteur du code (rdurupt).
    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
    Public Cnx As Object, Cnx1 As Object
    Public Const Feuille = "USER_LIST$"
    Public Const Feuille1 = "BASE_DE_DONNEES$"
    Public Const Fichier = "Z:\VISA_CHEQUE\MODELE_VISA_zb.xlsx"
    Dim strsQL As String
    Sub RequetAjout()
     
    OpenConnexion Fichier
    strsQL = "insert into [" & Feuille & "] ([USER_CODE],[CODE_EXPL],[NOM_EXPLOITANT],[CONTACTS],[ADRESSE_MAIL_EXPLOITANT],[ADRESSE_MAIL_DA]) "
    strsQL = strsQL & "Values ('USER_CODE','CODE_EXPL','NOM_EXPLOITANT','CONTACTS','ADRESSE_MAIL_EXPLOITANT','ADRESSE_MAIL_DA');"
     
    strsQL = "insert into [" & Feuille & "] ([USER_CODE],[CODE_EXPL],[NOM_EXPLOITANT],[CONTACTS],[ADRESSE_MAIL_EXPLOITANT],[ADRESSE_MAIL_DA]) "
    strsQL = strsQL & "Values ('textbox1.value','textbox2.value','textbox3.value','textbox4.value','textbox5.value'textbox6.value');"
    Cnx.Execute strsQL
    Set Cnx = Nothing
    End Sub
    Sub RequeteMaj()
    OpenConnexion Fichier
    Set requete = CreateObject("ADODB.recordset")
    strsQL = "Update  [" & Feuille & "] set [USER_CODE]='toto'  where  [USER_CODE]='textbox1.value';"
    Cnx.Execute strsQL
    Cnx.Close
    End Sub
    Sub OpenConnexion(Fichier)
    Set Cnx = CreateObject("ADODB.Connection")
     
    With Cnx
     .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
     
    End With
     
    End Sub
    Merci pour vos contributions

  2. #2
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Une piste, adapter là où c'est indiqué. La plage ne doit pas être indiquée par un nom mais par une adresse de range :
    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
    86
    87
    88
    89
    90
    91
    92
    93
     
    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= 2;"""
     
    End Sub
     
    Private Sub UserForm_Initialize()
     
        RecupValeurs
     
    End Sub
     
     
    Sub RecupValeurs()
     
        Dim ConnectCL As Object
        Dim Rs As Object
        Dim Champ As Object
        Dim Fichier As String
        Dim NomFeuille As String
        Dim plage As String
        Dim Tableau()
        Dim I As Integer
        Dim J As Integer
     
        'chemin du classeur, à adapter...
        Fichier = "F:\Classeur Combo.xls"
     
        'feuille où s'effectuera la récup, à adapter...
        NomFeuille = "Feuil1"
     
        'plage ou s'effectuera la récup, pour une cellule
        'écrire de la façon suivante : "A1:A1", à adapter...
        plage = "A1:A10" '<-- ici, pas de nom mais une plage !
     
        'connecxion
        ConnectCLasseur ConnectCL, Fichier, Rs
     
        With Rs
     
            .CursorType = 1
            .LockType = 3
            .Open "SELECT * FROM `" & NomFeuille & "$" & _
            plage & "` ", ConnectCL
     
            'mets les valeurs dans un tableau (plus rapide)
            ReDim Tableau( _
                    1 To .RecordCount, _
                    1 To .Fields.Count)
     
            .MoveFirst
     
            Do While Not .EOF
     
                I = I + 1
     
                For Each Champ In .Fields
     
                    J = J + 1
     
                    Tableau(I, J) = Champ.Value
     
                Next
     
                J = 0
     
                .MoveNext
     
            Loop
     
        End With
     
        ConnectCL.Close
     
        'récupération des valeurs stockées dans le tableau
        For I = 1 To UBound(Tableau, 1)
     
            'adapter le nom du combobox...
            Me.ComboBox1.AddItem Tableau(I, 1)
     
        Next I
     
    End Sub
    Hervé.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Comme cette méthode peut s'avérer utile pour plusieurs combobox et/ou UserForm ; nous allons la décrire dans le même module ou nous avons décrit le processus de connexion.
    Code Module1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub ReseigneListe(Table As String, Champ As String, Lst As ComboBox)
    Dim sql As String
    Dim Rs As Object
    sql = "select Distinct Frm." & Champ & " from [" & Table & "] as frm order by frm." & Champ & ";"
    Set Rs = CreateObject("ADODB.RECORDSET")
    Rs.Open sql, Cnx
    If Rs.EOF = false Then
        Lst.List =Rs.getrows
    End If
    Rs.Close
    Set Rs = Nothing
    End Sub
    Code UserForm : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub UserForm_Initialize()
    OpenConnexion Fichier
    ReseigneListe Feuille, "USER_CODE", Me.ComboBox1
    Cnx.Close
    Set Cnx = Nothing
    End Sub
    Dernière modification par Invité ; 08/09/2014 à 09h17.

  4. #4
    Membre éclairé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Par défaut
    Salut Theze et rdurupt

    Merci pour vos codes.
    Theze: j'ai essayé de tester votre code mais il y'a une erreur ici "ConectCLasseur" avec le message suivant :"Sub ou Fonction non défini".
    Rdurupt:Il n'ya qu'une seule valeur qui s'affiche dans la combobox et non les éléments de la plage concernés.
    Pouvez-vous revoir svp?
    Merci

  5. #5
    Invité
    Invité(e)
    Par défaut
    Code Module1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub ReseigneListe(Table As String, Champ As String, Lst As ComboBox)
    Dim sql As String
    Dim Rs As Object
    sql = "select Distinct Frm.* from [" & Table & "] as frm order by frm." & Champ & ";"
    Set Rs = CreateObject("ADODB.RECORDSET")
    Rs.Open sql, Cnx
    If Rs.EOF = false Then
        Lst.List =Rs.getrows
    End If
    Rs.Close
    Set Rs = Nothing
    End Sub

  6. #6
    Membre éclairé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Par défaut
    Merci pour la nouvelle solution.
    Je pense que ca commence à venir.
    Au lieu que la liste de la combobox1 soit les éléments de la colonne B avec pour nom de champ "NUM_CLIENT", il affiche les éléments de la ligne 3 comme élément de ma combobox. Ce qui n'est pas bon.
    Pouvez-vous faire en sorte que ce soit les éléments de la colonne B (commençant par B2:B)

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/10/2011, 14h35
  2. Réponses: 3
    Dernier message: 28/12/2010, 08h07
  3. Réponses: 2
    Dernier message: 02/08/2007, 15h44
  4. Réponses: 6
    Dernier message: 16/01/2007, 21h34

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