Microsoft 365 trouver code d'un userform existant

Adrien60

XLDnaute Nouveau
Bonjour,
je veux créé un userform complexe à partir d'un code genre :
VB:
Set UsfForm = ThisWorkbook.VBProject.VBComponents.Add(3)
    With UsfForm
        .Name = UsfName
        .Properties("Caption") = UsfName
        .Properties("Width") = 175
        .Properties("Height") = 375
    End With
avec ensuite tout un tas de controle.

je me demandais s'il était possible de creer un userform normalement et de récupérer le code ?
j'espère avoir été assez clair.
 
Solution
Oui, en effet, ce n'est sûrement pas la bonne technique. Il faut un seul UserForm qui s'appuyerait sur une ligne d'un tableau Excel par exemple. Vous savez, peu le font, mais on peut équiper un UserForm de méthodes et de propriétés. C'est extrêmement pratique.

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Adrien60,

s'il était possible de creer un userform normalement et de récupérer le code ?
Je ne le pense pas. Le code est interne à VBA.

Pour le fun :
Vous pouvez créer un userform complexe comme un userform normal (avec ces propriétés et ces contrôles). Dans le code de votre macro, vous pouvez créer une nouvelle instance de ce userform, modifier les propriétés de cette instance, y ajouter ou retirer des contrôles, etc.... Le plus gros du travail étant fait à la conception du Userform. Voir exemple joint.
Code dans module1 (on crée 5 instances à partir de UserForm1.
VB:
Option Explicit

Dim instances(1 To 5) As Object

Sub test()
Dim i&
  
   For i = 1 To 5
      Set instances(i) = New UserForm1
      With instances(i)
         .Label2 = i
         .Show vbModeless
         .Top = 100 + i * 60
         .Left = 100 + i * 60
      End With
   Next i
End Sub
 

Pièces jointes

  • Adrien60- création de userform- v1.xlsm
    19.2 KB · Affichages: 13

Adrien60

XLDnaute Nouveau
Bonjour @Adrien60,


Je ne le pense pas. Le code est interne à VBA.

Pour le fun :
Vous pouvez créer un userform complexe comme un userform normal (avec ces propriétés et ces contrôles). Dans le code de votre macro, vous pouvez créer une nouvelle instance de ce userform, modifier les propriétés de cette instance, y ajouter ou retirer des contrôles, etc.... Le plus gros du travail étant fait à la conception du Userform. Voir exemple joint.
Code dans module1 (on crée 5 instances à partir de UserForm1.
VB:
Option Explicit

Dim instances(1 To 5) As Object

Sub test()
Dim i&
 
   For i = 1 To 5
      Set instances(i) = New UserForm1
      With instances(i)
         .Label2 = i
         .Show vbModeless
         .Top = 100 + i * 60
         .Left = 100 + i * 60
      End With
   Next i
End Sub
Merci ça me va comme solution.
Par contre mon nombre de userform a creer est variable et dans instance(1 to X) j'ai essayé de mettre nbUsf avec nbUsf as integer a la place de 5 mais j'ai un message d'erreur qui dit que je suis obligé de mettre une constante pour X.
Auriez vous une solution ?
 

fanch55

XLDnaute Barbatruc
je me demandais s'il était possible de creer un userform normalement et de récupérer le code ?

Salut,

Si l'userform a été créé et testé par les voies normales,
pourquoi ne pas l'exporter et l'importer au moment idoine dans les classeurs voulus ?

Un exemple en automatique pour le Fun :
  • Exécutez le classeur joint : il ne se passe apparemment rien ... 🤔
  • Dézippez le fichier zip dans le même dossier que le classeur et relancez celui-ci,
  • vous allez bénéficier d'un userform déjà préparé ...
 

Pièces jointes

  • Usf_Import.xlsm
    21.7 KB · Affichages: 8
  • Cam.zip
    3.9 KB · Affichages: 3

Adrien60

XLDnaute Nouveau
Salut,

Si l'userform a été créé et testé par les voies normales,
pourquoi ne pas l'exporter et l'importer au moment idoine dans les classeurs voulus ?

Un exemple en automatique pour le Fun :
  • Exécutez le classeur joint : il ne se passe apparemment rien ... 🤔
  • Dézippez le fichier zip dans le même dossier que le classeur et relancez celui-ci,
  • vous allez bénéficier d'un userform déjà préparé ...
merci mais le but n'est pas de d'utiliser le userform dans d'autre classeur mais de creer des userform dans le meme classeur. Ci-joint le code pour une meilleur compréhension.
La solution fourni par mapomme fonctionne mais je n'arrive pas a mettre une variable pour le nombre d'instance ni a changé le nom et le caption des nouveaux userform.
VB:
Option Explicit
Dim obj As Object

Sub CreateUsf()
Dim i As Integer
Dim nbinstal As Integer
Dim Usf(1 To 10) As Object
Dim UsfName As String
 
nbinstal = ThisWorkbook.Sheets("Données").Cells(1, 1).Value
 
For i = 1 To nbinstal
    UsfName = ThisWorkbook.Sheets("Données").Cells(i + 1, 1).Value
    If UsfExist(UsfName) = False Then
        Set Usf(i) = New ModelUsf
            With Usf(i)
            .Label2 = i
            .Top = 100 + i * 60
            .Left = 100 + i * 60
            End With
    End If
    ShowAnyForm (UsfName)
Next i
End Sub

Sub ShowAnyForm(FormName As String, Optional Modal As FormShowConstants = vbModal)
 
        For Each obj In VBA.UserForms
            If StrComp(obj.Name, FormName, vbTextCompare) = 0 Then
                obj.Label1.Caption = "Form Already Loaded"
                obj.show Modal
                Exit Sub
            End If
        Next obj
          
        With VBA.UserForms
            On Error Resume Next
            Err.Clear
            Set obj = .Add(FormName)
            If Err.Number <> 0 Then
                MsgBox "Err: " & CStr(Err.Number) & "   " & Err.Description
                Exit Sub
            End If
            obj.show Modal
        End With
        
    
End Sub

Function UsfExist(UsfName As String, Optional classeur As String) As Boolean

Dim VBComp As VBComponent

On Error Resume Next
Set VBComp = ThisWorkbook.VBProject.VBComponents(UsfName)
If VBComp Is Nothing Then
UsfExist = False
Else
UsfExist = True
End If

End Function
Si vous avez des solutions, je suis preneur.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
mon nombre de userform a creer est variable

Voyez ce code comme un exemple de création à la volée.
VB:
Sub test()
Dim i&, nbr As Long
   nbr = Val(InputBox("Nombre de fenêtre à créer ?:"))
   If nbr <= 0 Then Exit Sub
   ReDim instances(1 To nbr)
   For i = 1 To nbr
      Set instances(i) = New UserForm1
      With instances(i)
         .Label2 = i
         .Show vbModeless
         .Top = 100 + i * 60
         .Left = 100 + i * 60
      End With
   Next i
 
   'Plus tard -> Une supplémentaire
   nbr = nbr + 1
   ReDim Preserve instances(1 To nbr)
   Set instances(nbr) = New UserForm1
   instances(nbr).Label2 = nbr
   instances(nbr).Label3 = "Et une en bonus"
   instances(nbr).Show vbModeless
End Sub
 

Pièces jointes

  • Adrien60- création de userform- v2.xlsm
    20.4 KB · Affichages: 10

Adrien60

XLDnaute Nouveau
Voyez ce code comme un exemple de création à la volée.
VB:
Sub test()
Dim i&, nbr As Long
   nbr = Val(InputBox("Nombre de fenêtre à créer ?:"))
   If nbr <= 0 Then Exit Sub
   ReDim instances(1 To nbr)
   For i = 1 To nbr
      Set instances(i) = New UserForm1
      With instances(i)
         .Label2 = i
         .Show vbModeless
         .Top = 100 + i * 60
         .Left = 100 + i * 60
      End With
   Next i

   'Plus tard -> Une supplémentaire
   nbr = nbr + 1
   ReDim Preserve instances(1 To nbr)
   Set instances(nbr) = New UserForm1
   instances(nbr).Label2 = nbr
   instances(nbr).Label3 = "Et une en bonus"
   instances(nbr).Show vbModeless
End Sub
je comprends pas chez moi sa fonctionne pas. erreur:424 objet requis
VB:
Sub CreateUsf()
Dim i As Integer
Dim nbinstal As Integer
Dim UsfName As String
 
nbinstal = ThisWorkbook.Sheets("Données").Cells(1, 1).Value
If nbinstal <= 0 Then Exit Sub
   ReDim Usf(1 To nbinstal)
For i = 1 To nbinstal
    UsfName = ThisWorkbook.Sheets("Données").Cells(i + 1, 1).Value
    If UsfExist(UsfName) = False Then
        Set Usf(i) = New ModelUsf
            With Usf(i)
            .Label2 = i
            .Top = 100 + i * 60
            .Left = 100 + i * 60
            End With
    End If
    ShowAnyForm (UsfName)
Next i
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Sans fichier comprenant le code et les données et le code de toutes les fonctions utilisées, je ne peux pas grand chose... :(
En général, avec l'erreur 424, on tente de manipuler quelque chose qui n'est pas un objet. mais qui devrait l'être. Mais sans fichier, c'est compliqué...
 

Adrien60

XLDnaute Nouveau
Re,

Sans fichier comprenant le code et les données et le code de toutes les fonctions utilisées, je ne peux pas grand chose... :(
En général, avec l'erreur 424, on tente de manipuler quelque chose qui n'est pas un objet. mais qui devrait l'être. Mais sans fichier, c'est compliqué...
Ci-joint le fichier
Je n'arrive pas nom plus a changé le nom des userforms créés .name ne fonctionne pas.
Merci pour votre aide
 

Pièces jointes

  • essaiuserform2.xlsm
    38.6 KB · Affichages: 7

fanch55

XLDnaute Barbatruc
Re,
Les Usf de "classe" perdent leur nom et sont référençables uniquement par le nom d'objet donné au moment de leur création .

Exemple:

Set ChambreEnfant = new Chambre​
Set ChambreParent = new Chambre​
ChambreEnfant et ChambreParent doivent être déclarés en tant que Public dans un module.​
On peut par la suite dans les codes , les référencer correctement :​
ChambreEnfant.show​
Unload ChambreParent
ChambreEnfant.label1 = ...​
etc ...​

Effectivement, s'il y a beaucoup d'Usf à créér,
on est tenté de les "rassembler" dans un tableau:
redim preserve Chambres ( 1 to ...)​
set Chambres(1) = new Chambre​
etc ...​
On doit également déclarer le tableau en Public pour y faire référence plus tard .​
Et là, on découvre qu'on ne se rappelle plus ce que sont les chambres(1) ou chambres(n) :​
Chambres(1).show​
Chambres(25).hide​
etc ...​
Nota:
Il ne faut pas retrouver le nom de l'userform dans le code de ce dernier, mais le désigner par ME de préférence .​
 
Dernière édition:

Adrien60

XLDnaute Nouveau
Re,
Les Usf de "classe" perdent leur nom et sont référençables uniquement par le nom d'objet donné au moment de leur création .

Exemple:

Set ChambreEnfant = new Chambre​
Set ChambreParent = new Chambre​
ChambreEnfant et ChambreParent doivent être déclarés en tant que Public dans un module.​
On peut par la suite dans les codes , les référencer correctement :​
ChambreEnfant.show​
Unload ChambreParent
ChambreEnfant.label1 = ...​
etc ...​

Effectivement, s'il y a beaucoup d'Usf à créér,
on est tenté de les "rassembler" dans un tableau:
redim preserve Chambres ( 1 to ...)​
set Chambres(1) = new Chambre​
etc ...​
On doit également déclarer le tableau en Public pour y faire référence plus tard .​
Et là, on découvre qu'on ne se rappelle plus ce que sont les chambres(1) ou chambres(n) :​
Chambres(1).show​
Chambres(25).hide​
etc ...​
Nota:
Il ne faut pas retrouver le nom de l'userform dans le code de ce dernier, mais le désigner par ME de préférence .​
Ok merci pour les explications.
J'arrive maintenant a creer mes userforms par contre ils ne sont pas chargés dans mon VBAProject.
 

sousou

XLDnaute Barbatruc
Bonjour à tous.
Pas sur que cela t'aide, mais ce fichier construit une base ou des bases de données avec les userforms associés peur-être que quelques lignes de code pourront t'inspirer
 

Pièces jointes

  • Constructeur 3.xlsm
    123.3 KB · Affichages: 7

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 848
dernier inscrit
Djigbenou