Liste déroulante avec données dans classeur fermé
Bonjour à vous chers internautes adeptes de excel. Ma question est simple à comprendre mais à résoudre ...
Je souhaite réaliser des listes déroulantes dans plusieurs fichiers seulement je ne veut garder qu'une seule base pour mes données.
Donc mes données sont dans un classeur fermé et je veux que mes listes puissent s'y référer.
Comment faire help !!
J'ai lu plusieurs choses notamment une histoire de ActiveX ComboX que je n'ai pas compris.
Merci de votre aide à plus
Bonjour,
Où veux tu tes listes déroulantes?
Dans une feuille excel ou dans un Formulaire?
A mon avis, quoiqu'il en soit il faudra faire ouvrir tes fichiers sources en arrière plan afin d'aller y puiser les données souhaitées.
Ou bien copier temporairement tes données dans le fichier "d'exploitation" et les supprimer une fois l'usage terminé.
Et bien je veux que mes listes soient dans un onglet excel, une liste par cellule. Ce sont des listes de choix pour l'utilisateur. J'aimerai justement ne pas avoir à ouvrir le classeur contenant les bases de données pour une liste. Et même si je copié l'onglet contenant les données dans mon classeur à son ouverture. Mes listes seraient inactives à moins que je les paramètre au préalable avec le bon nom de l'onglet que je vais copier.
Qui a des idées svp c'est un travail que je fais pour mon responsable donc je souhaiterai que ce soit propre.
Tu peux copier les les données dans ton classeur,Dans un onglet caché a l ouverture.
Ensuite tu initialises l alimentation de tes listes via une validation a partir de l'onglet qui contient tes données
Pourrais tu nous passer une copiebde tes fichiers?
Je ne peux pas vraiment te transferer mes fichiers car ils contiennent des données confidentielles. Mais je pense que l'idée de copier l'onglet à l'ouverture est bonne je vais essayer sa
Re à ceux qui suivent mon problème. J'ai décidé de copier à l'ouverture de mon classeur l'onglet (de l'autre classeur) contenant ma base de données. Seulement j'ai un problème à la ligne _Workbooks("Feuille_Offre_Customer.xlsm").Worksheets("Feuille pour Liste").Range("A1").Activate_
Private Sub Workbook_Activate()
Cheminx = ThisWorkbook.Path & "\Commun\00 - CHALLENGE\A.Pagano\CONSTRUCTION DOSSIER COMMANDE CLIENT\00-Portes QOC\"
Cheminx = Replace(Cheminx, "\Offre QOC", "")
estouvert = False
For Each fich In Workbooks
If fich.Name = "Feuille_Commande_Client.xlsm" Then estouvert = True
Next
If estouvert = False Then
Workbooks.Open Filename:=Cheminx & "Feuille_Commande_Client.xlsm"
'Workbooks.Open(Cheminx + "Feuille_Commande_Client.xlsm").Activate
End If
Workbooks("Feuille_Commande_Client.xlsm").Worksheets("Feuille pour Listes").Cells.Copy
Workbooks("Feuille_Offre_Customer.xlsm").Worksheets("Feuille pour Liste").Range("A1").Activate
ActiveSheet.Paste
Workbooks("Feuille_Commande_Client.xlsm").Close
End Sub
Il me mettent erreur '1004' mais je pense qu'il ne peut pas selectionner la range puisqu'il a des valeurs copiées encore selectionnées. Qui aurait donc une astuce pr contourner el problemo
Bonjour Toinou, bonjour le fil
Tu peux utiliser la technique ADO pour remplir ta Combobox
Voici le code principal
Sub RemplirCbx(ObjCbx As MSForms.ComboBox, sPathBdD As String, sTable As String, sCol As String)
' ObjCbx = Objet Combobox qui va recevoir le remplissage
' sPathBdD = Chemin complet + nom de la base Excel
' sTable = nom de l'onglet dans le fichier
' sCol = Lettre de la colonne dont la valeur est à retourner
Dim sSQL As String, sField As String, IdField As Integer
Dim MaCol As New Collection
' Calculer le numéro du champ à récupérer
IdField = Range(sCol & "1").Column - 1
' Créer une nouvelle instance ADO
Set Cnn = New ADODB.Connection
' Créer la connection
Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sPathBdD & ";Extended Properties='Excel 8.0;HDR=Yes'"
' Vider la combobox en question
ObjCbx.Clear
' Préparer la requête
If InStr(1, sTable, " ") > 0 Then
sSQL = "SELECT * FROM ['" & sTable & "$']"
Else
sSQL = "SELECT * FROM [" & sTable & "$]"
End If
' Créer le Recordset
Set Rs = New ADODB.Recordset
With Rs
.Open sSQL, Cnn, adOpenStatic
Do While Not .EOF
' Mémoriser le contenu du champ n° col-1
On Error Resume Next
sField = Rs.Fields(IdField).Value
MaCol.Add sField, sField
' Si aucune erreur
If Err.Number = 0 Then
ObjCbx.AddItem sField
ObjCbx.List(ObjCbx.ListCount - 1, 1) = Rs.Fields(0)
ObjCbx.List(ObjCbx.ListCount - 1, 2) = Rs.Fields(2)
ObjCbx.List(ObjCbx.ListCount - 1, 3) = Rs.Fields(3)
End If
Err.Clear
On Error GoTo 0
' Enregistrement suivant
.MoveNext
Loop
.Close
End With
' Fermeture de la Bdd
Set Rs = Nothing
Cnn.Close: Set Cnn = Nothing
End SubEt la ligne que j'utilise pour lancer la procédure
Call RemplirCbx(Me.CbB_Poste, sPath & sBdD, "PERSONNEL", "H")A+
Salut bruno and the others, alors j'ai vu ton post avec la méthode des combobox. Je te remercie mais en l'occurence je me suis affranchi de cette méthode car je travaille directement sur le classeur. J'ai trouvé la solution à mon problème. Voici comment copier coller l'onglet d'un classeur dans un autre à l'ouverture. Attention de bien utiliser le "_Open" dans thisworkbook. C'est vraiment une méthode basique :
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Application.Visible = False
Cheminx = ThisWorkbook.Path & "\Commun\00 - CHALLENGE\A.Pagano\CONSTRUCTION DOSSIER COMMANDE CLIENT\00-Portes QOC\"
Cheminx = Replace(Cheminx, "\Offre QOC", "")
Workbooks.Open Filename:=Cheminx & "Feuille_Commande_Client.xlsm"
Workbooks("Feuille_Commande_Client.xlsm").Worksheets("Feuille pour Listes").Cells.Copy
Workbooks("Feuille_Offre_Customer.xlsm").Activate
Sheets("Feuille pour Liste").Activate
Range("A1").Select
ActiveSheet.Paste
Sheets("Feuille de saisies").Activate
Range("B27").Select
Application.DisplayAlerts = False
Workbooks("Feuille_Commande_Client.xlsm").Close
Application.ScreenUpdating = True
Application.Visible = True
End Sub
Re,
Dans ce cas, pourquoi ne pas utiliser OLE automation (plus propre)
Dim CheminX As String, Wbk As Workbook
CheminX = ThisWorkbook.Path & "\Commun\00 - CHALLENGE\A.Pagano\CONSTRUCTION DOSSIER COMMANDE CLIENT\00-Portes QOC\"
CheminX = Replace(CheminX, "\Offre QOC", "")
' Récupérer des données d'un classeur fermé par OLE automation
' Ouverture de l'objet en question
Set Wbk = GetObject(PathName:=CheminX & "Feuille_Commande_Client.xlsm")
' Copie des données
Wbk.Worksheets("Feuille pour Listes").Cells.Copy _
Destination:=Workbooks("Feuille_Offre_Customer.xlsm").Sheets("Feuille pour Liste").Range("A1")
' Fermeture de l'objet (workbook) sans sauvegarde
Wbk.Close SaveChanges:=False
' Activer la feuille de saisie (au cas ou)
Sheets("Feuille de saisies").Activate
Range("B27").SelectA+
J'ai bien fais de relook ce post. Un grand merci à toi Bruno je ne connaissait pas cette méthode mais elle est bien plus propre que du basique comme j'avais pu le faire.
Encore merci ça marche niquel et ça m'évitera des petits bug entre fichiers !!
++