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 Sub

La 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 Sub

et 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 Sub

Le 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

123fadevep.zip (86.40 Ko)

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 Sub

Merci 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).Value

Une 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

Rechercher des sujets similaires à "gestion dynamique box userform"