Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Liste Déroulante dans word allant chercher des données dans Excel

17 réponses
Avatar
Alex
Bonjour =E0 tous,

Je voudrais savoir s'il y a une possibilit=E9 de cr=E9er une liste
d=E9roulante dans un document word, qui va aller chercher les donn=E9es
correspondant =E0 la s=E9lection dans une feuille de calcul excel ?

Merci de vos r=E9ponses.
Alex

7 réponses

1 2
Avatar
michdenis
Question I : Tu peux inscrire le chemin que tu veux. Attention
aux fautes d'orthographe et surtout ce chemin doit se terminer
avec le symbole "" comme dans :
Chemin = "C:Mes documents"
non comme :
Chemin = "C:Mes documents"

Question II : Un contrôle "ListBox" n'a pas de propriété "Multiline" mais une
propriété MultiSelect qui signifie que tu peux sélectionner plus
d'un item dans la liste. Ces items inscrivent toujours sur une ligne.
La seule chose possible est de jouer avec la largeur de la colonne
du contrôle en utilisant la propriété ColumnWidths

Question III : Oui, tu peux copier cette macro dans le module standard du
Normal.dot. Ne pas oublier d'ajouter la référence
"Microsoft Activex Data Objects 2.8 library" dans le vbaprojet
du Normal.dot.
Cela suppose que tous les combobox de tous tes fichiers .doc
ont le même nom et que l'information provient du même
classeur situé dans le même répertoire.
Si le besoin est différent, on pourrait transformer la procédure
en fonction et y passer certains paramètres pour qu'elle puisse
être adaptable selon le fichier appelant.



MichD
--------------------------------------------
"Alex" a écrit dans le message de groupe de discussion :


Bonjour à tous,

Merci à vous pour vos réponses et vos propositions de résolution à mon
problème.
La proposition de Michel fonctionne tès bien, mais trois questions :

1°/ Je n'arrive pas à modifier la ligne suivante : Chemin ThisDocument.Path & ""
en mettant le chemin d'accès exacte, j'ai tenté Chemin = "C:Documents
and SettingsAlex95Bureauckm4Gjmjrn_Documents" ou Chemin ThisDocument.Path & "C:Documents and SettingsAlex95Bureau
ckm4Gjmjrn_Documents"
mais à chaque fois, j'ai un message d'erreur, alors que si je laisse
la ligne d'origine cela fonctionne, me confirmes tu qu'il ne faut pas
modifier cette ligne ? et qu'il trouvera bien le fichier excel avec la
lettre si les deux fichiers sont dans le même répertoire ?
2°/ Le multiligne
de ma liste excel est représenté en retour de chariot mais ne les
faits pas. Peux ajouter le fait qu'il représente la cellule avec le
multi-ligne ?

3°/ Enfin ma derniere question, avant de modifier le normal.dot, est
ce que je peux mettre ces lignes de commandes sur mon normal.dot, afin
de l'appliquer à toutes mes lettres ?

Encore un grand merci à tous
Alex
Avatar
michdenis
J'ai oublié, si tu places la macro dans le normal.dot, tu dois
modifier cette ligne de code :

'-----------------------------
Do While Rst.EOF = False
ThisDocument.ComboBox1.AddItem Rst(0)
Rst.MoveNext
Loop
'-----------------------------

Pour :

'-----------------------------
Do While Rst.EOF = False
ActiveDocument.ComboBox1.AddItem Rst(0) '<===== Rst.MoveNext
Loop
'-----------------------------


MichD
--------------------------------------------
"michdenis" a écrit dans le message de groupe de discussion : ij3jif$qng$

Question I : Tu peux inscrire le chemin que tu veux. Attention
aux fautes d'orthographe et surtout ce chemin doit se terminer
avec le symbole "" comme dans :
Chemin = "C:Mes documents"
non comme :
Chemin = "C:Mes documents"

Question II : Un contrôle "ListBox" n'a pas de propriété "Multiline" mais une
propriété MultiSelect qui signifie que tu peux sélectionner plus
d'un item dans la liste. Ces items inscrivent toujours sur une ligne.
La seule chose possible est de jouer avec la largeur de la colonne
du contrôle en utilisant la propriété ColumnWidths

Question III : Oui, tu peux copier cette macro dans le module standard du
Normal.dot. Ne pas oublier d'ajouter la référence
"Microsoft Activex Data Objects 2.8 library" dans le vbaprojet
du Normal.dot.
Cela suppose que tous les combobox de tous tes fichiers .doc
ont le même nom et que l'information provient du même
classeur situé dans le même répertoire.
Si le besoin est différent, on pourrait transformer la procédure
en fonction et y passer certains paramètres pour qu'elle puisse
être adaptable selon le fichier appelant.



MichD
--------------------------------------------
"Alex" a écrit dans le message de groupe de discussion :


Bonjour à tous,

Merci à vous pour vos réponses et vos propositions de résolution à mon
problème.
La proposition de Michel fonctionne tès bien, mais trois questions :

1°/ Je n'arrive pas à modifier la ligne suivante : Chemin ThisDocument.Path & ""
en mettant le chemin d'accès exacte, j'ai tenté Chemin = "C:Documents
and SettingsAlex95Bureauckm4Gjmjrn_Documents" ou Chemin ThisDocument.Path & "C:Documents and SettingsAlex95Bureau
ckm4Gjmjrn_Documents"
mais à chaque fois, j'ai un message d'erreur, alors que si je laisse
la ligne d'origine cela fonctionne, me confirmes tu qu'il ne faut pas
modifier cette ligne ? et qu'il trouvera bien le fichier excel avec la
lettre si les deux fichiers sont dans le même répertoire ?
2°/ Le multiligne
de ma liste excel est représenté en retour de chariot mais ne les
faits pas. Peux ajouter le fait qu'il représente la cellule avec le
multi-ligne ?

3°/ Enfin ma derniere question, avant de modifier le normal.dot, est
ce que je peux mettre ces lignes de commandes sur mon normal.dot, afin
de l'appliquer à toutes mes lettres ?

Encore un grand merci à tous
Alex
Avatar
LSteph
Bonjour,

Cette ligne de code signifie ..est d�j� ouverte.


Non justement contrairement à ce que j'aurais pensé ca marche for t
bien comme ca
tout reste en arrière plan pas besoin ni d'iinstancier de rechef ou
Set myXl = createObject("c:testou.xls") irait sans doute aussi..


donc je remercie Anacoluthe sans qui je ne connaitrais pas cette
possibilité

Aurais-je droit � des remerciements comme Anacoluthe ?


Mais bien sûr, tu as de toutes façons toute ma gratitude pour tou tes
tes contributions
et depuis longtemps... et ainsi tout ce que j'ai appris aussi grâce à
toi..y compris dans des ficelles
tumultueuses...poussant parfois un peu loin l'émulation..
j'allais dire cher Maître, ...je ne vais pas quand même pas trop en
rajouter, ...
de toutes façons je resterai un disciple résolument rotor et diss ippé.

CordiAmicalment.

--
LSteph

michdenis a écrit :
Bonjour LSteph,

Cette ligne de code signifie que l'application (une instance) Excel est d �j� ouverte.
Ce n'est pas �vident d'autant plus que le travail se fait ï¿ ½ partir de Word.
Set myXL = GetObject("c:testou.xls")

Sinon, il aurait fallu �crire :
Set myXl = createObject("c:testou.xls")

Il faudrait aussi ajouter :
myXL.Visible =True 'ce n'est pas n�cessaire, seulement pour les tests.
Set Wk = Xl.workbooks.open("c:testou.xls")

'Corriger cette ligne :
myTab = Wk.names("maliste").referstorange

Dans tous les cas, cette approche semble pr�f�rable afin de
s'assurer la non-interf�rence dans le d�roulement des op �rations.

Aurais-je droit � des remerciements comme Anacoluthe ?
;-))

MichD
--------------------------------------------
Avatar
Alex
Re Bonjour,

Merci pour ces corrections, que je vais mettre en application dès que
j'en serais à la mise en place en dur.
Je me permets de revenir vers toi concernant ta réponse de
ColumnWidths : Après un petit F1 sur ce mot clé depuis Visual Basic,
il me parle d'Items ? (Je sais pas ce que c'est), mais j'ai comme meme
tenté d'entrer des valeurs sous la forme 90;90;90, comme il était
indiqué, mais malheureusement je ne vois pas de changement à part peut
etre le nombre de caracteres affichés, ce qui resoud pas mon probleme.
J'ai aussi mis à False Autosize pensant que c'est deux parametres
étaient liés.
Sans tout changé de ta macro qui est superbe, et en ajoutant un
Textbox en dessous de mon Combobox, celle ci pourrait elle me
rapporter ma seconde ligne que je positionnerai dans dans mon tableau
dans la colonne d'a coté ? (GGGrrr qu'il chiant cet Alex ;-) - si
c'est pas possible, alors je me contenterai d'une seule et unique
grande ligne avec toutes les infos)

Par ailleurs, je suis content, j'ai réussi à oter à l'impression le
cadre et le carré du combobox en modifiant Showdropbuttion = 1 et
SpecialEffect = O, comme ca c'est invisible et plus propre pour une
édition.

Merci encore pour ton aide précieuse.
Alex
Avatar
michdenis
| mais j'ai comme meme tenté d'entrer des valeurs sous la forme 90;90;90

On ne peut pas faire des retour à la ligne dans un listbox ou combobox. Ce n'est pas discutable sauf si tu t'adresses à
Microsoft directement.

La seule chose possible est de déterminer la largeur des colonnes.
Une ListBox ou ComboBox, ce n'est pas fait pour afficher de long texte...

Les éléments sur lesquels tu peux jouer...

With UserForm1.ComboBox1
.ColumnCount = 3
.ColumnWidths = "200;200;200"
.Width = 610
.Font.Size = 6
End With


À la limite, tu peux ajouter 3 textbox au formulaire et lorsque tu cliques sur un item
de ton listbox, chaque colonne de l'item sélectionné de ton listbox s'affiche
respectivement dans les textbox.






MichD
--------------------------------------------
"Alex" a écrit dans le message de groupe de discussion :


Re Bonjour,

Merci pour ces corrections, que je vais mettre en application dès que
j'en serais à la mise en place en dur.
Je me permets de revenir vers toi concernant ta réponse de
ColumnWidths : Après un petit F1 sur ce mot clé depuis Visual Basic,
il me parle d'Items ? (Je sais pas ce que c'est), mais j'ai comme meme
tenté d'entrer des valeurs sous la forme 90;90;90, comme il était
indiqué, mais malheureusement je ne vois pas de changement à part peut
etre le nombre de caracteres affichés, ce qui resoud pas mon probleme.
J'ai aussi mis à False Autosize pensant que c'est deux parametres
étaient liés.
Sans tout changé de ta macro qui est superbe, et en ajoutant un
Textbox en dessous de mon Combobox, celle ci pourrait elle me
rapporter ma seconde ligne que je positionnerai dans dans mon tableau
dans la colonne d'a coté ? (GGGrrr qu'il chiant cet Alex ;-) - si
c'est pas possible, alors je me contenterai d'une seule et unique
grande ligne avec toutes les infos)

Par ailleurs, je suis content, j'ai réussi à oter à l'impression le
cadre et le carré du combobox en modifiant Showdropbuttion = 1 et
SpecialEffect = O, comme ca c'est invisible et plus propre pour une
édition.

Merci encore pour ton aide précieuse.
Alex
Avatar
michdenis
J'en demandais pas tant !
;-))


MichD
--------------------------------------------
Avatar
michdenis
Oui effectivement cela fonctionne...

Set Wk = GetObject("c:book1.xls")

En supposant qu'aucune instance d'Excel n'est ouverte
Le hic, c'est que cette ligne de code ouvre le classeur,
mais ni Excel ni le classeur lui-même ne sont visibles!
Si l'on veut voir le classeur, il faut d'abord afficher
l'application et afficher ensuite le classeur.
Voici un bout de code à cet effet

'------------------------------
Sub test()
Dim Wk As Object
Set Wk = GetObject("c:book1.xls")
'Pour rendre l'application Excel visible
Wk.Parent.Visible = True
'Pour rendre le classeur visible
Wk.Windows(1).Visible = True
'sélectionner la première feuille du classeur
Wk.worksheets(1).Select
'Sélectionner la cellule indiquée.
Wk.worksheets(1).Range("G25").Select
End Sub
'------------------------------

'C'est ceci que j'avais en tête lorsque j'ai lu ton message rapidement
et ça, ça ne fonctionne pas si aucune instance d'Excel n’est déjà ouverte.
'------------------------
Sub test2()
Dim Xl As Object
Set Xl = GetObject(, "Excel.Application")
End Sub
'------------------------

Désolé pour la confusion.

MichD
--------------------------------------------
"LSteph" a écrit dans le message de groupe de discussion :


Bonjour,

Cette ligne de code signifie ..est d�j� ouverte.


Non justement contrairement à ce que j'aurais pensé ca marche fort
bien comme ca
tout reste en arrière plan pas besoin ni d'iinstancier de rechef ou
Set myXl = createObject("c:testou.xls") irait sans doute aussi..


donc je remercie Anacoluthe sans qui je ne connaitrais pas cette
possibilité

Aurais-je droit � des remerciements comme Anacoluthe ?


Mais bien sûr, tu as de toutes façons toute ma gratitude pour toutes
tes contributions
et depuis longtemps... et ainsi tout ce que j'ai appris aussi grâce à
toi..y compris dans des ficelles
tumultueuses...poussant parfois un peu loin l'émulation..
j'allais dire cher Maître, ...je ne vais pas quand même pas trop en
rajouter, ...
de toutes façons je resterai un disciple résolument rotor et dissippé.

CordiAmicalment.

--
LSteph

michdenis a écrit :
Bonjour LSteph,

Cette ligne de code signifie que l'application (une instance) Excel est d�j� ouverte.
Ce n'est pas �vident d'autant plus que le travail se fait � partir de Word.
Set myXL = GetObject("c:testou.xls")

Sinon, il aurait fallu �crire :
Set myXl = createObject("c:testou.xls")

Il faudrait aussi ajouter :
myXL.Visible =True 'ce n'est pas n�cessaire, seulement pour les tests.
Set Wk = Xl.workbooks.open("c:testou.xls")

'Corriger cette ligne :
myTab = Wk.names("maliste").referstorange

Dans tous les cas, cette approche semble pr�f�rable afin de
s'assurer la non-interf�rence dans le d�roulement des op�rations.

Aurais-je droit � des remerciements comme Anacoluthe ?
;-))

MichD
--------------------------------------------
1 2