Paramétrer le nom d'un Userform

Bonjour à tous,

Je désire tout simplement "paramétrer" le nom d'un userform
Actuellement mon userform a pour nom "Usf_TARTENPION_Paul_Joseph_Henri", je voudrais en paramétrant son nom, c'est à dire en utilisant Usf_" & tableau(0) & "_" & tableau(1) & "_" & tableau(2) avec tableau = Split(nom, " ") , (le nom étant bien sur TARTENPION Paul Joseph Henri) de façon a pouvoir l'utiliser en fonction de différents noms différents
J'ai du faire une bétise car ça ne marche pas bien que tableau(0) & "_" & tableau(1) & "_" & tableau(2) me donne bien TARTENPION_Paul_Henri

   Unload "Usf_" & tableau(0) & "_" & tableau(1) & "_" & tableau(2)

me donne l'erreur : 424, objet requis

Je suis perdu, merci pour votre aide

Jacky

Bonjour,

L'approche serait plutôt d'avoir un userform générique, et de lister ses instances dans une collection/liste/dictionnaire (au choix) de manière à pouvoir paramétriser leur utilisation facilement.

Prenons l'exemple de l'userform "UserForm1". Je veux créer 3 instances : une pour Patrick, une pour Jean et une pour Paul. Je peux procéder comme ceci :

Public Sub ExUF()
  Dim mesUFs As Collection
  Set mesUFs = New Collection

  ' ajout de Patrick, jean et Paul dans la collection
  mesUFs.Add New UserForm1, "Patrick"
  mesUFs.Add New UserForm1, "Jean"
  mesUFs.Add New UserForm1, "Paul"

  ' affichage de Jean
  mesUFs.Item("Jean").Show vbModeless   ' vbModeless pour les montrer ensemble
  ' puis de patrick
  mesUFs.Item("Patrick").Show vbModeless

  If MsgBox("fermer patrick?", vbYesNo) = vbYes Then Unload mesUFs.Item("Patrick")

  ' avant de quitter on ferme tous les ufs
  Dim i As Long
  For i = 1 To mesUFs.Count
    If Not mesUFs.Item(i) Is Nothing Then Unload mesUFs.Item(i)
  Next i
End Sub

Bonjour Saboh,

Merci pour ta proposition, mais je ne la maîtrise pas parfaitement, bien que je comprenne ton code

Je te joins le fichier surlequel je travaille pour un copain. La feuille te donne un arbre de généalogie. Auprès de chaque nom il y a un bouton qui t'ouvre un des 7 Formulaires, chacun correspondant à un nom de l'arbre. Une fois l'un des formulaires ouvert je peux utiliser des checkbox afin de faire apparaitre dans une autre feuille l'acte de naissance ou de décès ou de mariage (tu pourras pas le faire car tu ne disposes pas du dossier qui contient les actes).
En regardant le code associé que j'ai construit tu comprendras le sens de ma question, surtout en fin de procédure avec la ligne

   Unload "Usf_" & tableau(0) & "_" & tableau(1) & "_" & tableau(2)

Ma question : comment puis utiliser ton code dans cette procédure ? C'est là que je ne vois pas très bien

19essai-acte.xlsm (63.04 Ko)

Ah oui tu as fait 1 userform/personne… Mais tu vas pas pouvoir faire ça pour 50 ou 100 personnes… A vrai dire je te conseillerai de recommencer en utilisant un userform "modèle" unique, mais paramétrique. Càd que tu lui ajoutes des Sub pour changer les éléments variables, comme le titre par exemple. C'est la route à suivre quand on commence à répéter plusieurs fois le meme processus.

Désolé là j'ai peu de temps et je pars en weekend, mais si ce n'est pas urgent je te montrerai. Sinon j'espère que quelqu'un d'autre pourra t'aider.

non je ne ferai pas 50 ou 100 userforms, 7 me suffisent
Tu es, comme toujours, super sympa. Je vais regarder de plus près ce que tu me dis et en cas de problème on se recontactera plus tard

Je te souhaite un bon et excellent week-end en espérant que ce sera sous un beau temps
Jacky

bonjour Jacky, comme ceci ?

pour Usf_CHARTAGNAC_Marie, voir module1

15essai-acte.xlsm (55.54 Ko)

PS. Saboh12617 a raison ...

Bonjour BsAlv,

Pour une fois j'avoue que je suis complètement largué. Je vais étudier cela de plus près, mais je crois que je vais suivre le conseil se Saboh

Merci beaucoup et au plaisir

de nouveau moi

J'ai regardé de plus près ce que tu m'as donné. Pour fermer le formulaire tu compares "uf.Name" et "Nom"
Si "Nom" est précisé quand tu appelles "m_UNLOAD_UF(Nom)", expliques moi pourquoi uf.Name sera également "Usf_CHARTAGNAC_Marie" et non pas l'un après l'autre les Usf de ma liste du fait que tu les appelles avec For Each

Et pourquoi le 1 dans StrComp(uf.Name, Nom, 1) ?

re,

For Each uf In UserForms ne vérifie que les userforms ouverts (visibles et hidden), donc pas nécessairement tous vos 7 userforms. Dès que vous faites un "unload" ce userform n'est plus accèssible et donc ignoré dans cette liste.

b = (StrComp(uf.Name, Nom, 1) = 0) >>>> résultat est boolean, donc Vrai ou faux

compare le nom d'un userform ouvert avec un nom spécifique, par exemple "USF_CHARTAGNAC_Marie" et ce "1" est là pour ignorer les majuscules/miniscules, donc "usf_chartagnac_marie" est aussi correcte.

donc si 1 des userforms "ouverts" a comme nom "USF_CHARTAGNAC_Marie" (ignore orthographe), cet userform sera "UNLOAD" et on arrête le boucle.

Désolé, mais je ne vois pas une manière "indirect" pour assigner cet userform

Question, vous n'aurez qu'un userform ouvert en même temps ou plusieurs ? Avec 1, on assigne un variable public au début du module1 (par exemple) et on est partie, mais je ne connais pas le fonctionnement voulu dans vos UFs ...

Bonjour BsAlv,

Merci pour toutes ces explications très claires et interessantes

Je ne savais pas qu'avec For Each, seuls les Userforms ouverts étaient balayés.

Le "1" dans la fonction "StrComp" est en effet interessant car il nous permet d'gnorer les cases

En ce qui concerne mon produit je n'ouvre qu'un seul UserForm à la fois; donc pas de problème

Un grand merci et à bientôt

Jacky

Bonjour,

je ne dois pas saisir un truc car faire une boucle sur les USF pour savoir lequel il faut fermer alors qu'un seul ne peut être ouvert en même temps...
Sur le code du bouton OK un simple UnLoad.Me suffit, non ? Où Me est l'USF parent du bouton OK.

Je me pose la question de savoir pourquoi 7 USF, alors qu'un seul suffit si ce dernier récupère les bonnes données, non ?
Mais il doit me manquer des informations.

@ bientôt

LouReeD

Bonjour LouReed,

Mon cher une fois de plus tu as analysé à la perfection cette situation à laquelle nous nous sommes affronté bêtement. En effet, l'UserForm ouvert est seul, donc il est inutile d'aller chercher son nom, un Unload Me suffit pour le fermer.

Maintenant pourquoi 7 Userforms, au départ dans mon idée parce que j'ai 7 personnes dans l'arbre. J'avais bien pensé, comme tu le dis, à ne construire qu'un seul Formulaire et de l'adapter en fonction de la personne choisie. Je t'avouerai que par fainéantisme je n'ai pas approndi cette recherche. Je vais le faire.

Encore bravo et au plaisiir

Jacky

LouReed de nouveau moii,

Pour te dire que j'ai suivi tes conseils et de ce fait ai simplifié au max le fichier que voici

Encore merci

Bonsoir,

je reviens sur une autre discussion : les ActiveX !

Je vous propose le code suivant à lier à de simple shape image :

Sub QuelBouton()
    Dim LeNom As String, Cel As Range
    ' on récupère la cellule où se trouve le bouton qui vient d'être cliqué
    Set Cel = ActiveSheet.Shapes(Application.Caller).TopLeftCell
    ' on fabrique le nom avec les valeurs contenues dans les cellules à gauche de celle du bouton et à gauche et en dessous de celle du bouton
    LeNom = Cel.Offset(, -1) & " " & Cel.Offset(1, -1)
    ' on modifie le label avec ce nom
    UserForm1.Label2 = LeNom
    ' on affiche le USF
    UserForm1.Show
End Sub

Du coup vous n'avez plus qu'un seul USF, un seul code de lancement et plus d'ActiveX sur votre classeur !

Le fichier :

@ bientôt

LouReeD

ou en plus court :

Sub QuelBouton()
    With ActiveSheet.Shapes(Application.Caller).TopLeftCell
        UserForm1.Label2 = .Offset(, -1) & " " & .Offset(1, -1)
    End With
    UserForm1.Show
End Sub

Vous l'aurez compris, la structure de la feuille doit rester comme elle est, sinon il faudra adapter les décalage de cellule.

@ bientôt

LouReeD

Bonsoir LouReed,

Et oui une fois de plus tu excelles
Si je comprends bien le bout de code

    Set Cel = ActiveSheet.Shapes(Application.Caller).TopLeftCell

détermine quelle est la cellule située à la gauche du bouton. Cela je l'ai compris, mais je comprends pas la signification des éléments de ce bout de code : "Application.Caller" et pourquoi TopLeftCell
De plus il a fallu que tu "redéssines" mes shapes pour que le bouton, le nom et le prénom de chacune des personnes soient dans des cellules bien précises, à gauche pour le nom et à gauche en dessous pour le prénom, ce que jai constaté

Ta macro me permettra d'alléger au maximum mon fichier car j'ai 87 individus à traiter et je pensaiis utiliser un fichier par individu

Bravo et un grand merci, on en apprend tout les jours et je constate que je suis loin de tout connaître même si je connais pas mal de choses
Au plaisir

Bonsoir,

Grace à l'instruction TopLeftCell d'un shape on connait la cellule qui contient le coin supérieur gauche du shape.

Don cette ligne : Set Cel = ActiveSheet.Shapes(Application.Caller).TopLeftCell permet d'attribuer à la variable Cel le RANGE (CELLULE) correspondant que le shape "survole.

On peut connaitre également la cellule qui contient le coin inférieur droit avec l'instruction BottomRightCell.

Donc, vos zone de nom comprennent 6 cellules : 3 colonne sur 2 lignes. Les shapes boutons sont sur la droite de la zone et leur coin supérieur gauche se trouve sur la colonne 3 de la zone et la ligne 1, avec TopLeftCell on connait la cellule correspondante. de cette cellule il faut bien aller en colonne "-1" pour trouver le nom et en colonne "-1" et ligne "+1" pour connaitre le prénom, ceci grâce à l'instruction OffSet.

Mais pour connaitre cette cellule d'origine, il faut connaitre le shape qui a été cliqué. Un shape cliqué qui lance une macro peut être connu avec l'instruction Application.Caller qui peut être traduit par "qui vient d'être cliquer pour lancer le code".

Donc : SET = on attribue à Cel une variable représentant un RANGE la CELLULE contenant le coin supérieur gauche du SHAPE de la feuille active qui vient d'être cliqué (Caller)

Après je n'ai pas redessiner les boutons pour que... Les vôtres étaient déjà à ces positions (3 ième colonne ligne 1 des différentes zones) J'ai juste modifié les ActiveX (me semble-t-il) par des formes "images" avec un effet pour donner du relief.

L'avantage du Caller, permet en fonction de cette source de n'avoir qu'un code pour X boutons, mais il faut que l'action à mener soit compatible avec cette façon de faire. Application.Caller renvoie le nom du shape, donc on peut imaginer de type de nom de shapes et avec une Select Case on peut alors lancer différent type de code en fonction du bouton.

En espérant avoir été assez clair, si tel n'est pas le cas n'hésitez pas.

@ bientôt

LouReeD

Bonjour LouReed,

Tu dis

En espérant avoir été assez clair, si tel n'est pas le cas n'hésitez pas.

mais c'est absolument clair et précis
Comme jel'ai dit précédemment je ne connais pas tout et je constate que j'en suis encore loin

Un très grand merci pour toutes ces explications et au plaisir

Jacky

Bonjour,

Merci et bon dimanche à vous !

@ bientôt

LouReeD

Bonjour Saboh,

J'espère que tu as passé un bon week-end .... sous le soleil ??

Quant à moi j'ai continué à chercher et, le formidable LouReed, m'a proposé une idée géniale qui fait que je n'utilise qu'un seul UserForm
J'ai donc adopté et voici le résultat

Un grand merci également pour toi et au plaisiir

Rechercher des sujets similaires à "parametrer nom userform"