Création dynamique d'userform (avancée...pour moi en tous cas :))

MartiFab

XLDnaute Nouveau
Bonjour a tous !

Mon probleme

Je souhaite créer un classeur (avec un nombre de feuilles spécifié), nommer les feuilles de ce classeur et insérer des données sur ces feuilles à l’aide d’userforms.

Pour l’exemple imaginons que l’on veuille créer le classeur « FRANCE.xlsx ». Ce classeur contient 3 feuilles qui ont pour nom : PACA, Languedoc-Roussillon, Auvergne. La première colonne de chaque feuille contient les données. Dans notre cas, les noms de départements pour chaque région. Ainsi la cellule A1 de la feuille PACA sera Vaucluse, la cellule A2 : Var, A3 : Bouches-du-Rhône, etc… Un exemple du fichier final souhaite est joint a ce message (« FRANCE.xlsx »).

Une première userform demande par le biais de deux textBox le nom du classeur (nom de Pays) et le nombre de feuilles (nombre de régions) qui seront présentes dans ce classeur. Un bouton de commande « Confirmer » crée le classeur et ouvre une nouvelle userform. Sur cette userform les contrôles sont créés dynamiquement en se basant sur les informations de l’userform précédente notamment le nombre de régions [utilisation de userform_initialize()].

Comme on peut le voir sur la pièce jointe « creerClasseur.xlsm », chaque cadre région présente un bouton de commande « Définir Dprt. » qui doit ouvrir une nouvelle userform présentant des text boxes pour donner le nom des départements de la région. Evidemment cette userform est aussi créer dynamiquement. Mon problème est à ce stade.

Ma question

Comment faire pour que chaque bouton de commande « Définir Dept. » de l’userform donne le bon résultat ?

Par exemple, si l’on a 2 régions. Si le nombre de départements dans le cadre de la région 1 est 6, cliquer sur « Définir Dprt. » ouvre une userform avec 6 text boxes. Si dans la région 2 on a 4 départements, cliquer sur le bouton du cadre région 2 ouvre une userform avec 4 text boxes.

Merci beaucoup

Note : Pour simplifier je n’ai pas inclus le code pour la création de classeur mentionné au tout début.
 

Pièces jointes

  • FRANCE.xlsx
    8.6 KB · Affichages: 72
  • creerClasseur.xlsm
    19.2 KB · Affichages: 49

MartiFab

XLDnaute Nouveau
Re : Création dynamique d'userform (avancée...pour moi en tous cas :))

Bonjour Kjin,

Merci de ta réponse. Je joint les fichiers en .xls comme tu le demande. J'utiliserai cette extension en priorité dans mes prochains posts.

Bonne Après-midi

A++
 

Pièces jointes

  • creerClasseur.xls
    47 KB · Affichages: 64
  • FRANCE.xls
    27 KB · Affichages: 72
  • FRANCE.xls
    27 KB · Affichages: 82
  • FRANCE.xls
    27 KB · Affichages: 92

kjin

XLDnaute Barbatruc
Re : Création dynamique d'userform (avancée...pour moi en tous cas :))

Bonsoir,
Evidemment cette userform est aussi créer dynamiquement
Pourquoi ?! c'est la première question qui me viens à l'esprit...
3 hypothèses :
1 - tu ne sais pas qu' hormis une prochaine réforme territoriale qui chamboulerait nos institutions, ce qui n'est pas exclue :)rolleyes:)..., le nb de régions et de départements ainsi que leur nom est connus et immuable
2 - tu ne sais pas te servir d'un userform, ce qui n'est pas honteux en soi, et ça, ça peut s'arranger
3 - ce fichier aurait une destinée pour le moins mystérieuse, auquel cas, il faudrait que tu nous indiques de quoi on part et pour aller où !
Bref, il faudrait que tu nous en dise un peu plus...
A+
kjin
 

MartiFab

XLDnaute Nouveau
Re : Création dynamique d'userform (avancée...pour moi en tous cas :))

Kjin,

Je m’excuse si mes explications ne sont pas suffisament claires. L’utilisation de noms de régions et de département me sert simplement ici d’exemple. Je ne dois pas réaliser un fichier de ce type. Mon projet est beaucoup plus complique que cela. Et il serait trop long ici d’en décrire le principe.

Ma question consiste à savoir comment créer dynamiquement un userform en fonction d’informations présentes sur un userform précédent. Et pour lesquelles les informations entrées par l’utilisateur sont totalement variables et imprévisibles.

Une image valant mieux qu’un long discours voila ce que je cherche a réaliser (fichier jpg joint). Particulierement, le passage de l’etape 2 a l’etape 3. N’hésite pas a me recontacter si tu as besoins d’autres précisions.

Merci
 

Pièces jointes

  • imageExplicative.jpg
    imageExplicative.jpg
    48.2 KB · Affichages: 124

MartiFab

XLDnaute Nouveau
Re : Création dynamique d'userform (avancée...pour moi en tous cas :))

Salut Kjin,

Merci pour ta reponse.

Malheureusement, j'ai un petit probleme avec ton fichier. lorsque je clique le bouton de commande un message d'erreur apparait:
"Erreur d'execution 1004
L'acces par programme au projet visual basic n'est pas fiable."

Si je comprends bien tu as du utiliser du langage VB ? Sais-tu comment je peux faire fonctionner ta macro ?

Desole pour le desagrement :S

Merci beaucoup pour ta reponse en tous les cas.
 

kjin

XLDnaute Barbatruc
Re : Création dynamique d'userform (avancée...pour moi en tous cas :))

Bonsoir,
Il n'y a aucun code malicieux...il faut juste cocher "Faire confiance au projet...(tout dépend de la version excel) dans le menu sécurité des macros; la création dynamique de usf implique forcément de le faire par le code
A+
kjin
 

MartiFab

XLDnaute Nouveau
Re : Création dynamique d'userform (avancée...pour moi en tous cas :))

Autant pour moi.

Une case n’était pas cochée dans ma partie "sécurité des macros". Je travaille avec la version 2007 et elle diffère un peu.
J'ai testé et c'est exactement ce qu'il me fallait. Je me plonge dans l’étude de ce code pour bien le comprendre. Je n’hésiterai pas a te contacter car je pense que j'aurais quelques questions.

Je te remercie beaucoup pour ton aide et pour ton temps.

A bientôt
 

MartiFab

XLDnaute Nouveau
Re : Création dynamique d'userform (avancée...pour moi en tous cas :))

Salut Kjin,

Merci encore de ton fichier exemple. J'ai eu le temps de le décortiquer et j'ai appris beaucoup de choses nouvelles.

Cependant je me suis retrouvé confronté à une erreur lorsque je souhaite l'adapter à mon besoin.

Cette erreur est assez mystérieuse pour moi. Je pensais qu'une étourderie dans mon code recopié à partir du tien en était la cause. Mais une comparaison des deux codes dans PSPad (une sorte de Notepad++) n'a montré aucune différence. De même dans le menu (Outils > Références) les mêmes cases sont cochées.

Ne trouvant pas, j'ai décidé de faire un copier-coller de ton code dans un nouveau fichier pour voir si il marcherait. Et la patatras.... C'est le drame. Le nouveau fichier (par ailleurs en PJ) ne fait pas le travail demandé. "Error 40036"…

Je joins à ce post le fichier "copieKjin.xls" qui n'est rien d'autre qu'une copie du fichier "martifab.xls" que tu m'as envoyé précédemment et disponible plus haut. Peut être sauras-tu m'éclairer sur ce point un peu sombre.

Merci Beaucoup

A ++
 

Pièces jointes

  • copieKjin.xls
    67.5 KB · Affichages: 63

MartiFab

XLDnaute Nouveau
Re : Création dynamique d'userform (avancée...pour moi en tous cas :))

Salut Kjin,

Merci pour ta réponse. L'erreur était bien là. J'avais pourtant pense à cela. Mais je n'avais pas fait attention, dans ton code tu appelles le module de classe ClsUsf2, dans mes tentatives je l'ai appelé BtnUsf2.

Mais tu avais raison une fois de plus ! :)

Tout marche comme il faut dorénavant. J'ai cependant une paire de questions que j'aimerais te poser.
Tout d'abord dans les sub CreerUsf1, CreerUsf2 et CreerUsf3, à la fin des routines tu utilises le code:

Code:
VBA.UserForms.Add (usf.Name)
VBA.UserForms(UserForms.Count-1).Show

Je comprends grosso modo le but de ces deux lignes. Mais le sens de la première est un peu obscur. Qu'est-ce quelle signifie exactement?
D'après ce que je comprends, VBA.UserForms.Add attend une variable string en argument. Nous n'avons pas donné de nom à notre usf, et donc tu utiliserais usf.Name pour obtenir la dite variable string (qui peut ressembler a UserForm1)?

Quant à la deuxième, nous voulons afficher l'userform. VBA.UserForms().Show attend un index en argument. UserForms.Count compte le nombre d'userforms dans la collection.
Pourquoi soustrais-tu 1 à ce nombre? Je comprends qu' à ce stade nous n'avons qu'un seul userform dans notre collection? J'ai du mal à saisir cette ligne.

Enfin, mon autre question concerne le module de classe.
Tu utilises la propriété parent.

Code:
With BtnUsf2.Parent.Parent
       If .Controls("TextBox" & v) = "" Or .Controls("TextBox" & v + 1) = "" Then Exit Sub
       CreerUsf3 .Controls("TextBox" & v), Val(.Controls("TextBox" & v + 1))
End With

Pourquoi utilises-tu deux fois la propriété parent. A quel objet l'une et l'autre réfère-t-elle?

Je te remercie encore.

A++
 

kjin

XLDnaute Barbatruc
Re : Création dynamique d'userform (avancée...pour moi en tous cas :))

Bonjour,
1 et 2) Pour pouvoir charger et afficher le UserForm, il faut préalablement l'ajouter à la collection UserForms du projet par la méthode Add en utilisant son nom
Comme pour toutes les collections, le premier item de la collection UserForms a pour index 0.
Note qu'on peut également écrire...
Code:
VBA.UserForms.Add(usf.Name).Show
3) Le bouton et situé dans un cadre, il faut donc remonter 2 fois dans la hiérarchie pour accèder aux propriétés du usf2
Note qu'en ce qui concerne le module de classe, on pourrait aussi le créer dynamiquement, auquel cas il faudrait ajouter une routine dans usf1 qui le supprimerait à la fermeture
A+
kjin
 

MartiFab

XLDnaute Nouveau
Re : Création dynamique d'userform (avancée...pour moi en tous cas :))

Salut Kjin,

Merci beaucoup pour ton aide. Tes conseils ont été très précieux et j'ai appris énormément de choses grâce à ton fichier exemple.

Au plaisir de se recroiser sur le forum.

Bon après-midi.
 

Discussions similaires

Statistiques des forums

Discussions
312 237
Messages
2 086 488
Membres
103 233
dernier inscrit
Ange.wil