Demande d'information, récupérer dans une combobox une liste d'un autre classeur

  • Initiateur de la discussion Initiateur de la discussion zephir94
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

zephir94

XLDnaute Impliqué
Bonjour à tous,

J'ai deux classeurs dans un même répertoire et je voudrais récupérer dans une combobox une liste d'un autre classeur.
Le classeur source peut être ouvert ou fermé.
La liste que je souhaite récupérer est dans une plage nommée et dans une feuille de mon classeur A
La combobox où je souhaite récupérer cette liste est dans un userform de mon classeur B.

Merci par avance à ceux qui pourront m'expliquer comment faire avec qu'elle instruction ou méthode

Amicalement

Zephir94
 
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

Bonjour.
Le pied ce serait que s'il est ouvert, ce qui est récupéré ce soient les infos actualisées telle qu'elles sont à cet instant là dans l'autre poste sur lequel il est ouvert ! Mais je suppose que ce n'est pas le cas ? Ou alors je déplore de n'avoir pas connu depuis longtemps les possibilités des objets de cette référence Microsoft ActiveX DataObject: ça m'aurait simplifié considérablement une application.
 
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

Merci BOISGONTIER,

Ta solution est parfaite.
Mais j'ai du mal à comprendre et à l'adapter à la forme de ma source, car si je l'ai organisée ainsi c'est que je peux rajouter des lignes par une macro.
J'essaie de l'adapter mais si tu peux aussi de ton côté me donner une solution de modification, je suis preneur !
Merci à toi
 
Dernière édition:
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

Bon c'est officiel je suis paumé, je n'arrive pas à adapter ton code avec mes combobox et ma recherche de zone nommée.
Voici mon code :

Code:
Function NomPlgContenant(ByVal Cel As Range) As String
Dim Cls As Workbook, N As Name, R As Range
Set Cls = Cel.Worksheet.Parent
On Error Resume Next
For Each N In Cls.Names
   Err.Clear: Set R = N.RefersToRange
   If Err = 0 Then
      If Not Intersect(R, Cel) Is Nothing Then
         NomPlgContenant = N.Name: Exit Function: End If: End If: Next N
NomPlgContenant = "(aucun)"
End Function

et mes combobox :

Code:
Private Sub ComboBox1_Change()
Dim X As Range, y As Range, a As String, l As Integer, c As Integer
Dim w As Range
Application.ScreenUpdating = False
ActiveSheet.Select
feuille_courante = ActiveSheet.Name
a = feuille_courante
With Feuil8
Feuil8.Select
Set X = Cells.find(ComboBox1.Text, , xlValues, xlWhole, , , False)
If Not X Is Nothing Then
   Set y = Cells(X.Row, "I")
  ' MsgBox "Le nom cherché est """ & NomPlgContenant(Y) & """."
 t = NomPlgContenant(y)
 'MsgBox t
   End If
If Me.ComboBox1.Value = X Then
Controls("ComboBox7").Style = fmStyleDropDownList
ComboBox7.List = Application.Transpose(Range(t))
ComboBox7.ListIndex = 0
End If
End With
Sheets(a).Select
Application.ScreenUpdating = True
End Sub
 
Dernière édition:
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

Un grand merci pour cette modification,

Code:
Dim f
Private Sub UserForm_Initialize()
  Set f = Sheets("bd2")
   ' Microsoft ActiveX DataObject doit être coché
  Set cnn = New ADODB.Connection
  répertoire = ThisWorkbook.Path & "\"
  fichier = "RisqueAdoSource.xls"
  cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & répertoire & fichier ' Fichier .xls
  Set rs = cnn.Execute("[BD2$A1:Z100]")
  f.[A1].CopyFromRecordset rs
  rs.Close
  cnn.Close
  Set rs = Nothing
  Set cnn = Nothing
  n = Application.CountA(f.[A1:A100])
  Me.ListBox1.List = f.[A1].Resize(n).Value
End Sub

Private Sub ListBox1_Click()
  lig = Me.ListBox1.ListIndex + 1
  i = 2
  Me.ListBox2.Clear
  Do While f.Cells(lig, i) <> ""
    Me.ListBox2.AddItem f.Cells(lig, i)
    i = i + 1
  Loop

Mon soucis est que cette liste est modulable donc j'ai crée des zones nommées ( elle sont dans mon fichier exemple ) et j'utilise du fait une macro pour trouver la dernière ligne vide dans la zone nommée pour y intégrer une nouvelle ligne :

Code:
Private Sub CommandButton1_Click()
Dim derli As Long
Dim derA As Long
Dim Lig As Long
Dim y As Range
With ActiveSheet
Application.ScreenUpdating = False
ActiveSheet.Select
feuille_courante = ActiveSheet.Name
a = feuille_courante
'MsgBox feuille_courante
Application.EnableEvents = False
derli = Range("C" & Rows.Count).End(xlUp).Row
derA = Range("B" & Rows.Count).End(xlUp).Row
If TextBox2.Value > Range("B" & derA).Value Then
Rows(20).Copy Destination:=Rows(derli + 3)
    Range("C" & derli + 3).Value = TextBox1.Value
        Range("B" & derli + 3).Value = (TextBox2.Value)
w = (derli + 4)
x = (derli + 5)
Set plage = Range("A" & w & ":M" & x)
plage.Name = ("risque" & TextBox2.Value)
plage.Select

With Feuil8
Feuil8.Select
Set plage = Range("risques")
With plage.Range("risques")
plage.Select

Lig = 5 'première ligne à vérifier
Do While Not IsEmpty(Range("B" & Lig))
    Lig = Lig + 1
Loop
Rows(Lig).Insert
Range("B" & Lig) = TextBox1.Value
  Range("I" & Lig) = TextBox3.Value
    Range("J" & Lig) = TextBox4.Value
       Range("K" & Lig) = TextBox5.Value
        Range("L" & Lig) = TextBox6.Value
           Range("M" & Lig) = TextBox7.Value
              Range("N" & Lig) = TextBox8.Value

'   Set y = Range("I" & Lig - 1)
'
' t = NomPlgContenant(y)
w = Range("H" & Lig - 1).Value
Set plage = Range("I" & Lig & ":N" & Lig)
plage.Name = ("List" & w + 1)
Range("H" & Lig).Value = w + 1

'MsgBox plage.Name
End With
End With
Else

MsgBox ("Le numéro" & TextBox2 & " " & " est déjà référencé , veuillez en choisir un autre." & Chr(10) & "Pour information, le dernier numéro  enregistré est le N°" & Range("B" & derA).Value & ""), vbInformation
Exit Sub
End If
Unload Me
Application.EnableEvents = True
End With
Range("K7").Value = Format(Date)
Sheets(a).Select

If checkox2.Value = True Then
Dim ligne As Long
With Feuil8
Feuil8.Select
Set plage = Range("loca2")
With plage.Range("loca2")
plage.Select
ligne = Range("loca2").End(xlUp).Row + 1
Rows(ligne + 1).Insert
MsgBox ligne
Range("B" & ligne + 1).Value = TextBox9.Value
End With
End With
End If
Application.ScreenUpdating = True
End Sub

à la lecture du code si je comprends bien tu copies les deux listes ?
j'ai donc deux questions, avec ton exemple peut on conserver mes listes et peut on utiliser des combobox au lieux de listbox ?

Un grand merci
 
Dernière édition:
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

Merci mais y a t'il moyen de travailler avec mes listes nommées ?
voici ma prog au départ :

Code:
Private Sub ComboBox1_Change()
Dim x As Range, y As Range, a As String, l As Integer, c As Integer
Dim w As Range
Application.ScreenUpdating = False
ActiveSheet.Select
feuille_courante = ActiveSheet.Name
a = feuille_courante
With Feuil8
Feuil8.Select
Set x = Cells.find(ComboBox1.Text, , xlValues, xlWhole, , , False)
If Not x Is Nothing Then
   Set y = Cells(x.Row, "I")
  ' MsgBox "Le nom cherché est """ & NomPlgContenant(Y) & """."
 t = NomPlgContenant(y)
 'MsgBox t
   End If
If Me.ComboBox1.Value = x Then
Controls("ComboBox7").Style = fmStyleDropDownList
ComboBox7.List = Application.Transpose(Range(t))
ComboBox7.ListIndex = 0
End If
End With
Sheets(a).Select
Application.ScreenUpdating = True
End Sub

ma rowsource de la Combobox1 étant :
=Base!risques

je récupère la liste de la combobox7 avec la variable t, t étant le nom de la liste correspondante au choix de la Combobox1



Mes listes sont dans classeur exemple A feuille base
car dans ton exemple il n'y a pas de zone nommée :

Code:
Set rs = cnn.Execute("[BD2$A1:Z100]")
  f.[A1].CopyFromRecordset rs
  rs.Close
  cnn.Close
  Set rs = Nothing
  Set cnn = Nothing
  n = Application.CountA(f.[A1:A100])
  Me.ComboBox1.List = f.[A1].Resize(n).Value
c'est l'intégration de mes listes que je n'arrive pas à adapter !
 
Dernière édition:
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

Je cherche depuis hier soir,

pour mon soucis ne serait-il pas plus logique de changer la rows source en indiquant mon classeur A

Code:
Me.ComboBox1.List Application.Transpose(Workbooks("classeur A.xls").Sheets(8).Range("risques"))

Je dois avoir un soucis de syntax car pour l'instant la Combobox de mon classeur B n'affiche pas la liste !

et ensuite appeler ma fonction de recherche du module1 du classeur A depuis mon classeur B pour afficher la liste correspondante dans mon Combobox7 du classeur B ?

Code:
result = Application.Run("classeur A.xls!Module1.NomPlgContenant")
MsgBox result

la prog du module1 du classeur étant :

Code:
Function NomPlgContenant(ByVal Cel As Range) As String
Dim Cls As Workbook, N As Name, R As Range
Set Cls = Cel.Worksheet.Parent
On Error Resume Next
For Each N In Cls.Names
   Err.Clear: Set R = N.RefersToRange
   If Err = 0 Then
      If Not Intersect(R, Cel) Is Nothing Then
         NomPlgContenant = N.Name: Exit Function: End If: End If: Next N
NomPlgContenant = "(aucun)"

End Function

Pour l'instant je tourne en rond !
 
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

J'ai aussi essayé d'adapter le code proposé en remplaçant par mes zones mais je n'ai que les 4 premieres lignes de ma liste dans la combobox1 !

Code:
 Private Sub UserForm_Initialize()
   Dim f
   Set f = Sheets("base")
    ' Microsoft ActiveX DataObject doit être coché
   Set cnn = New ADODB.Connection
   répertoire = ThisWorkbook.Path & "\"
   Fichier = "classeur A.xls"
   cnn.Open "DRIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1;DBQ=" & répertoire & Fichier ' Fichier .xls
   Set rs = cnn.Execute("[Base$risques]")
   f.[A1].CopyFromRecordset rs
   rs.Close
   cnn.Close
   Set rs = Nothing
   Set cnn = Nothing
   N = Application.CountA(f.[risques])
   Me.ComboBox1.List = f.[A1].Resize(N).Value
 End Sub
 
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

Je vais changer totalement de méthode,

Le plus simple serait de conserver mes listes et plutôt de remplacer ma feuil8 du classeurA à la feuil8 du classeurB

Comment faire cela dans un classeurB ouvert ou fermé ?
 
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

Bonjour.
Comment faire cela dans un classeurB ouvert ou fermé ?
Voulez vous dire "Comment faire cela en se basant sur un classeurA ouvert ou fermé ?"

Bien des références externes trop complexes, comme celles impliquant la fonction INDIRECT, ne supportent pas, en tant que source, les classeurs fermés. Mais un simple ='[classeur A.xls]Base'!$A$1:$W$37&"" validé en matriciel (Ctrl+Maj+Entrée) sur une plage de même dimension implanté au même endroit, marche en général, même si le classeur est fermé.
 
Dernière édition:
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

bonjour Dranred

je voudrais remplacer la feuil8 d'un classeur B par la feuil8 d'un classeur A, classeur ouvert ou fermé sur un réseau mais dans un même répertoire.
Cette feuil8 comporte des zones nommées et me sert de base pour alimenter deux Combobox.
 
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

Voir mon édit précédent, gardant la Feuil8 du classeur B, mais en veillant à ce qu'elles soit toujours conforme au contenu de la Feuil8 du classeur A, ouvert ou fermé.
Du moins aux cellules vides près, les cellules du B y faisant référence ayant une valeur non vide qui est celle d'un texte vide. Car Excel a cette gravissime lacune de ne pas permettre le renvoi par une formule d'une valeur de cellule ayant le statut de cellule vide. Si on ne concatène pas un texte vide "" derrière, il renvoie 0 au lieu de rien.
 
Dernière édition:
Re : Demande d'information, récupérer dans une combobox une liste d'un autre classeur

je ne veux pas utiliser de formules matricielle juste copier ma feuil8 du classeur A avec ses données ( écritures ) et zone nommée et remplacer la feuille8 du classeur B par celle du classeur A, classeur B ouvert ou fermé
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
9
Affichages
390
Retour