Actualiser des TextBox dans un Userform depuis un autre Userform

Bonjour le forum,

Comme spécifié dans le titre, est-il possible d'actualiser des TextBox présent dans un UserForm depuis un autre Userform?

Bonjour,

Est-ce que tu as essayé en ajoutant le nom du Userform devant les objets à modifier de l'autre Userform ?

Exemple : depuis le UserForm1 > UserForm2.Textbox1.Value = WorkSheets("Feuil1"I).range("D12").value

ric

Bonjour ric,

en fait c'est un peu plus compliqué, j'ai mis un fichier en pièce jointe pour mieux comprendre ;)

11testuserform.xlsm (69.64 Ko)

Bonjour,

Je ne comprends pas la demande ...

Est-ce que tu peux décrire la démarche à effectuer et le but à atteindre ?

ric

Bonjour,

En fait quand j'ouvre l'userform aperçu, j'ai un visuel sur mon planning de l'année. Si je m’aperçois que je veux modifier, ajouter ou supprimer une remonte (affiché REM), j'appuie sur la commandebutton présent dans l'userform aperçu, là un autre userform s'ouvre(userform_remonte). Je fais se que j'ai à faire et quand je clique sur le bouton "Mise à jour", ça me met à jour la plage de cellule dans la feuille BDD sauf que l'userForm aperçu n'a pas pris en compte car les textbox sont actualisées seulement avec initialize, c'est ça le problème, c'est que je ne sais pas comment faire pour que "les textbox" présentent dans l'userform aperçu se mettent à jour automatiquement?

J'espère avoir bien expliqué ;)

Bonjour à tous,

J'ai testé ton fichier sur Excel de Microsoft 365 32 bits et Excel d’Office 2007 ...

Dans les 2 cas > le bouton "Mise à jour" du "UserForm_remonte" met bien à jour "UserForm_aperçu" > tant pour ajouter un "REM" que pour le supprimer à la date indiquée ...

les Labelsont actualisées seulement avec initialize

Il n'y a pas seulement "Userform_Initialize" > il y a aussi UserForm_Activate > ils sont légèrement différents ...

Userform_Initialize charge les objets (construction et paramètres) ...

UserForm_Activate exécute son code en remettant le userform en avant-plan (actualisation des données) ...

Je n'ai pas compris ta demande ou ton fichier fonctionne bien ...

ric

Bonjour à tous,

Je n'ai pas ouvert le fichier mais je dirais qu'il faut appeler une même macro. Par exemple, il faudrait une macro "Actualisation" contenant le code gérant l'actualisation des textbox. Cette macro serait exécutée (appelée) à l'initialisation de l'userform aperçu et lors d'une mise à jour sur le second userform.

Cdlt,

Bonjour à tous,

Pour le moment j'utilise Unload et Show dans le bouton Mise à jour de l'UserForm remonte, ça me ferme les deux et ré ouvre UserForm aperçu et ça prend en compte.

@ric

Je ne connais pas UserForm_Activate , est-ce qu'il faut que je mette le au complet dedans ou juste se qui rempli mes Textbox/Label ?

@3GB

Est-ce que tu aurais une piste sur ce sujet car je n'ai jamais fait ce genre de code auparavant?

Merci à tous les deux ;)

Bonjour à tous,

@thunder : Je vais essayer d'illustrer mon propos. Pour l'instant tu as :

private sub userform_initialize()
msgbox "mon code"
end sub

Et il te faudrait :

'module userform1
private sub userform_initialize()
Call Actualisation
end sub

'module userfom2
private sub commandbutton_click() 'bouton de l'userform 2
Call Actualisation
end sub

'module standard
sub Actualisation()
msgbox "mon code" '<<< remplacer par le vrai code agissant sur les textbox de l'userform1
end sub

Ca n'a bien sûr rien à voir avec ton code (que je n'ai pas vu) mais c'est pour montrer que toutes les actions relatives à l'actualisation du 1er userform peuvent être regroupées sous une seule macro, ici Actualisation. Ensuite cette macro peut être appelée à ta guise, par exemple lors d'évènements sur ton/tes userform(s) : Initialize, Activate, click sur un commandbutton, ...

Cdlt,

@ 3GB

Je viens de faire la modif sauf que j'ai deux soucis dans le code, j'ai essayé de modifier en fonction de mes connaissances mais sans succès car je n'ai jamais fait ce genre de codage dans un Module.

Sub Actualisation()
    Dim L As Integer, TDon(), m As Integer, j As Integer, Lab As MSForms.Label, TBx As MSForms.TextBox, I As Integer
   TDon = Feuil3.[A5].Resize(366, 2).Value
   For L = 1 To DateSerial(Year(TDon(1, 1)) + 1, 1, 1) - TDon(1, 1)
      m = Month(TDon(L, 1)): j = Day(TDon(L, 1))
      Set Lab = Me("Label" & L)
      Set TBx = Me("TextBox" & L)
      Lab.Caption = Application.Proper(Format(TDon(L, 1), "ddd d"))
      Lab.ForeColor = IIf(EstFérié(TDon(L, 1)), &HC0, vbBlack) Or IIf(Weekday(TDon(L, 1), vbMonday) = 7, vbRed, vbBlack)
      Lab.BackColor = IIf(EstFérié(TDon(L, 1)), &H66FF66, &HE3FFC8)
      Lab.Font.Bold = EstFérié(TDon(L, 1))
      Lab.Font.Underline = IIf(Weekday(TDon(L, 1), vbMonday) = 7, True, False)
      TBx.Text = TDon(L, 2)
      Lab.Left = 18 + (m - 1) * 84: Lab.Width = 36: Lab.Top = 40.5 + (j - 1) * 18: Lab.Height = 15
      TBx.Left = 55 + (m - 1) * 84: TBx.Width = 29: TBx.Top = 40.5 + (j - 1) * 18: TBx.Height = 15
      Select Case TDon(L, 2)
         Case "M": TBx.BackColor = RGB(242, 8, 132)
         Case "S": TBx.BackColor = RGB(0, 204, 255)
         Case "N": TBx.BackColor = RGB(31, 183, 20)
         Case "J": TBx.BackColor = RGB(255, 215, 45)
         Case "REM": TBx.BackColor = RGB(240, 255, 45)
         Case "CP": TBx.BackColor = RGB(255, 153, 0) 'ou 255,102,0
         Case "CPN": TBx.BackColor = RGB(255, 153, 0) 'ou 255,102,0
         Case "CA": TBx.BackColor = RGB(0, 235, 153) 'ou 204, 255, 204
         Case "CAN": TBx.BackColor = RGB(0, 235, 153) 'ou 204, 255, 204
         Case "EF": TBx.BackColor = RGB(255, 153, 204)
         Case "EFN": TBx.BackColor = RGB(255, 153, 204)
         Case "AM": TBx.BackColor = RGB(255, 0, 0)
            TBx.ForeColor = &HFFFFFF: TBx.Font.Bold = True
         Case "JCN": TBx.BackColor = RGB(153, 204, 0)
         Case "HAR": TBx.BackColor = RGB(204, 204, 255)
         Case "RSU": TBx.BackColor = RGB(255, 204, 153)
         Case "REC": TBx.BackColor = RGB(255, 255, 255)
         Case "GRV": TBx.BackColor = RGB(153, 102, 51)
            TBx.ForeColor = &HFFFFFF: TBx.Font.Bold = True
         Case "FOS": TBx.BackColor = RGB(164, 82, 0)
            TBx.ForeColor = &HFFFFFF: TBx.Font.Bold = True
         Case "FOSN": TBx.BackColor = RGB(164, 82, 0)
            TBx.ForeColor = &HFFFFFF: TBx.Font.Bold = True
         Case "DEL": TBx.BackColor = RGB(164, 82, 0)
            TBx.ForeColor = &HFFFFFF: TBx.Font.Bold = True
         Case "DELN": TBx.BackColor = RGB(164, 82, 0)
            TBx.ForeColor = &HFFFFFF: TBx.Font.Bold = True
         Case "ACTP": TBx.BackColor = RGB(0, 0, 0)
            TBx.ForeColor = &HFFFFFF: TBx.Font.Bold = True
         Case "AAN": TBx.BackColor = RGB(166, 166, 166)
            TBx.ForeColor = &HFFFFFF: TBx.Font.Bold = True
         End Select
      Next L
   Label366.Visible = L > 366: TextBox366.Visible = L > 366
End Sub

Et quels sont les 2 soucis ?

Déjà, pour que le code puisse fonctionner, il faudrait remplacer Me par le nom de l'userform aperçu et idem pour tous les contrôles en dur :

Label366.Visible devient NomUFApercu.Label366.Visible par exemple.

Cdlt,

Ok pour le premier soucis sauf que le deuxième est que j'ai une private function sur l'Userform (qui fonctionne avec le code que j'ai transféré dans un Modul sub). Voilà le code en question :

Private Function EstFérié(ByVal LaDate As Date) As Boolean
   Dim An As Integer, a As Integer, B As Integer, C As Integer, D As Integer, _
       E As Integer, F As Integer, MPâq As Integer, Pâques As Date
   On Error Resume Next
   EstFérié = TFérié(LaDate): If Err = 0 Then Exit Function
   On Error GoTo 0
   An = Year(LaDate)
   ReDim TFérié(DateSerial(An, 1, 1) To DateSerial(An + 1, 1, 0))
   a = An Mod 19: B = An \ 100: C = (B - 17) \ 25
   D = (B - B \ 4 - (B - C) \ 3 + 19 * a + 15) Mod 30
   D = D - (D \ 28) * (1 - (D \ 28) * (29 \ (D + 1)) * ((21 - a) \ 11))
   E = (An + An \ 4 + D + 2 - B + B \ 4) Mod 7: F = D - E
   MPâq = 3 + (F + 40) \ 44: Pâques = DateSerial(An, MPâq, F + 28 - (MPâq \ 4) * 31)
   TFérié(Pâques + 1) = True: TFérié(Pâques + 39) = True: TFérié(Pâques + 50) = True
   TFérié(DateSerial(An, 1, 1)) = True: TFérié(DateSerial(An, 5, 1)) = True
   TFérié(DateSerial(An, 5, 8)) = True: TFérié(DateSerial(An, 7, 14)) = True
   TFérié(DateSerial(An, 8, 15)) = True: TFérié(DateSerial(An, 11, 1)) = True
   TFérié(DateSerial(An, 11, 11)) = True: TFérié(DateSerial(An, 12, 25)) = True
   EstFérié = TFérié(LaDate)
End Function

Il faut la passer en public (il suffit d'enlever l'instruction Private) mais surtout mettre cette fonction dans un module standard également (le même que la procédure Actualisation).

Cdlt,

Je viens de la passer en Public sauf que j'ai l'erreur "Sub ou Fonction non définie" et personnellement je ne sais pas comment basculer une fonction dans un UserForm dans un module

Pour insérer un module standard, il faut aller sur le menu contextuel de VBE "Insertion"/Module.

Ensuite, il faut se rendre sur ce nouveau module et y coller (après coupage depuis l'Userform aperçu) simplement le code. Ce module doit aussi contenir la macro Actualisation.

Cdlt,

J'ai fais, je pense comme tu me l'a conseillé sauf que ça me sort toujours Sub ou fonction non définie.

Je t'ai mis en pièce jointe les codes présent dans un module et le dernier code celui présent dans l'userform aperçu à l'origine avant que je le modifie car là je suis largué pour le coup.

20code-userform.xlsx (11.13 Ko)

Bonjour Thunder23, Ric, 3GB,

Puisque ta macro Actualisation appelle une fonction.

EstFérié(TDon(L, 1)), &HC0, vbBlack)

Il faut qu'elle la trouve. Places alors dans ton module la fonction réalisée auparavant dans l'userform.

Donc Public Function (LaDate as Date)

etc...

puis au final

End function

Rechercher des sujets similaires à "actualiser textbox userform"