Utiliser une variable à la place du nom d'un contrôle

Bonjour,

J'ai deux UserForm, Recette et Depense

Dans chacune de ces UesrForm, j'ai une ListBox qui est alimentée par la feuille Membre

Du coup, je veux mettre le chargement de la ListBox dans une procédure publique, et l'appeler en lui passant le nom de l'UserForm

Mais j'ai une erreur 424 objet requis

Public Sub ListBoxMembre(ByVal NomForm, ByVal NomListBox)
    On Error GoTo errorHandler
    Dim wDerLig, wInd, wPos As Integer
    Call Module1.tri("MEMBRES", 2, "A", "O", "E", "F")        '   E = Nom, F = Prénom
    Dim wFeuille As String
    wFeuille = "MEMBRES"
    Sheets(wFeuille).Activate
    wDerLig = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
    Dim wNomForm As Object
    Set wNomForm = NomForm
    Dim wListBox As Object
    Set wListBox = NomListBox
    With wNomForm
        With wListBox
            .Clear
            .RowSource = wFeuille & "!E2:F" & wDerLig
        End With
    End With
    GoTo Fin
errorHandler:
    'indique le numéro et la description de l'erreur survenue
    MsgBox Err.Number & vbLf & Err.Description
Fin:
End Sub

Sur Set wNomForm = NomForm

Comment faire ?

Cordialement

SC

Bonjour,

comment tu définis NomForm ? est-ce bien un objet et pas un nom ?

par valeur (ByVal)

Moyen permettant de passer à une procédure la valeur d'un argument plutôt que son adresse. La procédure peut de ce fait accéder à une copie de la variable. La valeur réelle de cette dernière n'est donc pas modifiée par la procédure à laquelle elle est passée.

en fait vous essayez de donner une valeur à un objet !

Si Nomform contient le nom du USF appelant alors une condition If pourrait suffire dans votre cas :

If NomForm = "Recette" Then
Recette.ListBox1.Clear
Else
Depense.ListBox1.Clear
EndIf

@ bientôt

LouReeD

Bonjour,

Tu réaffectes tes arguments (de type Variant, soit dit en passant...) à des variables objet, ce qui ne paraît guère logique. Comme il ne paraît pas plus logique de lancer une proc. du Userform (si elle est là) en lui passant le même Userform en argument.

Il faut aussi savoir où est ta procédure, l'affubler de Public, n'est guère utile, si elle n'est pas Private elle est forcément Public (par défaut, sauf procédure d'évènement...). Si elle est dans le module du Userform, le module est privé, et la procédure doit être appelée avec le nom du module.

Ça me paraît un peu alambiqué, et difficile à lire avec tes déclarations éparpillées au lieu d'être placées en tête de procédure comme il est de règle...

Cordialement.

A toutes fins utiles, tu peux aussi utiliser Application.Caller plutôt que de passer en procédure ... ce qui ne passe pas comme l'explique brillamment LouReed !

Bonjour à tous

Je respecte les règles de programmation

Si j'ai mit les définition de variable au milieu des lignes de code de la procédure, c'est que je voulez cerner le problème

Je vais voir Application.caller

Effectivement, un test sur le nom le USF est ce que j'utilise actuellement

Mais je voulais limiter les lignes de code

Je vais continuer à chercher

Cordialement

SC

un exemple d'application.caller

10boutons-bis.xlsm (17.92 Ko)

Merci beaucoup

Je ne comprend pas ….

J'ai ajouté MsgBox Application.Caller dans la fonction test du classeur que vous avez proposé

C'est OK

J'ai mis également MsgBox Application.Caller dans la procédure que j'appel dans on classeur

J'ai alors erreur 13 incompatibilté de type ?

Cordialement

SC

Application.Caller n'est pas toujours un string ...

https://msdn.microsoft.com/fr-fr/vba/excel-vba/articles/application-caller-property-excel

Il va falloir mettre un fichier exemple de ce que tu veux faire.

Merci J'ai déjà consulté cette page

Peut être que le problème vient du fait que c'est une procédure qui appel cette procédure

Je vais faire faire un exemple

Je vais faire faire un exemple

je pense que c'est préférable

Vous disiez ceci :

Du coup, je veux mettre le chargement de la ListBox dans une procédure publique, et l'appeler en lui passant le nom de l'UserForm

Si j'ai bien compris :

un USF 1 est affiché, un bouton pour incrémenter la valeur de la texte box, avec un Call qui envoie "Me", la procédure reçoit "Me" comme étant un UserForm, du coup la valeur est interprétée comme telle.

@ bientôt

LouReeD

Quelque fois la solution est sous notre nez et on ne la voit pas...

Alors avez vous tester le fichier ?

@ bientôt

LouReeD

Je passerais bien le sujet en résolu... mais je ne peux pas !

@ bientôt

LouReeD

Bonjour,

Je n'arrive pas à comprendre Test transfert nom form.xlsm ….

Il n'y a qu'un bouton dans l'UserForm, et dans le code, on en retrouve 2 !

Je n'arrive pas à voir où l'on "récupère" le nom de la Form ….

Je vais faire faire un exemple

je pense que c'est préférable

on est comme Charles ... Charles attend ...

Bonjour,

vous cliquez sur "Allon-y !"

le USF 1 s'affiche avec une TextBox et deux boutons :

1 - commandButton pour faire varier la valeur de la texteBox de 10 en 10

2 - un bouton "Userform 2" qui permet de basculer sur le userform 2

Pour savoir sur quel USF vous êtes il y a son nom dans la barre de la fenêtre

Vous cliquez 4 fois sur le commandButton, vous obtenez 40 en TextBox.

Vous cliquez sur Userform 2 pour basculer sur le Userform2

USF 2 est ouvert, il y a aussi deux boutons et une textbox :

1 - bouton pour faire varier la valeur de la textebox de 10 en 10

2 - un bouton pour basculer sur le USF 1

Si vous cliquez deux fois sur le bouton CommandButton la textbox va arriver à 20

Basculer entre les deux USF vous voyez bien la différence de valeur des textbox.

Et bien le code de variation de ces valeur est un code unique dans lequel on a "envoyé" le nom du USF qui demandait de faire cette variation.

Le code :

Public Sub LRD_Commun(Le_Form As UserForm)
    Le_Form.TextBox1.Value = Val(Le_Form.TextBox1.Value) + 10
End Sub

La Sub est public pour pouvoir être appelé de n'importe quel USF, elle attend un argument qui est un objet USF :

Le_Form As UserForm

C'est pourquoi dans chaque USF quand on appel cette procédure on écrit :

Call LRD_Commun(Me)

où Me représente le USF actif

du coup la variable objet de la procédure Le_Form représente le USF appelant

@ bientôt

LouReeD

Merci pour ces explication

Mais dans cette procédure public, "LRD_Commun", je peux avoir le nom du contrôle qui a lancé cette procédure, dans un msgbox

Par contre, je n'arrive pas a faire de même pour le nom de la Form

Je vais faire faire un exemple

je pense que c'est préférable

on est comme Charles ... Charles attend ...

bis repetita !

Bonjour à tous !

Ôtez-moi d'un doute ? Je ne crois pas avoir vu l'intéressé fournir de fichier ?

Rechercher des sujets similaires à "utiliser variable place nom controle"