[RESOLU]Transfert d'une variable depuis un module de classe pour un USF

néné06

XLDnaute Accro
Bonjour à toutes et tous,

je recherche la façon de transférer la valeur d'une variable (As integer) depuis un module de classe vers un UserForm.

J'ai placé "public num as integer" dans le module de classe, mais je n'arrive pas, lorsque je place dans l'UserForm "x=num" à avoir la valeur de num.

Merci pour vos réponses !

René
 
Dernière édition:

Papou-net

XLDnaute Barbatruc
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonsoir néné06,

Sans le code sous les yeux, pas facile de te répondre.

As-tu essayé de faire précéder num par le nom du module de classe ?

A +

Cordialement.
 

néné06

XLDnaute Accro
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonsoir Papou-net,

Je te fais parvenir les codes du module et une partie de USF.

Dans le module de classe "ClassLb"

Code:
Public WithEvents groupelabel As MSForms.Label
Public num_LB As Integer
Private Sub groupelabel_Click()
        Select Case num_LB
            Case 3 To 9
                    For i = 2 To 9
                        UserForm2.Controls("Label" & i).Visible = False
                    Next i
             'Calibre Label31
                UserForm2.Label31.Font.Size = UserForm2.Height * 0.04
                UserForm2.Label31.Top = UserForm2.Height * 0.01
                UserForm2.Label31.Left = (UserForm2.Width / 2) - (UserForm2.Label31.Width / 2)
                UserForm2.Label31.Visible = True
            End Select
End Sub
Private Sub groupelabel_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        If groupelabel.Name <> "Label2" And Len(groupelabel.Name) < 7 Then
            num_LB = Val(Right(groupelabel.Name, 1))
            Cells(1, 1) = num_LB
            groupelabel.SpecialEffect = 1
        End If
End Sub
Dans l'UserForm2
Code:
'************************************************************
'*            INITIALISATION DES VARIABLES                  *
'************************************************************
Dim Labels() As New ClasseLB
Public Annee As Variant
Public annéebis As Boolean
Public datedeb As Date
Public datefin As Date
'*********************************************
'*       INITIALISATION DE L'USF             *
'*      Calcul du plein écran de l'USF       *
'*********************************************
Private Sub UserForm_Initialize()
    Dim Ctrl As Control
    Dim Nb1 As Integer
    Dim USF As Object
    Nb1 = 0
        For Each Ctrl In UserForm2.Controls
            If TypeName(Ctrl) = "Label" Then
                 Nb1 = Nb1 + 1
                 ReDim Preserve Labels(1 To Nb1)
                 Set Labels(Nb1).groupelabel = Ctrl
            End If
            Ctrl.Visible = False
        Next
    Me.startUpPosition = 3
    Me.Width = Largeur_ecran * Points_par_Pixel
    Me.Height = Hauteur_ecran * Points_par_Pixel
    SuppressionBarre Me
    AnneMIN = 2010
    AnneFIN = 2040
    Cbannee.Clear
        For i = AnneMIN To AnneFIN
            Cbannee.AddItem i
        Next
End Sub
Merci pour ta réponse !

René
 
Dernière édition:

néné06

XLDnaute Accro
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonsoir à tous,

Ma question n'était peut être pas suffisamment claire, aussi je la reformule d'une façon différente !

Comment récupérer la valeur d'une variable dans un USF lorsque cette variable a pris sa valeur dans un module de Classe ?
Comment déclarer cette variable (dans USF,Le module de Classe ??) et quels paramètres fournir à la déclaration de variable ?

Merci d'avance !

Rene
 

Papou-net

XLDnaute Barbatruc
Re : Transfert d'une variable depuis un module de classe pour un USF

RE :

Toujours pas certain d'être dans le vrai (quand je parlais de voir le code c'était sur pièce avec le fichier) mais peut-être qu'en déclarant la variable en Public dans un module de code standard (en lieu et place du module de classe) tu aurais plus de succès.

A +

Cordialement.
 

néné06

XLDnaute Accro
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonjour à tous,

La nuit portant conseil, j'ai trouvé la réponse à mon problème .
Pour récupérer la variable ( numéro du label cliqué) sur le calendrier, je la place dans un (ComboBox) ou autre (controls) de l'UserForm.
Je retravaille la donnée pour en sortir une variable exploitable.

Bonne journée à tous !

René
 

Pièces jointes

  • calendrier essai1.xlsm
    218.1 KB · Affichages: 91
  • calendrier essai1.xlsm
    218.1 KB · Affichages: 104
  • calendrier essai1.xlsm
    218.1 KB · Affichages: 96
G

Guest

Guest
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonjour,

En gardant Num_LB dans le module de classe, il faut lui attribué une valeur à l'initialisation (ou ailleurs):

Code:
For Each Ctrl In UserForm2.Controls
If TypeName(Ctrl) = "Label" Then
Nb1 = Nb1 + 1
ReDim Preserve Labels(1 To Nb1)
Set Labels(Nb1).groupelabel = Ctrl
Labels(Nb1).Num_LB= NB
End If
Ctrl.Visible = False
Next

Dans l'évènement click du module de classe faire référence à cette propriété par : Me.Num_LB

Autre idée: Stocker le numéro du label dans sa propriété Tag lors de l'initialisation et y faire référence dans le module de class par groupelabel.Tag

Avis personnel et d'ordre théorique et général sur les déclarations de variables de classe de type Controle de userform:

Pour grouper les actions des objets de même type sur un userForm on crée des modules de classe avec une variable objet souvent préfixée Groupxxx(dans ton exemple: groupelabel).
Mais c'est une déviation de langage car la classe ne gère en réalité qu'une seule instance d'un objet à la fois et non pas un group ou une collection! C'est une source de confusions.
Le groupe d'objet n'est géré nulle part en tant que groupe ou collection. Les objets(ici des labels) sont simplement regroupéz dans un tableau du module du userForm. Et si groupe il y a, c'est à ce niveau et non au niveau de la classe.

mais ce n'est QUE mon avis.

A+
 
Dernière modification par un modérateur:

néné06

XLDnaute Accro
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonsoir à tous et merci pour l'aide apportée !

Même avec les aides , je ne parviens pas à résoudre ce petit problème.
J'ai donc posté un fichier simplifié qui expose ce cas.

Il serait facile, avec trois labels, de trouver le label cliqué par des sub en USF du style:

Private Sub Label1_Click()
a= Label1
End Sub

Mais dans mon programme, j'ai 762 Labels et je ne souhaite pas placer dans mon USF 762 fois cette routine et c'est pour cela que j'utilise un module de classe.

Merci d'avance !

René
 

Pièces jointes

  • Classeur1.xls
    46 KB · Affichages: 96
  • Classeur1.xls
    46 KB · Affichages: 81
  • Classeur1.xls
    46 KB · Affichages: 77

Efgé

XLDnaute Barbatruc
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonjour néné06, Bonjour David :), Bonjour Papou-net :) , Bonjour Hasco ;)
Désolé si je suis à coté de la plaque, mais :
Un module de classe sert, entre autre, à effectuer la même opération sur un grand nombre d'objets identiques.
Donc quand tu utilise Private Sub groupelabel_Click , c'est là que tu agis, pas dans ton userform. Pas de variable à récupérer...
Pour écrire dans la textbox1 le nom du label qui déclenche le module, ton code dans le module est :
VB:
Private Sub groupelabel_Click()
    UserForm1.TextBox1.Text = groupelabel.Name
End Sub

Cordialement
 

Papou-net

XLDnaute Barbatruc
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonjour néné06, Bonjour David :), Bonjour Papou-net :) , Bonjour Hasco ;)
Désolé si je suis à coté de la plaque, mais :
Un module de classe sert, entre autre, à effectuer la même opération sur un grand nombre d'objets identiques.
Donc quand tu utilise Private Sub groupelabel_Click , c'est là que tu agis, pas dans ton userform. Pas de variable à récupérer...
Pour écrire dans la textbox1 le nom du label qui déclenche le module, ton code dans le module est :
VB:
Private Sub groupelabel_Click()
    UserForm1.TextBox1.Text = groupelabel.Name
End Sub

Cordialement

Salut Efgé, le Forum,

"Bon Dieu, mais c'est bien sûr!" comme disait un fameux limier.

Bravo pour ta perspicacité, FG, et merci.

Cordialement.
 

Dranreb

XLDnaute Barbatruc
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonsoir.
Vous pouvez aussi faire comme ça si vous tenez à ce que l'info ne transite pas par une variable Public d'un module ordinaire :
VB:
'******************************
'  VOICI LE CODE DE USEFORM   *
'******************************
Public LabGrp As MSForms.Label
Dim Labels() As New Classe2
Private Sub TextBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
' Ici, j'aimerai que s'écrive le dernier Label (1,2,3) cliqué
If LabGrp Is Nothing Then Exit Sub 
TextBox1.Text = LabGrp.Caption
End Sub
VB:
'**************************************
'*  ICI LE CODE DU MODULE ( CLASSE2)  *
'**************************************
Public WithEvents groupelabel As MSForms.Label
Private Sub groupelabel_Click()
   Set UserForm1.LabGrp = groupelabel
End Sub
 

Efgé

XLDnaute Barbatruc
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonjour à tous, Bonjour Dranreb
Je ne comprends toujours pas pourquoi passer par un autre module que la classe.

Pour ce qui est du MouseMove, on peux utiliser
VB:
Private Sub groupelabel_MouseMove(ByVal Button As Integer, _
		 ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    UserForm1.TextBox1.Text = groupelabel.Name
End Sub

Pour aller dans le sens de Dranreb, on peux renvoyer une variable à une sub qui se trouve dans le USerForm:
Dans le Module de classe :
VB:
Private Sub groupelabel_MouseMove(ByVal Button As Integer, _
		 ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Call UserForm1.toto(groupelabel.Name)
End Sub
Dans le UserForm :
VB:
Sub toto(X As String)
    UserForm1.TextBox1.Text = X
End Sub

Mais , comme je l'ai déjas dis, je ne comprend pas tout du problème.

Cordialement
 

Dranreb

XLDnaute Barbatruc
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonjour.
Reprenons la question:
Comment récupérer la valeur d'une variable dans un USF lorsque cette variable a pris sa valeur dans un module de Classe ?
Comment déclarer cette variable (dans USF,Le module de Classe ??) et quels paramètres fournir à la déclaration de variable ?
Cela dépend où elle est déclarée Public. Si c'est dans un module ordinaire elle est connue simplement par son nom dans tout le projet VBA, c'est donc le plus simple. Si c'est dans l'userform, elle n'est connue sans préfixe que dans celui ci, tandis que pour l'initialiser depuis un autre contexte il faut la faire précéder du nom du userform et d'un point. Si c'est dans le module de classe, c’est une propriété de son instance, qu'il faudrait donc connaitre et spécifier devant suivie d'un point. Ce dernier cas est le moins commode voir inapplicable dans ce cas d'utilisation.
La variable peut être déclarée As String si on est sûr de savoir ce qu'on veut y mettre, ou As MSForms.Label si c'est à voir comme un souci interne de l'userform qui en prendra ce dont il aura besoin, soit son nom, ce qui me parait un peut curieux, soit son Caption.
 

néné06

XLDnaute Accro
Re : Transfert d'une variable depuis un module de classe pour un USF

Bonsoir à tous et encore merci pour l'aide !

J'ai donc modifié les codes et cela fonctionne !

Code:
'  VOICI LE CODE DE USEFORM   *
'******************************
Dim Labels() As New Classe2
[COLOR="#FF0000"]Public Labelchoix As String[/COLOR]
Private Sub TextBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    TextBox1.Value = Labelchoix
End Sub
Private Sub UserForm_Initialize()
    Dim usf As Object
    Dim Ctrl As Control
    Dim Nb1 As Integer
    Set usf = UserForm1
    Nb1 = 0
        For Each Ctrl In UserForm1.Controls
            If TypeName(Ctrl) = "Label" Then
                 Nb1 = Nb1 + 1
                 ReDim Preserve Labels(1 To Nb1)
                 Set Labels(Nb1).groupelabel = Ctrl
            End If
        Next
End Sub
Code:
'**************************************
'*  ICI LE CODE DU MODULE ( CLASSE2)  *
'**************************************
Public WithEvents groupelabel As MSForms.Label
Private Sub groupelabel_Click()
    [COLOR="#FF0000"]UserForm1.TextBox1 = groupelabel.Name[/COLOR]
End Sub
Merci!

René
 

Pièces jointes

  • Classeur2.xls
    37.5 KB · Affichages: 49
  • Classeur2.xls
    37.5 KB · Affichages: 56
  • Classeur2.xls
    37.5 KB · Affichages: 56
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof