Ajouter frame via VBA dans un userform

Bonsoir à toutes et à tous,

Voici quelques jours que je bloque sur un problème que j'ai essayé de contourner de plusieurs manières différentes sans pouvoir me sortir de l'impasse. C'est pourquoi je sollicite votre aide qui se révèle toujours pertinente.

Dans le cadre d'un large projet de suivi d'entrainement d'un groupe d'athlètes, j'ai tenté de créer un userform pour simplifier et accélérer la rentrée de donnée de course. Vous trouverez en PJ une version simplifiée (seulement les éléments qui ne marche pas encore ) de ce userform.

Voici son fonctionnement :

Le usfrm contient déjà un cadre série 1 avec un bouton ajouter une course. Lorsque ce dernier est cliqué il fait apparaitre un autre frame avec des données à l'intérieur. Dans un maximum de 10 courses.

J'aimerais maintentant pouvoir rajouter une deuxième série et une troisième qui fonctionneraient comme la première. Cependant dès que l'on ajoute un frame dans le usfrm excel plante et se ferme totalement. Je suppose qu'il rentre un conflit quelque part dans les boucles de création des premiers cadre mais je ne parviens pas à trouver où et pourquoi.

J'espère avoir été clair, n'hésitez pas si vous avez besoin de précisions.

Merci d'avance pour votre aide !

Totor_

40testvba1.xlsm (18.63 Ko)

Bonjour

Je na pense pas que tu ais beaucoup de réponses avec un fichier sans aucune donnée

Crdlt

Bonjour,

Sans vouloir t'offenser, il m'étonnerait beaucoup que tu aies les compétences nécessaires à ce genre d'exercice ?

Ce serait peut-être bien de passer par la case Présentation et ensuite de faire une brève description de ton projet pour qu'on te propose quelque chose d'approprié.

A+

Bonjour,

Autant pour moi, je passe faire une petite présentation tout de suite après !

Effectivement @galopin01, tu as visé juste. Je suis loin d'avoir le niveau pour ce projet, mais j'ai déjà appris beaucoup et puis il n'a pas vocation à être un produit fini, mais a évoluer au grès des années et des apprentissages. Ceci-dit le projet en lui même n'est pas si compliqué, (à voir en détail en présentation du coup ;-) ). C'est beaucoup de tcd pour mettre en valeur les bonnes données. Je voudrais simplement dès le début avoir des données propre pour pouvoir les utiliser sans soucis dans quelques années. D'où le userform.

Pour répondre à @Joco7915, les données sont l'éditeur de code vba, en laissant uniquement ce qui se rapporte à se userform et pas au reste du projet. Tu trouveras ci-dessous le code :

Dim courseCount As Integer ' Déclare une variable pour suivre le nombre de cadres ajoutés

Private Sub CommandButton1_Click()
' Rend le cadre visible
    Me.Frame2.Visible = True
End Sub

Private Sub cmd_ajouterserie1_Click()

End Sub

Private Sub Frame1_Click()

End Sub

Private Sub Frame2_Click()

End Sub

Private Sub UserForm_Initialize()
    courseCount = 2

    CreateCourseFrame "Course 1", 1
    CreateCourseFrame "Course 2", 2
End Sub

Private Sub cmd_ajout_course1_2_Click()
    ' Ajoute un nouveau cadre de course
    If courseCount < 10 Then
        ' Incrémente le compteur de cadres
        courseCount = courseCount + 1
        ' Crée un nouveau cadre de course
        CreateCourseFrame "Course " & courseCount, courseCount
    Else
        MsgBox "Le nombre maximum de courses a été atteint.", vbExclamation
    End If
End Sub

Private Sub CreateCourseFrame(caption As String, index As Integer)
    ' Vérifie si le cadre parent existe déjà
    Dim parentFrame As Frame
    On Error Resume Next
    Set parentFrame = Me.Controls("Frame1")
    On Error GoTo 0

    If Not parentFrame Is Nothing Then
        ' Vérifie si le cadre existe déjà
        Dim existingFrame As Frame
        On Error Resume Next
        Set existingFrame = parentFrame.Controls("Frame" & index)
        On Error GoTo 0

        If existingFrame Is Nothing Then
            ' Crée le cadre de course
            Dim newFrame As Frame
            Set newFrame = parentFrame.Controls.Add("Forms.Frame.1", "Frame" & index, True)
            With newFrame
                .Height = 48
                .Left = 10
                .Top = (index - 1) * 58 + 10 ' Positionne le cadre en dessous du précédent
                .Width = 190
                .caption = caption
                .Visible = True
            End With

            Dim lblDistance As MSForms.Label
            Dim lblChrono As MSForms.Label
            Dim lblRecup As MSForms.Label
            Dim cmbDistance As MSForms.ComboBox
            Dim txtChrono As MSForms.TextBox
            Dim txtRecup As MSForms.TextBox

            Set lblDistance = newFrame.Controls.Add("Forms.Label.1", "lbl_distance", True)
            Set lblChrono = newFrame.Controls.Add("Forms.Label.1", "lbl_chrono", True)
            Set lblRecup = newFrame.Controls.Add("Forms.Label.1", "lbl_recup", True)

            With lblDistance
                .Top = 3
                .Left = 5
                .Width = 60
                .Height = 12
                .caption = "Distance"
            End With

            With lblChrono
                .Top = 3
                .Left = 75
                .Width = 40
                .Height = 12
                .caption = "Chrono"
            End With

            With lblRecup
                .Top = 3
                .Left = 135
                .Width = 40
                .Height = 12
                .caption = "Récup"
            End With

            Set cmbDistance = newFrame.Controls.Add("Forms.ComboBox.1", "cmb_distance", True)
            With cmbDistance
                .Top = 15
                .Left = 5
                .Width = 60
                .Height = 18
            End With

            Set txtChrono = newFrame.Controls.Add("Forms.TextBox.1", "txt_chrono", True)
            Set txtRecup = newFrame.Controls.Add("Forms.TextBox.1", "txt_recup", True)

            With txtChrono
                .Top = 15
                .Left = 75
                .Width = 50
                .Height = 18
            End With

            With txtRecup
                .Top = 15
                .Left = 135
                .Width = 50
                .Height = 18
            End With
        End If
    End If
End Sub

Donc pour l'instant ce code fonctionne bien, mais dès que l'on rajoute rajoute un cadre (série 2), excel plante.

Dans l'attente de vos conseils ! Je ferai attention à ma boite mail pour les délais cette fois-ci.

Totor_

Bonjour,

A ma connaissance il n'est pas possible de rajouter des contrôles de cette manière.

La création de contrôles (et leurs propriétés et méthodes) en quantité suffisante devraient être effectuée dès maintenant (en dur et non dans le code) à charge de gérer des données sur feuilles.

L'ajout de contrôles (et en particulier d'évènements) se fait par l'intermédiaire de modules de classes, ce qui est du ressort de professionnels qualifiés.

Mais dans ton contexte je doute fort qu'ils utiliseraient VBA.

On en trouve quelques applications sommaires sur les forum mais ça ne dépasse que rarement le niveau de la dissuasion... ou sommairement pour des jeux simples.

Le seul exemple un peu crédible et complet que je connaisse est la création de calendriers pour la saisie de date.

A+

Bonjour,

Pour compléter ma réponse, parce que l'athlé est un domaine que je connais un peu (au moins aussi bien qu'Excel !), il y a différentes manières de voir les choses selon la taille du club ou tu exerces et ton type de spécialité…

S'agissant de Courses, et en l'absence de contradicteur à ma réponse précédente, tu peux considérer que ton approche doit être révisée.

A mon avis, pour un suivi individuel dans tous les cas une simple base de données de ce genre devrait convenir :

N°Lic > Nom > DateNaissance > DatePerf > Catégorie > Spécialité > Performance

A charge après de filtrer par type de course et par individu pour suivre son évolution.

Dans ce cas un simple UserForm de "Saisie / Recherche / Modification" de Base de Donnée peut suffire.

Tu en trouveras un ici

Après il faut voir comment tu peux envisager ça dans un projet plus global...

A te lire...

Rechercher des sujets similaires à "ajouter frame via vba userform"