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

VBA Word Discussion :

[VBA-W]Alimenter une liste déroulante via un classeur Excel fermé


Sujet :

VBA Word

  1. #1
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut [VBA-W]Alimenter une liste déroulante via un classeur Excel fermé
    Bonjour, je souhaiterais dans un document Word créer une liste déroulante qui puisse récupérer les données dans une colonne d'un fichier Excel...et si possible sans ouvrir ce fichier...

    Si vous avez déjà fait quelque chose de similaire merci de m'éclairer

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Regarde dans la faq, silkyroad a fait un exposé là-dessus, difficile de faire mieux.
    Tiens, regarde là : http://silkyroad.developpez.com/VBA/ClasseursFermes/

  3. #3
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Effectivement il y a plusieurs solutions mais je n'arrive pas à l'appliquer dans une application Word.Il faut dire que je débute complétement en VBA Word mais je ne pense pas que ce soit bien différent d'excel et d'Access

    Voici mon 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
     
    Sub TestConnection_V1()
        Dim Cn As ADODB.Connection
        Dim Fichier As String
     
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\CLIENT-FOURNISSEUR.xls"
     
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
     
        'Extended Properties=Excel 8.0 est utilisé pour les versions d'Excel 97, 2000 et 2002.
     
        '
        Liste.additem "C:\[FichierTest.xls]A1CLIENT'!$B$11"
     
        '
     
        '--- Fermeture connection ---
        Cn.Close
        Set Cn = Nothing
    End Sub
    J'ai remplacé la requête par une commande qui alimenterait un liste modifiable, j'apelle cette fonction dans l'évènement document_Open de l'objet "ThisDocument"....

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Quel est le problème ? Une erreur, sur quelle ligne ? La macro ne s'exécute pas à l'ouverture (ce qui serait normal) ?

  5. #5
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    oui voila déjà ça ne s'execute pas à l'ouverture ( normal? parce qu'il n'est pas placé dans le bon évènement ? ou dans le bon module ? j'ai un projet qui se nomme "Normal" et un autre avec le nom du fichier, je l'ai donc placé dans celui-ci ça me paraissait plus logique ), en plus je ne sais pas si la référence est bien chargée..OLE automation est chargé.

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    oui voila déjà ça ne s'execute pas à l'ouverture
    Oui, Normal parce que les macros Workbook_Open() Document_Open() ... doivent être placées dans un module standard du projet Insérer -> Module -> (standard)
    Je n'ai pas regardé le reste de ton code, donc, si tu as un autre pb, tu nous dis
    A+

  7. #7
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Ok c'est déjà beaucoup mieux...cela m'a également permit de voir que les macros étaient désactivées sous Word . Donc maintenant apparemment j'ai un soucis avec les références puisqu'il me dit "type définit par l'utilisateur non définit" sur ADODB.connection. J'ai cherché une référence ressemblant à OLE DB Microsoft Jet mais je ne trouve pas...J'ai Word 2003

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonjour

    maintenant apparemment j'ai un soucis avec les références puisqu'il me dit "type définit par l'utilisateur non définit" sur ADODB.connection
    Relit le lien proposé par ce cher Ouskel'n'or, et notamment la fin du premier chapitre...


    michel

  9. #9
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Désolé je pensais ne pas avoir besoin de l'intro

    J'ai donc ajouté la référence et maintenant je souhaiterais alimenter ma combobox avec le recordset

    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
     
    Sub RequeteClasseurFerme()
     
        Dim i As Integer
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\CLIENT-FOURNISSEUR.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "A1CLIENT"
     
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
        '-----------------
     
        'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
        i = 1
        'Alimentation du recordset
        While i <> Rst.EOF
        ActiveDocument.ListeSociete.AddItem i
        i = i + 1
        Wend
     
        '--- Fermeture connection ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    La il me met une erreur sur le nom de la combobox (variable non définit), je ne comprends pas bien pourquoi il ne me propose pas ma liste après le ActiveDocument...

    Il m'indique également sur le ".Open" que la table externe n'est pas dans le format attendu

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    rebonjour

    je souhaiterais alimenter ma combobox avec le recordset
    S'il s'agit d'un objet de la boîte à outils contrôles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        ThisDocument.ListeSociete.Clear
     
        Do While Not Rst.EOF
            ThisDocument.ListeSociete.AddItem Rst(0).Value
            Rst.MoveNext
        Loop


    Il m'indique également sur le ".Open" que la table externe n'est pas dans le format attendu

    comment sont structurées les données dans le classeur Excel?



    Il faudra peut etre adapter cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
    si tu souhaites récupérer uniquement les données de la première colonne



    michel

  11. #11
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    En effet les données que je dois récupérer dans mon fichier Excel commencent à la lignes 11 et sont dans la colonne B, en plus un certain nombre de lignes sont fusionnées ce qui peut donner par exemple B11 puis la ligne suivante sera B15 etc...

    Est toujours possible ?

  12. #12
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    Oui c'est possible

  13. #13
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    J'ai fait plusieur essais qui n'ont pas abouti

    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
     
    Sub RequeteClasseurFerme()
     
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille, Cellule As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\test.xls"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "feuil1"
        Cellule = "A1:A20"
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
        '-----------------
     
        'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & NomFeuille & Cellule & "]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        'Alimentation du recordset
         Do While Not Rst.EOF
            ThisDocument.ListeSociete.AddItem Rst(0).Value
            Rst.MoveNext
        Loop
     
        '--- Fermeture connection ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    J'ai surtout joué sur la variable Cellule ainsi que les différentes écritures suivantes :

    feuil1!$A1:A20
    feuil1$A1:A20
    feuil1A1:A20
    feuil1$A1:A20$
    feuil1!$A1:A20$

    et dans tous les cas il me dit que le moteur jet n'a pas pu trouver les données

  14. #14
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    3 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 3 317
    Points : 20 144
    Points
    20 144
    Par défaut
    bonsoir

    la syntaxe est Feuil1$A1:A20



    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
    Sub extractionValeurCelluleClasseurFerme()
        Dim Source As ADODB.Connection
        Dim Rst As ADODB.Recordset
        Dim ADOCommand As ADODB.Command
        Dim Fichier As String, Cellule As String, Feuille As String
     
        'Adresse de la cellule contenant la donnée à récupérer
          'Pour une plage de cellules, utilisez:
          Cellule = "A1:A20"
     
        Feuille = "Feuil1$" 'n'oubliez pas d'ajouter $ au nom de la feuille.
        'Chemin complet du classeur fermé
        Fichier = "C:\CLIENT-FOURNISSEUR.xls"
     
        Set Source = New ADODB.Connection
        Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"
     
        Set ADOCommand = New ADODB.Command
        With ADOCommand
            .ActiveConnection = Source
            .CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
        End With
     
        Set Rst = New ADODB.Recordset
        Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
     
        Set Rst = Source.Execute("[" & Feuille & Cellule & "]")
     
         Do While Not Rst.EOF
            Debug.Print Rst(0).Value
            Rst.MoveNext
        Loop
     
        Rst.Close
        Source.Close
        Set Source = Nothing
        Set Rst = Nothing
        Set ADOCommand = Nothing
    End Sub


    Pour la suite, difficle de répondre sans voir le format du classeur.
    si tu n'y arrive pas, utilise plutot la fonction Excel4 (c'est plus simple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'Lecture cellule A1 dans la Feuil1 du classeur fermé				
    MsgBox _
    ExecuteExcel4Macro("'C:\Rep\[Classeur.xls]Feuil1'!R1C1")



    michel

  15. #15
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Bonjour ! j'ai fait des tests hier soir et ce matin, avec le code ci dessus ça fonctionnait pas. j'ai donc fait un test avec un autre fichier Excel que j'ai crée en reproduisant à peu près la meme chose et j'ai remarqué que j'avais une erreur si le recordset était vide. J'ai donc adapté le code pour qu'il gère cette erreur et la génial tout fonctionnait parfaitement ! Par contre lorsque je réessais avec le fichier original il y a encore quelque chose qui ne va pas et je me demande si ce n'est pas les cellules fusionnées....le format de la feuille contient des lignes fusionnées, s'étend sur 1700 lignes et le format des cellules peut etre différents. je cherche donc ce qui génère encore des erreurs sachant qu'il me dit que la table n'est pas dans un format valide.

    Voici mon 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    Sub extractionValeurCelluleClasseurFerme()
     
        Dim Source As ADODB.Connection
        Dim Rst As ADODB.Recordset
        Dim ADOCommand As ADODB.Command
        Dim Fichier As String, Cellule As String, Feuille As String
     
        'Adresse de la cellule contenant la donnée à récupérer
          'Pour une plage de cellules, utilisez:
          Cellule = "E2:E1705"
     
        Feuille = "A1CLIENT$" 'n'oubliez pas d'ajouter $ au nom de la feuille.
        'Chemin complet du classeur fermé
        Fichier = "C:\CLIENT-FOURNISSEUR.xls"
     
        Set Source = New ADODB.Connection
        Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"
     
        Set ADOCommand = New ADODB.Command
        With ADOCommand
            .ActiveConnection = Source
            .CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
        End With
     
        Set Rst = New ADODB.Recordset
        Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
     
        Set Rst = Source.Execute("[" & Feuille & Cellule & "]")
     
         Do While Not Rst.EOF
         If Rst(0).Value <> "" Then
            ThisDocument.ListeSociete.AddItem Rst(0).Value
        End If
            Rst.MoveNext
        Loop
     
        Rst.Close
        Source.Close
        Set Source = Nothing
        Set Rst = Nothing
        Set ADOCommand = Nothing
     
    End Sub
    En tout cas merci pour votre patience et votre aide !

  16. #16
    Mut
    Mut est déconnecté
    Membre averti Avatar de Mut
    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Mars 2003
    Messages : 931
    Points : 307
    Points
    307
    Par défaut
    Bon j'ai refait le classeur et maintenant ça fonctionne ! je pense que c'est le plus simple!

    ça fonctionne bien ! un grand merci

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

Discussions similaires

  1. [ODBC] Alimenter une liste déroulante par un lien ODBC
    Par Mut dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/08/2007, 15h06
  2. alimenter une liste deroulante via un popup
    Par mitch46000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/04/2007, 11h40
  3. [MySQL] alimenter une liste déroulante via une requête
    Par stefon dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/12/2006, 13h32
  4. alimenter une liste déroulante
    Par wided_instm dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 15/09/2006, 19h29
  5. [VBA-E] Protéger une liste déroulante
    Par nattyman dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/08/2006, 16h52

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