Rowsource / Combobox

  • Initiateur de la discussion Mimi
  • Date de début
M

Mimi

Guest
Bonjour à tous ,

Voilà j'ai un soucis dans une de mes macros ..
Je dois remplir la liste de ma combobox à partir d'une liste se trouvant dans un classeur d'un autre fichier ..

Comment spécifier le chemin d'accès à ma combobox à partir d'un rowsource ? (car la méthode additem n'est pas adaptée la liste étant bcp trop longue )

En mettant directement le chemin

Me.Liste.RowSource = 'C:[FichierB]Feuil1!A1:A' & Sheets('Feuil1').Cells(1, 1).End(xlDown).Row

ca ne marche pas .'erreur 380'

Quelqu'un peut il venir à mon secours ?
Le fichier B doit il etre ouvert en meme temps? ou bien est ce un problème juste de chemin ?

Merci pour vos aides ..
 

MichelXld

XLDnaute Barbatruc
bonjour Mimi

peux tu préciser ce que tu veux dire par
'la méthode additem n'est pas adaptée la liste étant bcp trop longue'

en attendant , ci joint 2 exemples pour alimenter la ComboBox


si le classeur 'FichierB.xls' est ouvert :

Code:
Private Sub UserForm_Initialize()
Dim i As Integer

For i = 1 To Workbooks('FichierB.xls'Â'Â').Sheets('Feuil1'Â'Â').Range('A1'Â'Â').End(xlDown).Row
ComboBox1.AddItem Workbooks('FichierB.xls'Â'Â').Sheets('Feuil1'Â'Â').Cells(i, 1)
Next i
End Sub


si le classeur 'FichierB.xls' est fermé :

Code:
Private Sub UserForm_Initialize()
'nécessite d'activer la référence Microsoft ActiveX Data Object 2.x Library
Dim Rs As ADODB.Recordset
Dim Cn As String
Dim Cible As String
Dim Fichier As String

Fichier = 'C:\\FichierB.xls' 'adapter le chemin

Cn = 'DRIVER={Microsoft Excel Driver (*.xls)};' & _
        'ReadOnly=1;DBQ=' & Fichier

    Cible = 'SELECT * FROM [Feuil1$];'

Set Rs = New ADODB.Recordset
Rs.Open Cible, Cn, adOpenForwardOnly, adLockReadOnly, adCmdText

'les données à récuperer sont dans la colonne A
If Not Rs.EOF Then
    ComboBox1.AddItem Rs.Fields(0).Name 'entete
    
    Do While Not Rs.EOF
    ComboBox1.AddItem Rs.Fields(0).Value
    Rs.MoveNext
    Loop
End If

Rs.Close
Set Rs = Nothing
End Sub


bon apres midi
MichelXld

Message édité par: MichelXld, à: 16/05/2005 12:21
 
M

Mimi

Guest
Merci Michel ..

je vais travailler ce que tu m'as envoyé ..
pour AddItem, le pb est que j'ai une liste de 1500 lignes donc impossible d'ajouter un à un dans le code chacune des données .. AddItem1 , additem 2,additem3 ..

Je pense que la méthode rowsource est plus adaptée si elle marchait ;-)

Je vais essayer d'améliorer ma macro avec tes codes,

d'alleurs les fichiers A et B sont en réseau et ne seront pas donc sur mon disque dur C , cela change t 'il qq chose dans ton programme ?

:whistle:
 

MichelXld

XLDnaute Barbatruc
rebonjour Mimi

comme tu peux le voir dans le premier exemple , tu n'est pas obligé d'ecrire ComboBox1.AddItem pour chaque ligne à recuperer

il te suffit de chercher la premiere cellule vide dans la colonne A
Workbooks('FichierB.xls').Sheets('Feuil1').Range('A1').End(xlDown).Row

et ensuite de créer une boucle sur les lignes 1 à i de la colonne A
ComboBox1.AddItem Workbooks('FichierB.xls').Sheets('Feuil1').Cells(i, 1)


j'espere que ça pourra t'aider
bon apres midi
MichelXld

Message édité par: MichelXld, à: 16/05/2005 13:04
 
M

Mimi

Guest
Effectivement Michel, je ne voyais pas la fonction additem comme cela .. je pensais qu'elle m'obligeait à préciser la valeur de chaque donnée possible directement dans le code .

POur le code que tu m'as envoyé j'ai un ptit soucis sur le premier lorsque le fichier B est ouvert.
Comme mes fichiers ne peuvent pas etre à la racine d'un répertoire j'ai du créer un répertoire où mes fichiers A et B se trouvent, le chemin serait alors : 'D : [Travail\\FichierB .xls]Feuil1!A1:A'


et le code :

Private Sub UserForm_Initialize()

Dim i As Integer
For i = 1 To Workbooks('D:\\Travail\\FichierB.xls').Sheets('Feuil1').Range('A1').End(xlDown).Row

Liste.AddItem Workbooks('D:\\Travail\\FichierB.xls').Sheets('Feuil1').Cells(i, 1)
Next i
End Sub


Mais il y a une erreur d'exécution 9 'l''indice n'appartient pas à la sélection' ..

Vois tu le problème dans mon code ?
- est ce que le chemin que j'ai mis est correct du point de vue synthaxe ie crochets, parenthèses ...
- vois tu le pb ??

Pour le second code, je le comprends beaucoup moins, je débute en VB mais c'est celui que je compte utiliser à terme car le fichier B ne sera pas à chaque utilisation ouvert ...
 
M

Mimi

Guest
Ouppszs .. Je te remets le code j'avais oublié un crochet que j'ai bien mis dans mon code ..


Private Sub UserForm_Initialize()

Dim i As Integer
For i = 1 To Workbooks('D:Travail\\FichierB.xls').Sheets('Feuil1').Range('A1').End(xlDown).Row

Liste.AddItem Workbooks('D:Travail\\FichierB.xls').Sheets('Feuil1').Cells(i, 1)
Next i
End Sub


Merci encore pour ton aide , Michel .. ;-)
 

MichelXld

XLDnaute Barbatruc
rebonjour Mimi


remplaces

Workbooks('D:TravailFichierB.xls').Sheets('Feuil1').Range('A1').End(xlDown).Row

par

Workbooks('FichierB.xls').Sheets('Feuil1').Range('A1').End(xlDown).Row

( sans le chemin du classeur ) comme dans le 1er exemple que je t'ai proposé

sinon , est ce que dans le fichierB tu as bien une feuille nommée 'Feuil1' ?


bon apres midi
MichelXld

Message édité par: MichelXld, à: 16/05/2005 15:22
 
M

Mimi

Guest
Bravo Michel et Minick !!!

Ca marche lorsque le classeur est ouvert !!!

Pour le moment je vais garder ce code !!

:woohoo:

Je vais essayer d'adapter le code pour le cas où le fichier est fermé .. mais c'est déjà super que ca marche avec le fichier ouvert !!

Merci encore !!

A bientot , Mimi

Ps :Michel, comment activer la commande dont tu me parle ' .. library' ?? et pour le code je ne change rien à part mes noms de fichiers et le chemin ?
 

MichelXld

XLDnaute Barbatruc
rebonjour Mimi

pour activer la reference
dans l'éditeur de macros
Outils
Reference
coches la ligne 'Microsoft ActiveX Data Object x.x Library' ( x.x dépendant de la version utilisée )
cliques sur OK pour valider

normalement la macro doit fonctionner tel quel
tu as juste à adapter le chemin et le nom du classeur fermé
t'assurer que les données à recuperer sont bien dans la colonne A (de A1 à Axx )
et que ces données sont dans la feuille nommée Feuil1
si cela fonctionnait avec le classeur ouvert , il ne devrait pas y avoir de soucis


tu as d'autres données dans ce classeur fermé ?
il y aura peut etre une adaptation à faire si par exemple dans les autres colonnes , le nombre de lignes est plus important que dans la colonne A .

bon apres midi
MichelXld

Message édité par: MichelXld, à: 16/05/2005 16:45
 
M

Mimi

Guest
J'ai essayé le code pour le fichier fermé ..

j'ai essayé d' activer dans outils/réference la library mais je ne connais pas la version utilisée, la 2.0 est déjà activée et lorsque je coche l'une d'elle ( de 2. 0 jusque 2.7) une fenetre apparait ' Nom de module, de projet ou de bibliothèque d'objets déjà utilisé' ??

Tu sais ce que cela veut dire ?

et malheureusement lorsque j'essaye de faire tourner le code, soucis : erreur d'execution , le type ne correspond pas .. vois tu quel est le pb ?

Et oui Michel .. j'apprends au fur et à mesure .. merci encore ..

Bonne fin de journée, Mimi
 

MichelXld

XLDnaute Barbatruc
rebonjour Mimi

il ne faut cocher qu'une version (celle de ton choix) si tu es le seul à utiliser le classeur , coches la plus élevée

attention si d'autres personnes sont succeptibles d'utiliser le classeur et qu'elles utilisent une version anterieure il faut cocher une version la plus basse commune


bonne soiree
MichelXld
 
M

Mimi

Guest
A Michel :

De retour ce matin et motivée .. j'ai activé comme tu me l'avais conseillé la plus petite des versions car c'est bien un fichier utilisé en réseau.

Je n'ai plus la première erreur sur 'nom de projet .. deja utilsé'.

Mais lorsque je lance le code , la meme erreur s'affiche:
'erreur d'execution '-2147352571(800200005)' , le type ne correspond pas ' ?

Vois tu le problème ?

Dim Rs As ADODB.Recordset
Dim Cn As String
Dim Cible As String
Dim Fichier As String

Fichier = 'D:\\Travail\\FichierB.xls'
Cn = 'DRIVER={Microsoft Excel Driver (*.xls)};' & _
'ReadOnly=1;DBQ=' & Fichier

Cible = 'SELECT * FROM [Feuil1$];'

Set Rs = New ADODB.Recordset
Rs.Open Cible, Cn, adOpenForwardOnly, adLockReadOnly, adCmdText

'les données à récuperer sont dans la colonne A

If Not Rs.EOF Then
Liste.AddItem Rs.Fields(0).Name 'entete k j'ai nommé Name pour simplifier aussi, ma combobox s'appelle Liste

Do While Not Rs.EOF
Liste.AddItem Rs.Fields(0).Value
Rs.MoveNext
Loop
End If

Rs.Close
Set Rs = Nothing



Je n'ai changé que le chemin et adapté le nom de ma combobox.
Rien de plus, je ne sais pas d'ou vient cette erreur ..

Mimi

ps : merci du temps que tu as consacré à m'aider, Michel,c'est très gentil et au moins je m'améliore (enfin je crois!)..
 

Statistiques des forums

Discussions
312 242
Messages
2 086 528
Membres
103 243
dernier inscrit
SAH