UserForm ce ferme avant de sortir de la macro...

Résolu
Ant716 Messages postés 7 Statut Membre -  
Ant716 Messages postés 7 Statut Membre -
Bonjour a tous,

Voila plusieurs heures que je cherche sans succès une réponse a mon problème!

Je travail avec des macro qui initialise est ouvre un UserForm.

Sur la feuille 1, j'ai un bouton "Initi" qui lance la macro.
Dans la macros je créer des bouton dynamiquement suivant les paramètre de la feuille 2.
Ca marche très bien! (En mode non modale)

La ou ça coince c'est quand je veux ajouter une macro a chaque ToggleButton créer.
J'utilise donc : ThisWorkbook.VBProject.VBComponents() pour ajouter des macro dans le userform.
Ca marche également mais a la fin de la macro tout mon UserForm ce ferme!

(Il s'ouvre et ce ferme en une fraction de seconde!)
Je doit mettre mon userForm en mode Modale si je veut que ça reste affiché a l'ecran!

Si quelqu'un peut m'aidez!
merci d'avance,

Cordialement antoine.

Voici le code:
Private Sub Delete_Code_ThisModule()

With ActiveWorkbook.VBProject.VBComponents("UserForm_SubFilter").CodeModule
.DeleteLines 1, .CountOfLines
'.CodePane.Window.Close
End With

End Sub

Sub InitializeUserFormSubCat()

Dim Module As Object

Unload UserForm_SubFilter

Delete_Code_ThisModule

Set Module = ThisWorkbook.VBProject.VBComponents("UserForm_SubFilter")
'If Err.Number <> 0 Then: Set Module = ThisWorkbook.VBProject.VBComponents.Add(1)

Dim Bouton As Object
Dim nLabel As Object
LargeurBouton = 70
HauteurBouton = 20

Dim shB As Worksheet
Set shB = ThisWorkbook.Worksheets("Feuil2")

nFilter = 1
nCheckFilter = 1
nToggleButton = 1
iBuff = 0

Do While Not (IsEmpty(shB.Cells(4, nCheckFilter)))

i = 0

If Not (IsEmpty(shB.Cells(6, nCheckFilter))) Then

UserForm_SubFilter.Width = 25 + ((LargeurBouton + 5) * nFilter)

Set nLabel = UserForm_SubFilter.Controls.Add("Forms.Label.1")
With nLabel
.Caption = shB.Cells(4, nCheckFilter)
.Font.Bold = True
.Font.Size = 10
.Height = 15
.Width = LargeurBouton
.Left = 10 + (LargeurBouton + 5) * (nFilter - 1)
.Top = 3
End With
End If

Do While Not (IsEmpty(shB.Cells(i + 6, nCheckFilter)))

nameToggleButton = "ToggleButtonSubFilter" & nToggleButton & "_Click()"
captionToggleButton = shB.Cells(i + 6, nCheckFilter)

Set Bouton = UserForm_SubFilter.Controls.Add("Forms.ToggleButton.1")
With Bouton
.Name = nameToggleButton
.Caption = captionToggleButton
.BackColor = &H808000
.ForeColor = &HFFFFFF
.Font.Bold = True
.Font.Size = 8
.Height = HauteurBouton
.Width = LargeurBouton
.Left = 5 + (LargeurBouton + 5) * (nFilter - 1)
.Top = (HauteurBouton + 2) * (i + 1)
End With

With Module.CodeModule

.InsertLines .CountOfLines + 1, "Private Sub " & nameToggleButton
.InsertLines .CountOfLines + 1, " Test(" & captionToggleButton & ")"
.InsertLines .CountOfLines + 1, "End Sub"
.InsertLines .CountOfLines + 1, ""

End With

i = i + 1
nToggleButton = nToggleButton + 1
Loop

If i > iBuff Then
iBuff = i
End If

UserForm_SubFilter.Height = 50 + ((HauteurBouton + 2) * (iBuff))

nFilter = nFilter + 1

nCheckFilter = nCheckFilter + 1
Loop

UserForm_SubFilter.Show

End Sub

6 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    Pouvez mettre votre fichier a dispo?

    Pour transmettre un fichier,
    Veillez a ce qu'il n'y ait PAS DE DONNEES CONFIDENTIELLES
    il faut passer par un site de pièce jointe tel que cjoint.com

    Allez sur ce site : https://www.cjoint.com/
    Clic sur parcourir,
    Cherche ton fichier,
    clic sur ouvrir,
    Clic sur "Créer le lien cjoint",
    Copier le lien,
    Revenir ici le coller dans une réponse...

    ou
    'mon partage
    https://mon-partage.fr/
    0
  2. Ant716 Messages postés 7 Statut Membre
     
    Bonjour,

    Merci pour votre réponse, voici le liens du fichiers:
    https://www.cjoint.com/c/JFkjM7rStZs

    Cordialement
    Antoine
    0
    1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Re,
      chez moi bloque ici!
      Sub InitializeUserFormSubCat()
          Unload UserForm_SubFilter
          
      0
      1. Ant716 Messages postés 7 Statut Membre > f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention  
         
        Retire cette ligne elle me serre a décharger le userform quand je doit l'appeler plusieurs fois de suite.
        Donc remplace par:
        'Unload UserForm_SubFilter


        J'ai mis a jours le 1er post.

        Cordialement, antoine
        0
      2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717 > Ant716 Messages postés 7 Statut Membre
         
        Re,
        Toujours pas bon, pas possible d'entrer en mode arret ici

                        With Module.CodeModule
        
                            .InsertLines .CountOfLines + 1, "Private Sub " & nameToggleButton
                            .InsertLines .CountOfLines + 1, "   Test(" & captionToggleButton & ")"
                            .InsertLines .CountOfLines + 1, "End Sub"
                            .InsertLines .CountOfLines + 1, ""
        
                        End With
        0
  3. Ant716 Messages postés 7 Statut Membre
     
    Je bosse sur Excel 2010, a mon post ca marche quand j'appuie sur le Bouton Init de la feuille 1.
    Mais si je lance la macro pas a pas en mode arrêt ca plante ici:
    Delete_Code_ThisModule


    Si je met cette ligne en commentaire, la ca plante aussi ici:
    With Module.CodeModule
    
                        .InsertLines .CountOfLines + 1, "Private Sub " & nameToggleButton
                        .InsertLines .CountOfLines + 1, "   Test(" & captionToggleButton & ")"
                        .InsertLines .CountOfLines + 1, "End Sub"
                        .InsertLines .CountOfLines + 1, ""
    
                    End With


    Quel version d'excel utilise tu?

    Justement je cherche a savoir pourquoi en mode arrêt ça plante?
    0
  4. Ant716 Messages postés 7 Statut Membre
     
    Voici un nouveau fichier:
    https://www.cjoint.com/c/JFko1xonfus

    Pour que tu vois le UserForm.

    Mais comment ajouter une macro dynamiquement a chaque bouton?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Ant716 Messages postés 7 Statut Membre
     
    Salut,

    Alors la création du UserForm c'est Top est plus propre.
    Ta solution marche mais en mode Modale, en Non modale j'ai exactement le même problème qu'avant.

    J'ai donc ajouter ceci au propriété du UserForm:
    Set UsfForm = ThisWorkbook.VBProject.VBComponents.Add(3)
        With UsfForm
            .Properties("Caption") = "Sous catégories"
            .Properties("ShowModal") = False
        End With
        UsfName = UsfForm.Name


    Et enlevé ceci a la fin:
    VBA.UserForms.Add(UsfName).Show
        'ThisWorkbook.VBProject.VBComponents.Remove VBComponent:=UsfForm


    Je pense qu'il serai judicieux de relever les information de la feuille2, les stocker dans des Variant, ensuite créer les macro dans un module et enfin créer le userform...
    ??
    0
    1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Bonjour,

      créer les macro dans un module
      Les procedures sont propres a l'UF, pourquoi un module?
      0
  7. Ant716 Messages postés 7 Statut Membre
     
    Bonjour,

    J'avais également poster le souci sur un autre forum, voici la solution:
    Module Main:
    Public Boutons_Cdes() As New Classe1
    
    Sub ShowUsf()
       usfTest.Show 0
    End Sub
    
    Sub Action(i$)
       MsgBox "Vous avez cliqué " & i
    End Sub
    


    Module de classe:
    Option Explicit
    
    Public WithEvents BoutonCde As MSForms.ToggleButton
    Private Sub BoutonCde_Click()
    Dim i$
       i = BoutonCde.Caption
       Action i
    End Sub
    


    Userform
    Option Explicit
    
    Private Sub UserForm_Initialize()
    Dim Larg&, Haut&, i%, iColumn%, iRow%, k%, ii%, iMem
    Dim Obj As Control
    
    For Each Obj In usfTest.Controls
        If Left(Obj.Name, 2) = "tb" Then usfTest.Controls.Remove Obj.Name
    Next
    
       Larg = 70
       Haut = 20
       iColumn = ShB.Cells(4, 1).End(xlToRight).Column
       
       For i = 1 To iColumn
              Set Obj = usfTest.Controls.Add("Forms.Label.1")
              With Obj
                  .Caption = ShB.Cells(4, i)
                   With .Font
                    .Bold = True
                    .Size = 10
                   End With
                  .Height = 15
                  .Width = Larg
                  .Left = 10 + (Larg + 5) * (i - 1)
                  .Top = 3
              End With
        Next
        
        For i = 1 To iColumn
          If ShB.Cells(6, i) <> "" Then 'Si la celulle n'est pas vide
          
          On Error Resume Next
            ii = UBound(Boutons_Cdes)
          On Error GoTo 0
          
          'iMem = iRow - 5
          'iRow = ShB.Cells(6, i).End(xlDown).Row
          iRow = ShB.Cells(9 ^ 2, i).End(xlUp).Row
          If iRow - 5 > iMem Then
            iMem = iRow - 5
          End If
          
             For k = 1 To iRow - 5
                Set Obj = Me.Controls.Add("forms.ToggleButton.1")
                   With Obj
                       .Name = "tb" & k + ii
                       .Caption = ShB.Cells(k + 5, i)
                       .BackColor = &H808000
                       .ForeColor = &HFFFFFF
                        With Font
                            .Bold = True
                            .Size = 8
                        End With
                       .Height = Haut
                       .Width = Larg
                       .Left = 5 + (Larg + 5) * (i - 1)
                       .Top = (Haut + 2) * (k)
                   End With
                ReDim Preserve Boutons_Cdes(1 To k + ii)
                Set Boutons_Cdes(k + ii).BoutonCde = Obj
             Next
          End If
          Next
    Set Obj = Nothing
          usfTest.Height = 55 + ((Haut + 2) * iMem)
          usfTest.Width = 25 + ((Larg + 5) * iColumn)
    End Sub
    
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Erase Boutons_Cdes
    Unload Me
    End Sub


    Si cela peut aider quelqu'un d'autre....

    Merci beaucoup pour l'aide,

    Bien cordialement
    0