Salut JM270L
Ce que tu demandes est possible mais il y a un petit risque il faudrait savoir à l'avance si en supprimant ton Formulaire, tu seras obligé de passer par un Module Class pour recréer en quelque sorte ce que tu souhaite détruire.
Code:
' --- Créer un userform et controls par code :
' --- Cocher ref: Microsoft forms 2.0 Object Library : Via Onglet Menu/Outils/Références ...
Option Explicit
Sub mOnAction_ActiveXForms_Create()
Dim oUSRF As Object ' --- Variable Objet UserForm à créer.
Dim oLbL As MSForms.Label ' --- Variable Objet Label à créer.
Dim oCmdB As MSForms.CommandButton ' --- Variable Objet ComboBox à créer.
Dim AddObjEvent$ ' --- ou As String ($), pour Script d'évènement.
Dim iNbrLignes& ' --- ou As Long (&), pour lignes du code.
' --- Étiquette et Gestion d'erreur ---
VBA.Information.Err.Clear
On Error GoTo Fin
On Error Resume Next
'---- Créer dynamiquement un UserForm ----
Set oUSRF = ThisWorkbook.VBProject.VBComponents.Add(3)
With oUSRF
' --- Paramètrer les propriétés de l'objet UserForm ----
.Properties("Caption") = "UserForm à la volée"
.Properties("Height") = 240
.Properties("Width") = 320
'---- Créer le bouton de fermeture du ComandeButton ----
Set oCmdB = .Designer.Controls.Add("forms.CommandButton.1")
' --- Paramètrer les propriétés de l'objet ComboBox ----
With oCmdB
.Caption = "Fermer"
.Left = 200
.Top = 180
End With
'---- Créer le Label / étiquette du titre ----
Set oLbL = .Designer.Controls.Add("forms.Label.1")
' --- Paramètrer les propriétés de l'objet LABEL :
With oLbL
.Caption = "Mon texte"
.TextAlign = fmTextAlignCenter
.Left = 20
.Top = 20
.BackColor = vbRed
.BorderStyle = fmBorderStyleSingle
End With
' °°° Ajout du code évènementiel pour le CommandButton au niveau du USF créé °°°
' --- Création du bloc de procédure pour le Bouton ---
AddObjEvent$ = "Sub CommandButton1_Click()" & vbCrLf & "Unload Me" & _
vbCrLf & "End Sub"
' --- contenu du bloc de procédure ---
With .CodeModule
iNbrLignes& = .CountOfLines
.InsertLines INbrLignes& + 1, AddObjEvent$
End With
' °°° Ajout du code évènementiel procédurial pour le Label au niveau du Formulaire créé °°°
' --- Création du bloc de procédure pour le Label ---
AddObjEvent$ = "Sub Label1_Click()" & vbCrLf & "MsgBox " & _
"""Vous avez cliqué sur mon _ texte""" & vbCrLf & "End Sub"
' --- contenu du bloc de procédure --
With .CodeModule
iNbrLignes& = .CountOfLines
.InsertLines iNbrLignes& + 1, AddObjEvent$
End With
'---- Affiche le UserForm ----
VBA.UserForms.Add(.Name).Show
'---- Détruit le UserForm ----
ThisWorkbook.VBProject.VBComponents.Remove oUSF ' <<<<<<<<<<< supprime l'userf
' ---- Sortir de la procédure ---
Exit Sub
Fin:
On Error GoTo 0
End Sub
------------------------------------------------
NB: Bonne chance - Inchallah!
Bonjour
vu que la question est marquée résolue depuis 2008, est-ce nécessaire ?
D'autre part, pour poster un code merci de faire comme décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code