Contenir le nom USF dans une variable en argument d'une fonction

Bien le bonjour,

Cela fait maintenant 3 jours que je cherche une solution à mon problème. Je cherche autant dans les forums FR que EN. J'ai bien trouvé quelques pistes, mais pour autant je n'arrive pas à les faire fonctionner de mon coté.

Ce que je cherche à faire :

J'ai une fonction qui se trouve dans le module 1. Celle-ci sert pour l'ensemble de mes Userforms.

Je souhaite pouvoir interagir avec mes controls (textbox / combobox ...) depuis ma fonction.

Mon problème :

Je n'arrive pas a mettre en argument le nom de mon formulaire pour ensuite interagir avec mes controls dans la fonction. Ou alors directement depuis ma fonction atteindre les controls du forms en cours/activé.

Détournement :

si cette fonction se trouve dans la feuille de l'userform. j'appelle les controls avec Me. Cela fonctionne correctement.

Pistes explorés :

Sub Btn_Test_Click()
    Dim Usf As Object
    Set Usf = Me
    Call Actualisation(Usf)
End Sub

Sub Actualisation(Usf As String)
    Usf.controls("TextBox_ID").text = "15"
End Sub[code]
dim mvar as string
mvar = "formCCLN"
mvar.controls("TextBox_ID").text = "15"
Dim oneForm As Object
Set oneForm = CallByName(UserForms, "Add", VbMethod, FormName)
oneForm.controls("TextBox_ID").text = "15"

et j'en passe. J'ai bien entendu adapté en fonction de mes besoins mais sans succès.

paradoxalement si dans ma fonction je remplace en dur Me par le nom de mon formulaire (qui se trouve dans le module 1), cela fonctionne.

Je vous mets à disposition du fichier complet.

En vous remerciant

13suivi-gw2.xlsm (823.70 Ko)

Bonjour,

J'ai une fonction qui se trouve dans le module 1.

S'il s'agit de "Fct_ActualisationFormulaire", telle que définie, il ne s'agit pas d'une fonction (Function) mais d'une procédure (Sub).

Si vous la remettez en procédure et que vous modifiez votre variable "NomFormulaire As String" en "Formulaire as Object", cela fonctionne sans problème.

Par ailleurs,

1- Public Sub est inutile car Sub par défaut est public.

2-

 Set oneForm = CallByName(UserForms, "Add", VbMethod, FormName)

a priori, vous utilisez cette instruction alors que le formulaire est déjà chargé en mémoire, ce qui à mon avis doit avoir pour effet de le réinitialiser.

Bonjour Thev,

Merci d'avoir pris le temps pour mon problème. Je pense que cela fait pas de doute, que je débute en vba. La comparaison des deux me semble un peu flou. Ce que je note c'est que l'une peut retourner une valeur alors que l'autre non ?

Je viens de renommer ma "fonction" en "procedure"

Function Fct_ActualisationFormulaire(... NomFormulaire As string)end Function
'en
Sub Fct_ActualisationFormulaire(... NomFormulaire As Object) end sub

Puis

For Each NumeroID In ListeID
        If FormCCLN.TextBox_ID.Text = NumeroID Then
       MsgBox "="
            For Each cle In DictColonne.Keys
                MsgBox Cells(NumeroID.Rows, cle)
                FormCCLN.Controls("TextBox_" & cle) = Cells(NumeroID.Rows, cle)
            Next cle
        End If
    Next NumeroID

Par

    For Each NumeroID In ListeID
        If NomFormulaire.TextBox_ID.Text = NumeroID Then
       MsgBox "="
            For Each cle In DictColonne.Keys
                MsgBox Cells(NumeroID.Rows, cle)
                NomFormulaire.Controls("TextBox_" & cle) = Cells(NumeroID.Rows, cle)
            Next cle
        End If
    Next NumeroID

Cependant il ne trouve aucune correspondance entre ma valeur du textbox (NomFormulaire.TextBox_ID.Text) et mon tableau (NumeroID). Pourtant en affichant des msgbox des valeurs, je vois bien une correspondance : 1 : 1

Je me suis rappelé d'un même problème de ma fonction Function Fct_ColonneUnique() (je sais même plus si c'est une fonction ou procédure - sachant qu'elle renvoi une valeur, j'aurai tendance a dire fonction ... ^^").

En effet le Type "retournée" par ma textebox n'est pas le même que NumeroID. J'ai ajouté :

If CStr(NomFormulaire.TextBox_ID.Text) = NumeroID Then

Je ne saurais dire si c'est propre comme syntaxe, mais ça a le mérite de fonctionner. J'ai idée, de pouvoir peut être forcer le Typage dans les paramètres du TextBox ...

3 jours à chercher, à voir flou ... Peut être devrais-je demandé plus souvent de l'aide.

En tout cas, Merci de ta rapidité, et de tes explications.


Solution dans mon cas précis (si ça peut aider !!!)

conditions :

- plusieurs formulaires utilisant ou faisant appels à une procédure (sub) appartenant au module 1

Code :

Dans la feuille du formulaire :

Dim USFName As Object 
Set USFName = Me

Call Fct_ActualisationFormulaire(USFName)

Dans le module 1 (création d'une procédure et non d'une fonction(function)).

Sub Fct_ActualisationFormulaire(NomFormulaire As Object)
' Appeler directement un ctrl avec son name
Cells(x,y).value = NomFormulaire.TextBox_ID.Text

'Appeler un ctrl avec une variable
NomFormulaire.Controls("TextBox_" & i)

'Lors d'une condition - passer la "valeur du textbox" de type string ou autre en fonction.
CStr(NomFormulaire.TextBox_ID.Text) = i

Je me redis, je sais ^^

=> merci infiniment !!!

Ce que je note c'est que l'une peut retourner une valeur alors que l'autre non ?

Une fonction effectivement retourne toujours un élément : une valeur en général ou un objet

Par ailleurs, puisque vous débutez, autant prendre de bonnes habitudes pour nommer vos variables de façon logique.

Il est illogique de nommer une variable de type objet avec NomFormulaire. Vous devez la nommer Formulaire ou USF (plus court)

Merci pour cette précision

En BDD, j'ai toujours pris l'habitude du mettre sur 3 caractères le type attendu puis un nom "logique".

En ce qui concernant ce document Excel, j'ai du bien changer 5, 6 fois les noms des variables. c'est plus facile de nommer quand on code d'une traite, que d'être bloqué toutes les 10 lignes et devoir refaire un bout de code avec des variables à l'arrache ...

Je tacherai d'y faire plus attention.

Merci

Rechercher des sujets similaires à "contenir nom usf variable argument fonction"