Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/11/2006, 08h31   #1
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 09h18   #2
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Regarde dans la faq, silkyroad a fait un exposé là-dessus, difficile de faire mieux.
Tiens, regarde là : http://silkyroad.developpez.com/VBA/ClasseursFermes/
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 10h29   #3
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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 :
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"....
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 10h33   #4
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Quel est le problème ? Une erreur, sur quelle ligne ? La macro ne s'exécute pas à l'ouverture (ce qui serait normal) ?
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 10h39   #5
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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é.
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 10h43   #6
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
Citation:
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+
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 10h55   #7
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 10h59   #8
Rédacteur
 
Homme michel Tanguy
Inscription : août 2005
Messages : 3 317
Détails du profil
Informations personnelles :
Nom : Homme michel Tanguy
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : août 2005
Messages : 3 317
Points : 10 706
Points : 10 706
bonjour

Citation:
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
SilkyRoad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 14h44   #9
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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 :
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
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 15h48   #10
Rédacteur
 
Homme michel Tanguy
Inscription : août 2005
Messages : 3 317
Détails du profil
Informations personnelles :
Nom : Homme michel Tanguy
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : août 2005
Messages : 3 317
Points : 10 706
Points : 10 706
rebonjour

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

Code :
1
2
3
4
5
6
    ThisDocument.ListeSociete.Clear
 
    Do While Not Rst.EOF
        ThisDocument.ListeSociete.AddItem Rst(0).Value
        Rst.MoveNext
    Loop


Citation:
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 :
    texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
si tu souhaites récupérer uniquement les données de la première colonne



michel
SilkyRoad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 16h10   #11
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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 ?
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 16h52   #12
Rédacteur
 
Homme michel Tanguy
Inscription : août 2005
Messages : 3 317
Détails du profil
Informations personnelles :
Nom : Homme michel Tanguy
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : août 2005
Messages : 3 317
Points : 10 706
Points : 10 706
Oui c'est possible
SilkyRoad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 17h32   #13
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
J'ai fait plusieur essais qui n'ont pas abouti

Code :
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
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2006, 20h50   #14
Rédacteur
 
Homme michel Tanguy
Inscription : août 2005
Messages : 3 317
Détails du profil
Informations personnelles :
Nom : Homme michel Tanguy
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : août 2005
Messages : 3 317
Points : 10 706
Points : 10 706
bonsoir

la syntaxe est Feuil1$A1:A20



Code :
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 :
1
2
3
'Lecture cellule A1 dans la Feuil1 du classeur fermé				
MsgBox _
ExecuteExcel4Macro("'C:\Rep\[Classeur.xls]Feuil1'!R1C1")



michel
SilkyRoad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2006, 10h01   #15
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
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 :
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 !
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2006, 10h13   #16
Mut
Membre confirmé
 
Avatar de Mut
 
Inscription : mars 2003
Messages : 789
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : mars 2003
Messages : 789
Points : 237
Points : 237
Envoyer un message via MSN à Mut
Bon j'ai refait le classeur et maintenant ça fonctionne ! je pense que c'est le plus simple!

ça fonctionne bien ! un grand merci
Mut est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h42.


 
 
 
 
Partenaires

Hébergement Web