OVH Cloud OVH Cloud

ComboBox (ou ListBox)

8 réponses
Avatar
Jero
Bonjour à tous,
Dans un formulaire j'ai un contrôle ComboBox :

Comment faire référence à la plage A1:C12 (par exemple) du classeur Truc.xls
situé dans le dossier Machin. pour alimenter la liste ?

A chaque fois que j'essaie de rentrer un truc du genre
C:\Machin\Truc.xls!Feuil1!A1:C12, je me "fais jeter".

L'aide Microsoft précise :

la propriété RowSource accepte des plages de feuilles de travail de
Microsoft Excel.

Mais ne donne aucun exemple de syntaxe.

Merci d'avance aux spécialistes du VBA sous Word

jero

8 réponses

Avatar
Corona
Bonsoir Jero,
Voici un exemple avec un "ListBox"
L'exemple utilise une plage nommée en Excel donc dans cet exemple
définit dans excel pnMaPlage pour la feuil1 "A1:C12" ou "A2:C12" si tu as un
titre.
Si tu n'as pas de titre mets .ColumnHeads = False (ou supprime la ligne
simplement)
Attention NbCol doit valoir le nombre exact de colonne (pas eu le temps
de tester la correction automatique par rapport à la plage nommée.
Philippe
++++++++++++++++++++++++++++++++++++++++++++++++++++
Private Sub UserForm_Initialize()
Chemin = "C:MachinTruc.xls"
LaPlage = "pnMaPlage"
Set xls = Nothing
Set xls = New Excel.Application
Set Classeur = xls.Workbooks.Open(Chemin)

Dim Col As Integer, count As Integer, NbCol, x As Integer
NbColPlage = UBound(Names(LaPlage).RefersToRange.Value, 2)
NbCol = 3 ' Définit le nombre de colonnes dans la plage
ReDim MyArray(Range(LaPlage).count / NbCol, NbCol)

With ListBox1
.ColumnHeads = True ' Si pas de titre = False
.ColumnCount = NbCol
End With

For Each L In Range(LaPlage)
x = x + 1
If (x Mod NbCol) = 0 Then Col = NbCol - 1 Else Col = (x Mod NbCol) - 1
MyArray(count, Col) = L

If (x Mod NbCol) = 0 Then count = count + 1
Next
ListBox1.List() = MyArray
End Sub
Private Sub UserForm_Terminate()
Termine
End Sub
Sub Termine()
xls.DisplayAlerts = False
xls.Quit
Set xls = Nothing
Me.Hide
End Sub

"Jero" <~ a écrit dans le message de
news:
Bonjour à tous,
Dans un formulaire j'ai un contrôle ComboBox :

Comment faire référence à la plage A1:C12 (par exemple) du classeur
Truc.xls

situé dans le dossier Machin. pour alimenter la liste ?

A chaque fois que j'essaie de rentrer un truc du genre
C:MachinTruc.xls!Feuil1!A1:C12, je me "fais jeter".

L'aide Microsoft précise :

la propriété RowSource accepte des plages de feuilles de travail de
Microsoft Excel.

Mais ne donne aucun exemple de syntaxe.

Merci d'avance aux spécialistes du VBA sous Word

jero




Avatar
Jero
Merci Philippe,
... ma question était un peu différente...
Je crée une ComboBox et dans la propriété RowSource comment je fais ( on
fait) pour faire référence à une plage de cellules d'Excel... sans passer
par le code que tu m'as gentiment fourni.
a+
Jero

"Corona" <Philippe Tulliez> a écrit dans le message de news:
%
Bonsoir Jero,
Voici un exemple avec un "ListBox"
L'exemple utilise une plage nommée en Excel donc dans cet exemple
définit dans excel pnMaPlage pour la feuil1 "A1:C12" ou "A2:C12" si tu as
un
titre.
Si tu n'as pas de titre mets .ColumnHeads = False (ou supprime la ligne
simplement)
Attention NbCol doit valoir le nombre exact de colonne (pas eu le temps
de tester la correction automatique par rapport à la plage nommée.
Philippe
++++++++++++++++++++++++++++++++++++++++++++++++++++
Private Sub UserForm_Initialize()
Chemin = "C:MachinTruc.xls"
LaPlage = "pnMaPlage"
Set xls = Nothing
Set xls = New Excel.Application
Set Classeur = xls.Workbooks.Open(Chemin)

Dim Col As Integer, count As Integer, NbCol, x As Integer
NbColPlage = UBound(Names(LaPlage).RefersToRange.Value, 2)
NbCol = 3 ' Définit le nombre de colonnes dans la plage
ReDim MyArray(Range(LaPlage).count / NbCol, NbCol)

With ListBox1
.ColumnHeads = True ' Si pas de titre = False
.ColumnCount = NbCol
End With

For Each L In Range(LaPlage)
x = x + 1
If (x Mod NbCol) = 0 Then Col = NbCol - 1 Else Col = (x Mod NbCol) - 1
MyArray(count, Col) = L

If (x Mod NbCol) = 0 Then count = count + 1
Next
ListBox1.List() = MyArray
End Sub
Private Sub UserForm_Terminate()
Termine
End Sub
Sub Termine()
xls.DisplayAlerts = False
xls.Quit
Set xls = Nothing
Me.Hide
End Sub

"Jero" <~ a écrit dans le message de
news:
Bonjour à tous,
Dans un formulaire j'ai un contrôle ComboBox :

Comment faire référence à la plage A1:C12 (par exemple) du classeur
Truc.xls

situé dans le dossier Machin. pour alimenter la liste ?

A chaque fois que j'essaie de rentrer un truc du genre
C:MachinTruc.xls!Feuil1!A1:C12, je me "fais jeter".

L'aide Microsoft précise :

la propriété RowSource accepte des plages de feuilles de travail de
Microsoft Excel.

Mais ne donne aucun exemple de syntaxe.

Merci d'avance aux spécialistes du VBA sous Word

jero








Avatar
Clément Marcotte
Bonjour,

De mémoire, la propriété RowSource d'un ComboBox ne fonctionne
"directement" que dans Excel. La procédure de Philippe permet de le
faire "indirectement" en récupérant les valeurs de la plage dans un
tableau VBA pour "alimenter" ensuite le contrôle. (En fait, ce sont
les mêmes contrôles pour toutes les applications Office, et, des fois,
l'aide vire les coins rond)

Sinon, un ensemble de routines pour "gérer" les comboboxes ou les
listboxes en passant par un fichier texte:

http://groups.google.com/groups?q=readline+combobox+OR+listbox+author:clement.marcotte%40sympatico.ca&hl=fr&lr=&selm=%23xwikTtBDHA.3144%40TK2MSFTNGP11.phx.gbl&rnum=1

ou là :

(Je pense que c'est la même chose (ou presque))

http://groups.google.com/groups?q=readline+combobox+OR+listbox+author:clement.marcotte%40sympatico.ca&hl=fr&lr=&selm=Oylp3YyvCHA.2124%40TK2MSFTNGP11&rnum=3


"Jero" <~ a écrit dans le message de
news:
Merci Philippe,
... ma question était un peu différente...
Je crée une ComboBox et dans la propriété RowSource comment je fais
( on

fait) pour faire référence à une plage de cellules d'Excel... sans
passer

par le code que tu m'as gentiment fourni.
a+
Jero

"Corona" <Philippe Tulliez> a écrit dans le message de news:
%
Bonsoir Jero,
Voici un exemple avec un "ListBox"
L'exemple utilise une plage nommée en Excel donc dans cet
exemple


définit dans excel pnMaPlage pour la feuil1 "A1:C12" ou "A2:C12"
si tu as


un
titre.
Si tu n'as pas de titre mets .ColumnHeads = False (ou supprime
la ligne


simplement)
Attention NbCol doit valoir le nombre exact de colonne (pas eu
le temps


de tester la correction automatique par rapport à la plage nommée.
Philippe
++++++++++++++++++++++++++++++++++++++++++++++++++++
Private Sub UserForm_Initialize()
Chemin = "C:MachinTruc.xls"
LaPlage = "pnMaPlage"
Set xls = Nothing
Set xls = New Excel.Application
Set Classeur = xls.Workbooks.Open(Chemin)

Dim Col As Integer, count As Integer, NbCol, x As Integer
NbColPlage = UBound(Names(LaPlage).RefersToRange.Value, 2)
NbCol = 3 ' Définit le nombre de colonnes dans la plage
ReDim MyArray(Range(LaPlage).count / NbCol, NbCol)

With ListBox1
.ColumnHeads = True ' Si pas de titre = False
.ColumnCount = NbCol
End With

For Each L In Range(LaPlage)
x = x + 1
If (x Mod NbCol) = 0 Then Col = NbCol - 1 Else Col = (x Mod
NbCol) - 1


MyArray(count, Col) = L

If (x Mod NbCol) = 0 Then count = count + 1
Next
ListBox1.List() = MyArray
End Sub
Private Sub UserForm_Terminate()
Termine
End Sub
Sub Termine()
xls.DisplayAlerts = False
xls.Quit
Set xls = Nothing
Me.Hide
End Sub

"Jero" <~ a écrit dans le
message de


news:
Bonjour à tous,
Dans un formulaire j'ai un contrôle ComboBox :

Comment faire référence à la plage A1:C12 (par exemple) du
classeur



Truc.xls
situé dans le dossier Machin. pour alimenter la liste ?

A chaque fois que j'essaie de rentrer un truc du genre
C:MachinTruc.xls!Feuil1!A1:C12, je me "fais jeter".

L'aide Microsoft précise :

la propriété RowSource accepte des plages de feuilles de travail
de



Microsoft Excel.

Mais ne donne aucun exemple de syntaxe.

Merci d'avance aux spécialistes du VBA sous Word

jero












Avatar
Jean-Guy Marcil
Jero was telling us:
Jero nous racontait que :

Merci Philippe,
... ma question était un peu différente...
Je crée une ComboBox et dans la propriété RowSource comment je fais (
on fait) pour faire référence à une plage de cellules d'Excel... sans
passer par le code que tu m'as gentiment fourni.


.RowSource pointant à Excel... je ne suis pas sûr.
Habituellement, je fais ceci et ça marche très bien:

'_______________________________________
Private Sub UserForm_Initialize()

Dim MyXL As Excel.Application
Dim MyWB As Excel.Workbook
Dim MySheet As Excel.Worksheet
Const MyPath As String = "X:"
Const WBName As String = "DataXL.xls"
Dim MyList() As Variant

Set MyXL = New Excel.Application
Set MyWB = MyXL.Workbooks.Open(MyPath & WBName)
Set MySheet = MyWB.Sheets("Feuil1")

MyList = MySheet.Range("A1", "C10").Value

With Me.ComboBox1
.ColumnHeads = False ' Si pas de titre = False
.ColumnCount = 3
.List() = MyList
.ColumnWidths = "20; 40; 40"
.ListIndex = -1
End With

MyWB.Close
Set MySheet = Nothing
Set MyWB = Nothing
Set MyXL = Nothing

End Sub
'_______________________________________

--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org

Avatar
Clément Marcotte
Et puis là, j'espère que les AMIS vont demander grâce. :-)
Avatar
JièL Goubert
Bonjoir(c) Clément Marcotte

Le 18/11/2004 19:59 vous avez écrit ceci :
Et puis là, j'espère que les AMIS vont demander grâce. :-)


Clément, depuis le temps qu'on le répète, c'est pas les macros qui nous
dérangent, loin de la, surtout si elle sont bien ecrite et réellement utiles
(des fois on en demande même :->) ; c'est juste le superfétatoire qui fait
réagir.
Pour te donner un exemple concret, écrire une macro pour mettre en gras est
totalement superfétatoire !!! Pourquoi ? ben tout simplement parceque la
fonctionnalité existe de façon intrinsèque dans le logiciel ; pourquoi ne
pas l'utiliser ???

Pour ce qui est de ta macro, rien à dire, je ne l'ai pas analysé, juste
survollé les nombreuses ligne de codes, mais je ne pense pas que l'on puisse
refaire ça sans macro, ou alors il faudrait que tu te suicide :-))))) si
jamais c'etait le cas, parceque écrire tout ça pour un truc existant dans le
logiciel, y'a de quoi se la prendre et se la mordre, non ? ;-)

Si tu n'utilises Word ou Excel que pour l'éditeur VBA, pourquoi ne pas en
rester au VB pur dans ce cas, et réinventer un Word par exemple ;-))) (mais
sans macro dans le nouveau word, heing... ;-)))

Tiens, une anecdote vécu.
Un jour un pote programmeur fou de turbo pascal (oui, ça pas tout jeune
comme histoire) viens me voir pour me montrer un superbe éditeur de texte
qu'il avait pondu... ça faisait un bon moment qu'il travaillait dessus tous
les soir chez lui, et il n'y avait pas encore toutes les fontionnalités
d'implantées. Il m'a montré les tonnes de ligne de codes pour arriver à ce
début de programme et il m'a demandé ce que j'en pensais, tout fier de son
job. Je lui ai dis "reste avec moi 5 mn et je te programme devant tes yeux
mon propre éditeur... le tout en 3 lignes de codes"
Il m'a regardé avec de grand yeux en se demandant si c'etait du lard ou du
cochon. ;-)
J'ai ecrit 3 lignes de codes que j'ai finalement rassemblé en 2 grace a
l'imprication de fonction, et en 5 mn il avait un éditeur parfaitement
opérationnel. Pas de chance, à cette époque je programmais avec Clipper et
il y avait des fonctions qui recréaient un editeur de texte ;-)))))))

C'est sur, il etait un peu faché aprés ça, mais du coup il a laissé tombé
son editeur pour se mettre à Clipper ;-))))))

Moralité : la roue existe depuis longtemps maintenant, l'améliorer c'est une
TRES bonne idée, mais vouloir la réinventer c'est de la bétise à mon avis ;-)))

--
JièL Ex MECHANTS(*) reconverti

Macroteurs
Espérants
Cacher (leur)
Humiliation (en)
Avilissant
Nos
Trucs
Surprenants

Avatar
Jero
Merci Clément,
C'était ma question...
Alimenter la liste avec un fichier .txt ou Word ou Excel ne me pose pas de
problème particulier...
Note : c'est un peu léger la dessus chez MicroSoft ; pourquoi trainer cette
propriété qui ne sert à rien... même si on devine - on sait, on se doute -
que Word et Excel ne sont développés avec les mêmes développeurs.
En plus, ce qui est remarquable c'est ce qui est dit dans l'Aide :
RowSource :
la propriété RowSource accepte des plages de feuilles de travail de
Microsoft Excel.
et malheureusement - comme d'habitude qd c'est pas très clair - pas
d'exemple...
Jero
"Clément Marcotte" a écrit dans le message
de news: e%
Bonjour,

De mémoire, la propriété RowSource d'un ComboBox ne fonctionne
"directement" que dans Excel. La procédure de Philippe permet de le
faire "indirectement" en récupérant les valeurs de la plage dans un
tableau VBA pour "alimenter" ensuite le contrôle. (En fait, ce sont
les mêmes contrôles pour toutes les applications Office, et, des fois,
l'aide vire les coins rond)

Sinon, un ensemble de routines pour "gérer" les comboboxes ou les
listboxes en passant par un fichier texte:

http://groups.google.com/groups?q=readline+combobox+OR+listbox+author:clement.marcotte%40sympatico.ca&hl=fr&lr=&selm=%23xwikTtBDHA.3144%40TK2MSFTNGP11.phx.gbl&rnum=1

ou là :

(Je pense que c'est la même chose (ou presque))

http://groups.google.com/groups?q=readline+combobox+OR+listbox+author:clement.marcotte%40sympatico.ca&hl=fr&lr=&selm=Oylp3YyvCHA.2124%40TK2MSFTNGP11&rnum=3


"Jero" <~ a écrit dans le message de
news:
Merci Philippe,
... ma question était un peu différente...
Je crée une ComboBox et dans la propriété RowSource comment je fais
( on

fait) pour faire référence à une plage de cellules d'Excel... sans
passer

par le code que tu m'as gentiment fourni.
a+
Jero

"Corona" <Philippe Tulliez> a écrit dans le message de news:
%
Bonsoir Jero,
Voici un exemple avec un "ListBox"
L'exemple utilise une plage nommée en Excel donc dans cet
exemple


définit dans excel pnMaPlage pour la feuil1 "A1:C12" ou "A2:C12"
si tu as


un
titre.
Si tu n'as pas de titre mets .ColumnHeads = False (ou supprime
la ligne


simplement)
Attention NbCol doit valoir le nombre exact de colonne (pas eu
le temps


de tester la correction automatique par rapport à la plage nommée.
Philippe
++++++++++++++++++++++++++++++++++++++++++++++++++++
Private Sub UserForm_Initialize()
Chemin = "C:MachinTruc.xls"
LaPlage = "pnMaPlage"
Set xls = Nothing
Set xls = New Excel.Application
Set Classeur = xls.Workbooks.Open(Chemin)

Dim Col As Integer, count As Integer, NbCol, x As Integer
NbColPlage = UBound(Names(LaPlage).RefersToRange.Value, 2)
NbCol = 3 ' Définit le nombre de colonnes dans la plage
ReDim MyArray(Range(LaPlage).count / NbCol, NbCol)

With ListBox1
.ColumnHeads = True ' Si pas de titre = False
.ColumnCount = NbCol
End With

For Each L In Range(LaPlage)
x = x + 1
If (x Mod NbCol) = 0 Then Col = NbCol - 1 Else Col = (x Mod
NbCol) - 1


MyArray(count, Col) = L

If (x Mod NbCol) = 0 Then count = count + 1
Next
ListBox1.List() = MyArray
End Sub
Private Sub UserForm_Terminate()
Termine
End Sub
Sub Termine()
xls.DisplayAlerts = False
xls.Quit
Set xls = Nothing
Me.Hide
End Sub

"Jero" <~ a écrit dans le
message de


news:
Bonjour à tous,
Dans un formulaire j'ai un contrôle ComboBox :

Comment faire référence à la plage A1:C12 (par exemple) du
classeur



Truc.xls
situé dans le dossier Machin. pour alimenter la liste ?

A chaque fois que j'essaie de rentrer un truc du genre
C:MachinTruc.xls!Feuil1!A1:C12, je me "fais jeter".

L'aide Microsoft précise :

la propriété RowSource accepte des plages de feuilles de travail
de



Microsoft Excel.

Mais ne donne aucun exemple de syntaxe.

Merci d'avance aux spécialistes du VBA sous Word

jero















Avatar
Jean-Guy Marcil
Jero was telling us:
Jero nous racontait que :

Merci Clément,
C'était ma question...
Alimenter la liste avec un fichier .txt ou Word ou Excel ne me pose
pas de problème particulier...
Note : c'est un peu léger la dessus chez MicroSoft ; pourquoi trainer
cette propriété qui ne sert à rien... même si on devine - on sait, on
se doute - que Word et Excel ne sont développés avec les mêmes
développeurs.



Je sais que c'est agaçant ces différences... Mais en fait Word et Excel
n'ont pas été et ne sont pas développé par les mêmes développeurs.
En fait, Excel (et Word aussi je crois) à été créé pour le MAC. Quand il a
fait le transfert à Windows (Excel 2.0), VBA et macros n'existaient pas.
Alors il n'y avait aucune raison de s'assurer que l'architecture interne
d'Excel soit compatible avec celle de Word ou des autres produits MSFT.
Pour un petit historique, voir
Excel http://dssresources.com/history/sshistory.html
Word http://weblogs.asp.net/chris_pratley/archive/2004/04/27/120944.aspx
(En anglais, désolé, en 5 minutes jen'ai pas trouvé de sites aussi complets
en français)

Mais de plus en plus MSFT réalise que ces différences sont agaçantes et
nuisibles. Chaque version fait des efforts pour diminuer les différences,
mais MSFT ne redéveloppera pas tous ses produit à partir de zéro pour tous
les mettre au même pas... Ce serait très difficile et les résultats ne
seraient pas garantis pour autant.

--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org