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_
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 SubDonc 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...