VBA : récupérer .caption d'un "Frame"

Bonjour à tous,

Dans le petit bout de code ci dessous, je récupère les valeurs de case à cocher que je recopie dans la feuille "Journal_enregistrements_FI.

Private Sub ButValiderFI_click()

With Sheets("Journal_enregistrements_FI")
    For i = 1 To 60
        If Me.Controls("But" & i) Then
            ligne = IIf(.[A1] = "", 1, .[A65000].End(xlUp).Row + 1)
            .Cells(ligne, 4).Value = Me.Controls("But" & i).Caption
            .Cells(ligne, 1) = LstNoms.Value
            .Cells(ligne, 2).Value = Me.Calendar1
        End If
    Next i
End With

Unload UsfFI
Unload UsfNoms
End Sub

Je souhaite placer en ".Cells(ligne, 3).Value = ???" la valeur du nom du Frame (caption), mais je n'y suis pas arrivé...

Quelqu'un peut-il venir à mon secours ?

Merci d'avance.

Fabrice,

bonjour fabrice, forum,

Quel est le nom (et non le caption) de ton Frame?

Re_, le forum, Bonjour vba-new,

Le nom du Frame est "Fram1" (je n'ai pas été original sur ce coup là...).

Par contre, je souhaite afficher la valeur du "caption" pour chaque bouton Car, en fait, j'ai 15 Frame dans lesquels j'ai positionné 4 boutons. Si tu veux, les 60 boutons sont répartis dans 15 Frame et je souhaite que, quand 1 des boutons est coché, le nom du Frame soit collé dans ma feuille "Journal_enregistrements_FI" (comme le choix de la liste et la date...)

J'espère que je suis assez clair, sinon n'hésite pas...

Merci d'avance.

Fabrice,

re,

Fabrice69 a écrit :

Je souhaite placer en ".Cells(ligne, 3).Value = ???" la valeur du nom du Frame (caption), mais je n'y suis pas arrivé...

Je dirais ça :

.Cells(ligne, 3).Value = Me.Fram1.Caption

Mais comment fais-tu pour détecter le frame dont le bouton est coché?

Re- le forum,

Mais comment fais-tu pour détecter le frame dont le bouton est coché?

C'est justement ce que je voudrais faire... Récupérer le nom du Frame en fonction du bouton qui est coché...

Merci de ton aide.

Fabrice,

Re-,

Sinon, je créé autant de boucles que j'ai de Frame (et j'en ai 15) :

Private Sub ButValiderFI_click()

With Sheets("Journal_enregistrements_FI")
    For i = 1 To 4
        If Me.Controls("But" & i) Then
            ligne = IIf(.[A1] = "", 1, .[A65000].End(xlUp).Row + 1)
            .Cells(ligne, 4).Value = Me.Controls("But" & i).Caption
            .Cells(ligne, 1) = LstNoms.Value
            .Cells(ligne, 2).Value = Me.Calendar1
            .Cells(ligne, 3).Value = Fram1.Caption
        End If
    Next i

For i = 5 To 8
        If Me.Controls("But" & i) Then
            ligne = IIf(.[A1] = "", 1, .[A65000].End(xlUp).Row + 1)
            .Cells(ligne, 4).Value = Me.Controls("But" & i).Caption
            .Cells(ligne, 1) = LstNoms.Value
            .Cells(ligne, 2).Value = Me.Calendar1
            .Cells(ligne, 3).Value = Fram2.Caption
        End If
    Next i
End With

Unload UsfFI
Unload UsfNoms
End Sub

Mais je ne pense pas que cela soit le plus rapide et le plus propre, mais cela fonctionne...

Merci d'avance.

Fabrice,

Essaie avec ça fabrice,

Private Sub ButValiderFI_click()

    j = 1
    With Sheets("Journal_enregistrements_FI")
        For i = 1 To 15    'numéro des 15 frames
            For j = j To j + 3    'numéro des boutons
                If Me.Controls("But" & j) Then
                    ligne = IIf(.[A1] = "", 1, .[A65000].End(xlUp).Row + 1)
                    .Cells(ligne, 4).Value = Me.Controls("But" & j).Caption
                    .Cells(ligne, 1) = LstNoms.Value
                    .Cells(ligne, 2).Value = Me.Calendar1
                    .Cells(ligne, 3).Value = Me.Controls("Fram" & i).Caption
                End If
            Next j
        Next i
    End With

Unload UsfFI
Unload UsfNoms
End Sub

Ce code est vrai si tes 15 frames s'appellent "Fram"+numéro et tes boutons s'appellent "But"+numéro

Par contre, tous les boutons ne se trouvent peut-être pas sur le même userform. Dans ce cas, tu pourras ajouter un "On Error Resume Next".

Salut le forum

Utilise la propriétés Tag de ton CheckBox, tu définis le Frame.Caption à l'initialisation du UserForm

Private Sub UserForm_Initialize()
Dim Ctrl_Frame As Control
Dim Ctrl_CheckBox As Control

For Each Ctrl_Frame In Controls
  If TypeName(Ctrl_Frame) = "Frame" Then
    For Each Ctrl_CheckBox In Ctrl_Frame.Controls
      If TypeName(Ctrl_CheckBox) = "CheckBox" Then
        Ctrl_CheckBox.Tag = Ctrl_Frame.Caption
      End If
    Next Ctrl_CheckBox
  End If
Next Ctrl_Frame

End Sub

Ensuite ta boucle fait le travail sur les 60 CheckBos's.

Pour des OptionButton remplace "CheckBox" par "OptionButton"

Mytå

Bonjour le Forum,

Vba-new, Mytå, merci à tous les deux pour votre implication. Je teste vos solutions dans la journée et vous tiens au courant.

Encore merci et bon week-end à tous.

Fabrice,

Re-,

Je viens donc de tester, en premier, la solution de vba-new et c'est parfait. Cela fonctionne exactement comme je voulais. Je n'abandonne pas pour autant le travail de Mytå et me pencherai dessus quand j'aurai un peu plus de temps mais je pense que j'aurai besoin de quelques explications complémentaires...

Si je peux abuser, dans ce userform, comme vous l'avez certainement compris, les utilisateurs cliquent sur des boutons qui me servent, en fait de compteur. C'est à dire que dans chaque frame, j'ai 4 boutons associés à des valeurs : 0.25, 0.50, 0.75 et 1. Je souhaiterai que la saisie ne puisse jamais dépasser 1 (= 1 jour...) quelque soit le ou les frames utilisés.

Merci de votre aide si précieuse...

Fabrice,

Re,

Je suppose que tout cela fait un peu référence à ce fil là? https://forum.excel-pratique.com/viewtopic.php?t=13146

Je pense que tu as raison fabrice de résoudre ton problème en pas à pas

C'est plus motivant pour ceux qui t'aideraient

Quoi qu'il en soit, concernant le dépassement de 1 jour, tu peux tester ce code :

Private Sub ButValiderFI_click()
Dim x As Single
    j = 1
    With Sheets("Journal_enregistrements_FI")
        For i = 1 To 15    'numéro des 15 frames
            For j = j To j + 3    'numéro des boutons
                If Me.Controls("But" & j) Then
                    ligne = IIf(.[A1] = "", 1, .[A65000].End(xlUp).Row + 1)
                    .Cells(ligne, 4).Value = Me.Controls("But" & j).Caption
                    If x > 1 Then MsgBox "attention ça dépasse 1 à partir du frame n°" & _
                       i & " - bouton n°" & j: Exit Sub
                    .Cells(ligne, 1) = LstNoms.Value
                    .Cells(ligne, 2).Value = Me.Calendar1
                    .Cells(ligne, 3).Value = Me.Controls("Fram" & i).Caption
                End If
            Next j
        Next i
    End With

Unload UsfFI
Unload UsfNoms
End Sub

PS : le code de Mytå a l'air très intéressant! Mais je suis pas assez compétent pour l'exploiter Attendons de voir...

Re- le forum,

Tu as tout compris pour mon post précédent (que je vais d'ailleurs fermer...).

J'essaye effectivement d'avancer "pas à pas" dans le VBA et ce n'est pas facile. Il faudrait pouvoir se pencher dessus quotidiennement pour progresser mais avec le boulot à côté, pas facile... Heureusement, il y a ce super forum...

Bref, je ne sais pas si j'aurai le temps d'essayer ton code avant lundi (boulot + week-end très chargé...) mais je ne manquerai pas de te tenir informé dès que possible. En tous cas, un grand merci à toi pour ton aide.

Je sais que le code de Mytå doit être interessant, mais si même toi tu te déclares incompétent, alors imagine moi à mon niveau... Mais j'essayerai quand même de le comprendre.

Merci encore.

Fabrice,

Bonjour le forum,

Vba-new, j'ai testé le code et, malheureusement, cela ne fonctionne pas. Je peux effectuer ma saisie sans problème mais si je clique sur 0.5 dans un frame puis sur 0.75 dans un autre frame, les données sont reportées dans ma feuille "Journal_enregistrements_FI" sans que la macro signale le dépassement d'une journée.

As-tu une petite idée ?

Merci d'avance.

Fabrice,

Bonjour,

Hum... !

La macro de Myta enregistre (dès l'initialisation du USF) dans une propriété "Tag" la valeur de la Frame correspondante au bouton...

Je l'ai reprise et adaptée à tes OptionButton

Yapuka lire la valeur "Tag" du bouton pour savoir de quelle Frame il sort...

Pour le reste c'est un peu plus compliqué...

Déjà, si on coche plusieurs boutons dans plusieurs Frame... il faudra plusieurs lignes dans ton journal pour récupérer tes informations...

Ensuite il n'est pas simple d'additionner des Captions...

Enfin j'ai bricolé un peu tout ça... En cas de dépassement la macro n'enregistre rien et délivre un simple message d'erreur... sinon les coches sont enregistrés.

Bon ça te laisse un petit peu de boulot pour le reste mais ça devrait te remettre un peu sur les rails...

La démo

A+

Il se peux que le fichier précédent ne fonctionne pas... Utilise cet autre.

A+

Bonsoir le forum,

Galopin01, j'ai tenté de lancer la macro de mon PC à la maison et j'ai tout de suite eu un message d'erreur...

Je vais essayé demain au boulot car c'est là que j'ai tous mes fichiers.

Je te tiens au courant mais déjà un grand merci de t'être penché sur mon problème.

Bonne soiré à tous.

Fabrice,

Oui, bien qu'il n'y ait pas de différence notable entre les deux versions, il semble que seule la dernière version fonctionne correctement. Celà est peut-être du au fait que je travaille dessus en mode de compatibilité avec Vista et 2007.

A+

Bonjour le forum,

Bonjour galopin01 et tout d'abord merci pour l'intérêt que tu portes à mon petit souci. J'ai lancé ce matin ta macro et j'ai une erreur : "Erreur d'exécution 13, Incompatibilité de type". Puis, quand je fais "débogage", le curseur se positionne sur la ligne ... Then comptFI = comptFI + CSng...

Saurais-tu d'où provient cette erreur ?

Merci d'avance.

Fabrice,

Sur mon classeur ou sur un bricolage à toi ?

Non, non... Pas de bricolage... J'ai repris ton classeur.

@+

Rechercher des sujets similaires à "vba recuperer caption frame"