Utilisation de plusieurs Toggles dans un userform

Chris57

XLDnaute Occasionnel
Bonjour à tous,

je cherche à créer un calendrier qui ne dépende pas des contrôles Microsoft qui disparaissent au fur et à mesure des versions. Je fais ça pour mon travail, pour plusieurs utilisateurs sur différents PC sur réseau, sur des PC dont les versions excel changent régulièrement et où mes accès sont limités.

Voici ce que j'ai réalisé :
Capture.JPG

J'ai mis une série de ToggleButtons pour sélectionner le jour.

En cliquant sur une date le calendrier s'ouvre à cette date.
Ce que je souhaite c'est que le toggle du jour soit activé à l'ouverture du toggle.
Puis lorsqu'on sélectionne un autre jour, que la date en haut soit actualisée et que l'ancien toggle soit désactivé et le nouveau activé.

Chaque Toggle lance la macro "CLICtoggles"

Voici cette macro :
Code:
Sub CLICtoggles()
    ' Détecte le jour sélectionné
        Debug.Print Me.ActiveControl.Caption
        JOURselect = Me.ActiveControl.Caption
    
    ' Désactive tous les toggles sauf celui du jour sélectionné
        For i = 1 To 31
            If i <> JOURselect Then
                CALENDRIER.Controls("ToggleButton" & i) = False
            End If
        Next i
    
    ' Renseigne la textbox
        DATEinit = CDate(JOURselect & "/" & MOISbox & "/" & ANNEEbox)
        Call INSCRIREdate
End Sub

Le problème est que la boucle For i ne fonctionne pas et je ne trouve pas pourquoi.
 

Pièces jointes

  • Capture.JPG
    Capture.JPG
    29.8 KB · Affichages: 44
  • Calendrier_Chris 3 (avec toogles).xlsm
    51.8 KB · Affichages: 57

Dranreb

XLDnaute Barbatruc
Re : Utilisation de plusieurs Toggles dans un userform

Bonsoir.
Mettez JOURselect = CInt(Me.ActiveControl.Caption)
ou alors typez explicitement vos variables.
Moi j'aurais probablement mis : Sub CLICtoggles(ByVal Jour As Integer) et puis 31 lignes de :
Private Sub ToggleButtonX_Click(): CLICtoggles X: End Sub
Ou alors un module de classe.
 

Chris57

XLDnaute Occasionnel
Re : Utilisation de plusieurs Toggles dans un userform

Salut,

tu peux ajouter cecie à la fin de l'initialisation de ton userform
CALENDRIER.Controls("ToggleButton" & Day(ActiveCell)).SetFocus
J'ai déjà testé cette instruction. D'une part ce n'est pas que le focus qu'il faut mais aussi l'activation du toggle (enfoncé) et d'autre part l'userform ne se ferme que lorsque l'utilisateur appuie sur Valider. Il peut donc changer de date plusieurs fois avant et les anciens toggles doivent se désactiver.

Mettez JOURselect = CInt(Me.ActiveControl.Caption)
Je ne connaissait pas cette instruction, mais est ce que ça va changer quelque chose ?

ou alors typez explicitement vos variables.
Elles le sont, en public

Ou alors un module de classe.
J'essaie d'éviter le module de classe. Je veux un calendrier le plus petit possible et le plus simple possible afin de l'intégrer à d'autres classeurs par la suite. On en trouve un paquet sur le net (d'ailleurs c'est à partir de l'un d'entre eux que j'ai démarré) mais ce sont pour la plupart des usines à gaz où il faut exporter l'userform + un module + un module de class + des macros dans la feuilles.

Moi j'aurais probablement mis : Sub CLICtoggles(ByVal Jour As Integer) et puis 31 lignes de :
Private Sub ToggleButtonX_Click(): CLICtoggles X: End Sub
Bonne idée, j'ai pas l'habitude d'utiliser cette méthode ! Merci !!!




Je constate que je me suis mal exprimé. Mon souci est que lorsqu'on appuie sur un toggle, il faut que l'ancien se désactive, a savoir qu'au lancement de l'userform, le toggle de la date de la cellule est activé automatiquement.
Dans mon cas lorsque je clique sur un nouveau toggle, l'ancien ne se désactive pas, ou alors si je modifie un peu les instructions, aucun ne s'active...

Si dans ma macro CLICtoggles je rajoute ceci :
Code:
CALENDRIER.Controls("ToggleButton" & JOURselect) = True
j'ai un défaut "espace pile insuffisant"
 

Dranreb

XLDnaute Barbatruc
Re : Utilisation de plusieurs Toggles dans un userform

est ce que ça va changer quelque chose ?
Oui.
Elles le sont, en Public
Non. Elles sont déclarées en Public, mais non explicitement typées, elles sont donc implicitement typées As Variant. Me.ActiveControl.Caption est un String, or un Variant/String ne peut être égal à un Variant/Integer.
j'ai un défaut "espace pile insuffisant"
Oui, c'est plus compliqué que je ne le pensais parce que la mise à False de ToggleButtonX provoque l'exécution de la ToggleButtonX_Click, alors ça se mord la queue.
Il vaudrait peut être mieux Transmettre le ToggleButton lui même en paramètre, pour pouvoir abandonner l'exécution tout de suite si sa Value est False.
 
Dernière édition:

Chris57

XLDnaute Occasionnel
Re : Utilisation de plusieurs Toggles dans un userform

ça va changer quoi ? C'est quoi la différence entre
JOURselect = Me.ActiveControl.Caption
et
JOURselect = CInt(Me.ActiveControl.Caption)




J'ai trouvé une solution en fouillant des forums en anglais :

Sub CLICtoggles()
' Détecte le jour sélectionné
Debug.Print Me.ActiveControl.Caption
JOURselect = Me.ActiveControl.Caption

' Désactive tous les toggles sauf celui du jour sélectionné
For Each Ctrl In CALENDRIER.Controls
If TypeName(Ctrl) = "ToggleButton" Then
If Ctrl.Object.Caption = JOURselect Then
Ctrl.Object.Value = True
Else
Ctrl.Object.Value = False
End If
End If
Next Ctrl

' Renseigne la textbox
DATEinit = CDate(JOURselect & "/" & MOISbox & "/" & ANNEEbox)
Call INSCRIREdate
End Sub

étrangement de cette manière plus de défaut espace pile.


Question variables, j'ai lu que les typer améliore la rapidité d’exécution des macros. Mais dans mon cas à qui ça me sert de les déclarer en string ou integer ?
 

Dranreb

XLDnaute Barbatruc
Re : Utilisation de plusieurs Toggles dans un userform

Ça aurait servi à ce qu'ils soient de même nature des 2 cotés de la comparaison et qu'il puisse trouver l'égalité.
Mais comme ça ça va aussi, c'est String des deux coté puisque ça vient des deux cotés de Caption.
Exécuter ça pour voir la différence :
VB:
JOURselect = Me.ActiveControl.Caption
MsgBox TypeName(JOURselect)
JOURselect = CInt(Me.ActiveControl.Caption)
MsgBox TypeName(JOURselect)
MsgBox Me.ActiveControl.Caption = CInt(Me.ActiveControl.Caption)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Utilisation de plusieurs Toggles dans un userform

Bonjour.

Bon, et bien j'y vais de mon calendrier aussi, d'autant que j'avais vaguement en tête l'idée de le faire en voyant que je ne trouvais aucune trace de contrôle Calendar ni autres DTPicker (ils étaient moches de toute façon) dans les fournitures de mon nouvel ordi (une chance que j'ai la ListView par contre).
 

Pièces jointes

  • MonCalendrier.xlsm
    39.4 KB · Affichages: 45
  • MonCalendrier.xlsm
    39.4 KB · Affichages: 44
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 626
Messages
2 111 294
Membres
111 093
dernier inscrit
Yvounet