Gestion dynamique des Box Userform/Excel
Bonjour à tous
me revoilà avec une question concernant une gestion dynamique des box de mon formulaire, lors de le lecture/écriture sur l'onglet (Base dans le cas présent).
Après avoir balayé les différents forum, je n'ai rien trouvé qui puisse m'aider.
L'idée est de récupérer le nom des box en ligne 1 de l'onglet 'Base' afin de lire/compléter les box correspondantes du formulaire (FA).
J'ai une routine basée sur le même principe qui fonctionne sans souci.
Sub Nettoyage()
Dim Ctrl As Control
For Each Ctrl In FA.Controls
If TypeOf Ctrl Is MSForms.TextBox Then
Ctrl = ""
ElseIf TypeOf Ctrl Is MSForms.ComboBox Then
Ctrl.ListIndex = -1
ElseIf TypeOf Ctrl Is MSForms.CheckBox Then
Ctrl = False
ElseIf TypeOf Ctrl Is MSForms.OptionButton Then
Ctrl = False
End If
Next Ctrl
End SubLa routine suivante écrit sur le fichier Excel
Sub EnregFeuille()
Dim Ctrl As Control
Dim c As Long
Dim Cfin As Long
Dim ligne As Long
'Cfin = Range("A1").End(xlToRight).Column
WsBase.Activate
ligne = 17 ' pour tests, ajoute les données à la ligne 17 de l'onglet base
For Each Ctrl In FA.Controls
For c = 1 To 1 'Cfin
Set Ctrl = FA.Controls(WsBase.Cells(1, c))
If TypeOf Ctrl Is MSForms.TextBox Then
WsBase.Cells(ligne, c) = Ctrl
ElseIf TypeOf Ctrl Is MSForms.ComboBox Then
WsBase.Cells(ligne, c) = Ctrl
ElseIf TypeOf Ctrl Is MSForms.CheckBox Then
WsBase.Cells(ligne, c) = IIf(Ctrl, "OUI", "NON")
ElseIf TypeOf Ctrl Is MSForms.OptionButton Then
WsBase.Cells(ligne, c) = IIf(Ctrl, "OUI", "NON")
End If
Next c
Next Ctrl
End Subet celle ci lit le fichier Excel
Sub RecupFeuille()
'Récupère les données de la feuille Excel vers FA
Dim Ctrl As Control
Dim c As Long
Dim Cfin As Long
Dim ligne As Long
'Cfin = Range("A1").End(xlToRight).Column
Cfin = 4
For c = 1 To Cfin
Set Ctrl = Controls(WsBase.Cells(1, c))
If TypeOf Ctrl Is MSForms.TextBox Then
Ctrl = WsBase.Cells(ligne, c)
ElseIf TypeOf Ctrl Is MSForms.ComboBox Then
Ctrl = WsBase.Cells(ligne, c)
ElseIf TypeOf Ctrl Is MSForms.CheckBox Then
Ctrl = (WsBase.Cells(ligne, c) = "OUI")
ElseIf TypeOf Ctrl Is MSForms.OptionButton Then
Ctrl = (WsBase.Cells(ligne, c) = "OUI")
End If
Next c
End SubLe code suivant génère un message d'erreur
Set Ctrl = FA.Controls(WsBase.Cells(1, c))Pouvoir utiliser la lecture/écriture en mode dynamique me donnerait une plus grande souplesse pour les ajouts de box éventuels.
Je vous joins un fichier de test en annexe.
Pour les bonnes âmes qui souhaitent tester, il faut cliquer sur 'Création' dans l'onglet 'Menu', remplir les box identifiant et secteur en haut du formulaire et cliquer sur 'Créer fiche'.
Et là, rien ne va plus.
Merci d'avance
Frédéric
Bonjour
Un vrai parcourt du combattant ton fichier
La prochaine fois quand tu as une erreur, indiques la procédure afin de la créer
Cela évitera beaucoup de perte de temps
Dans la macro "RecupFeuille" de l'userform FA modifies cette ligne
Set Ctrl = Controls(WsBase.Cells(1, c).Value)Bonsoir blackrt
Comme tu définit un objet, il faut bien penser à mettre la propriété de ceux que tu ne veux pas utiliser en tant que tel
Il faut donc ajouter ".value"
Set Ctrl = FA.Controls(WsBase.Cells(1, c).Value)A+
Bonjour
un grand merci à tous les 2.
Cela va me simplifier grandement la vie. Je pensais avoir été clair, mais je vous promets d'être plus clair la prochaine fois.
A+
Frederic
Bonjour
je reviens de nouveau vers vous ...
J'ai donc résolu mon transfert de données dans le sens UF => excel!
J'ai presque résolu dans l'autre sens ...
A savoir dans la procédure ci dessous, je n'arrive pas à charger le controls avec la valeur de la cellule correspondante dans le cas d'une ComboBox.
je pense que cette ligne de commande demande à être précisée au niveau de ctrl, mais je ne maitrise pas suffisamment le VBA pour trouver la solution
Ctrl.???????????????? = WsBase.Cells(ligne, c)Sub RecupFeuille()
'Récupère les données de la feuille Excel vers FA
Dim Ctrl As Control
Dim c As Long
Dim Cfin As Long
Cfin = WsBase.Range("A1").End(xlToRight).Column
WsBase.Activate
For c = 1 To Cfin
Set Ctrl = FA.Controls(WsBase.Cells(1, c).Value)
If TypeOf Ctrl Is MSForms.TextBox Then
Ctrl = WsBase.Cells(ligne, c)
ElseIf TypeOf Ctrl Is MSForms.ComboBox Then
Ctrl = WsBase.Cells(ligne, c)
ElseIf TypeOf Ctrl Is MSForms.CheckBox Then
Ctrl = (WsBase.Cells(ligne, c) = "OUI")
ElseIf TypeOf Ctrl Is MSForms.OptionButton Then
Ctrl = (WsBase.Cells(ligne, c) = "OUI")
End If
Next c
'Next Ctrl
End SubMerci encore pour votre aide.
Frederic
Salut
Pour moi, même chose, il faut faire suivre l'objet "Ctrl" de sa propriété
Ctrl.Value = A+
Bonjour
j'y avais bien pensé .... çà finit par rentrer à force ... mais non,
message : Valeur de propriété non valide.
Merci quand même
Frederic
Re,
J'ai oublié de préciser, il faut également le faire pour le reste
Ctrl.Value = WsBase.Cells(ligne, c).Value
A+
Bonjour
tu vas être déçu ... mais çà ne fonctionne pas non plus avec ce code
ElseIf TypeOf Ctrl Is MSForms.ComboBox Then
Ctrl.Value = WsBase.Cells(ligne, c).ValueUne autre idée?
Merci
Frederic
Bonsoir
Je crois que quelqu'un a écrit
blackrt a écrit :mais je vous promets d'être plus clair la prochaine fois
Cela devait être quelqu'un d'autre
Le mieux tu fournis ton dernier fichier en cours (je pense que depuis le 1er message il a dû évoluer)
Tu détailles la marche à suivre pour arriver au plantage
A tout hasard : Ligne à quelle valeur ?
Bonjour à tous
J'ai résolu le problème. Je vais essayer d'être clair !
Le menu déroulant de la Box8, qui génère le plantage, dépend du choix de la Box4. Toutes les deux sont des ComboBox dont les 'Name' sont respectivement Box4 & Box8. Si je remplace Box8 par ComboBox8 dans le fichier Excel, au niveau du 'Name' et dans le code, tout se passe bien, je récupère sans problème les info du fichier Excel.
Je ne sais pas pourquoi .... mais çà marche.
Encore merci à tous ceux qui m'ont aidé.
A+
Frédéric