Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Userform avec données externes fichier fermé (ADO)

  • Initiateur de la discussion Initiateur de la discussion pmfontaine
  • 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 !

pmfontaine

XLDnaute Occasionnel
Bonjour,
Je cherche le code pour lié un userform avec une base de données externe (fichier excel qui reste fermé)
Sur http://boisgontierjacques.free.fr/pages_site/ado.htm#CopyFrom j'ai trouvé des pistes avec ADO, mais je ne suis pas arrivé à les utiliser.
Je précise que les combobox sont liés (Grasse à ce forum et en particulier à Dranreb)

Sur le fichier joint FICHIER_DESTINATION.xlsm je souhaiterais que la table TabEspGlo qui est sur la page SOURCE soit sur un autre fichier BD_SOURCE.xlsx qui sera dans le même dossier et qui restera fermé grasse à ADO si j'ai bien compris le site de boisgontier Jacques.
(NB : La table TabEspGlo comporte plus de 220 000 lignes)
Merci d'avance pour votre aide
Patrick
 

Pièces jointes

Bonjour Dranreb, Bonjour le Forum.
Suite à la suggestion de Dranreb, j'ai séparé ma BD (une colonne et 220 000 ligne) en plusieurs colonnes chacune correspondante à une famille.
Mais j'ai un problème pour définir la plage variable
Lorsque j'écris :
Code:
Ajt.plage FEspèces1.Range("S2:U2"), True
CE CODE MARCHE, MAIS SI JE MODIFIE POUR AVOIR UNE PLAGE VARIABLE,
Code:
Ajt.plage FEspèces1.Range(Cells(2, Colonne), Cells(2, Colonne + 2)), True
CA NE MARCHE PLUS ET JE NE COMPRENDS PAS CE QUI COINCE ?
Message :
Erreu d'exécution '1004':
La méthode 'Range de l'objet'Worksheet' a échoué

Le code complet :
Code:
Private Sub CBxAjouOrdre_Change()
    Dim AdresseFamille As Range
    Dim Colonne As Integer
   
If Me.CBxAjouOrdre = "" Then Exit Sub
    Famille = Me.CBxAjouOrdre

Set AdresseFamille = Sheets("SOURCE").Range("1:1").Find(Famille, LookIn:=xlValues, lookat:=xlWhole)
If Not AdresseFamille Is Nothing Then
    Colonne = AdresseFamille.Column
    MsgBox Colonne
     Set AdresseFamille = Nothing
Else
   MsgBox "valeur " & AdresseFamille & " non trouvée"
   Exit Sub
End If

Set Ajt = New ComboBoxLiées
'Ajt.plage FEspèces1.Range("S2:U2"), True 'CA MARCHE
Ajt.plage FEspèces1.Range(Cells(2, Colonne), Cells(2, Colonne + 2)), True 'NE MARCHE PAS ?
Ajt.Add CBxAjouNomVerna, 1
Ajt.Add CBxAjouNomLatin, 2
Ajt.Add CBxAjouCD_NOM, 3
Ajt.Actualiser

End Sub
Merci d'avance pour votre aide
Patrick
 

Pièces jointes

Bonjour.
N'essayez pas de le faire. Démarrez sur les oiseaux ou les mammifères, et Initialisez tout une seule fois dans la UserForm_Initialize. Mais au CBxAjouOrdre_Change faites seulement un :
VB:
Ajt.Actualiser NouvellePlage:=FEspèces1.[C2:E2].Offset(, 4 * CBxAjouOrdre.ListIndex), NbCol:=True

Remarque: De mon coté j'envisageais même plutôt de mettre chaque ordre dans une feuille séparée.
 
Cela dit votre solution aurait pu marcher si vous aviez mis :
Ajt.plage FEspèces1.Range(FEspèces1.Cells(2, Colonne), FEspèces1.Cells(2, Colonne + 2)), True
parce que sinon il prends toujours les AciveSheet.Cells et on ne peut pas former avec ça un FEspèce1.Range si ce n'est pas la feuille active.
 
Merci Dranreb pour votre réponse rapide.
J'ai rapidement testé votre proposition qui marche bien.
Je testerais complètement avec toutes les données ultérieurement.
Pour la solution que j'envisagée ça marche avec votre syntaxe, mais il semble qu'il y ai des problèmes entre les Comboboxs.
je vérifierais également ce point plus tard.
Merci beaucoup pour votre aide précieuse
Patrick
 
Bonsoir mpfontaine
Bonsoir Dranreb, le Forum
Une approche non finalisée (je ne sais pas a quoi servent les Boutons "Vider et Ajouter" ) Lol
U
Une interpretation de l idee suggeree par Dranreb (les feuilles sources sont masquees)
Bonne fin de Soirée
Jean marie
 

Pièces jointes

Dernière édition:
Bonsoir Jean marie, le Forum
Merci Jean marie de t’intéresser à mon problème, je viens de regarder ta proposition qui me semble bien fonctionner.
Mais il me faudra quelques jours pour comprendre le code car je ne suis qu'un bricoleur en VBA.
Je vous tiendrai au courant de l'évolution de mon projet
Merci et bon dimanche à tous
 
Bonsoir Le Forum,
Jean marie, j'ai regardé ta proposition mais ce n'est pas de mon niveau et j'ai beaucoup de mal a comprendre.
Du coup je suis resté sur la proposition de Dranreb et voila le résultat si ça peut aider quelqu'un.
Bien sur ce n'est pas du vba de pro mais ça fonctionne et pour moi ça me convient.
Merci à tous de l’intérêt que vous avez eu pour mon problème.
Patrick
 

Pièces jointes

Bonjour.
J'ai quand même un peu peur que le Ajt.Actualiser ne se fasse pas correctement à la fin de CBnRajoutEspece_Click()
Rien ne lui indique en effet que la plage s'est agrandie.
En général quand ce n'est pas une plage mise sous forme de tableau, je copie la dernière ligne et l'insère devant elle même puis j'écrase l'original devenu la nouvelle dernière ligne par les nouvelles données. Ça corrige automatiquement un objet Range qui englobais l'ancienne plage, ce qui n'est pas le cas si on ajoute quelque chose derrière elle.
Inutile de chercher la dernière ligne de la bonne colonne avec un End(xlDown), l'objet ComboBoxLiées la détient déjà: c'est Ajt.PlgTablo.Row(Ajt.PlgTablo.Rows.Count)
 
Bonsoir
Merci Dranreb,
Pour le Ajt.Actualiser j'ai fais plusieurs essais et je n'ai pas rencontré de problème !
Je ne vois pas comment modifier mon code avec Ajt.PlgTablo.Row(Ajt.PlgTablo.Rows.Count) pour ne pas utiliser End(xlDown) ?
Tu peux me mettre sur la voie ?
Merci
 
- 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

P
Réponses
2
Affichages
3 K
P
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…