Userform qui ne ferme pas (entre autre)

Dim.Reichart

XLDnaute Occasionnel
Bonjour,
Un jour une question, c'est moi!

Vu que j'ai réussi à finir la macro qui compile les différents plannings, je voudrais l'améliorer un peu, en permettant de choisir la période d'affichage avec des boutons à cliquer. Pour cela, je suis parti sur un userform contenant un bouton par mois, et quelques boutons d'années.
Je me suis inspiré de l'userform publié par @pierrejean dans ce sujet, post 16 https://www.excel-downloads.com/threads/vba-plusieurs-togglebutton-a-gerer-ensemble.20031023/

Sauf que visiblement, je n'ai pas tout compris. Au début, ça fonctionnait quand je n'avais que les mois actifs, puis j'ai ajouté les années et là ca ne va plus du tout.
Déjà, les boutons ne se desélectionnent plus quand on en clique un autre de la même catégorie, et l'userform semble se fermer de façon aléatoire, parfois au premier clic, parfois pas du tout.
La date s'inscrit correctement dans les cellules en revanche, mais quand il y a plusieurs sélections, ça prend la plus élevées (ça devrait être réglé si les autres boutons se désélectionnent).
J'ai trié mes boutons en deux frame différentes, avec une sub pour chaque, vu qu'ils semblaient entrer en conflit (et la bagarre, c'est mal). Je viens de découvrir que je peux aussi les grouper, je ne sais pas si c'est mieux.
Voici un extrait du code:
VB:
Option explicit
dim flag as boolean
Private Sub ToggleButton18_Click()
Call F_click("ToggleButton18")
End Sub


Private Sub F_click(A As String)
If flag Then Exit Sub
flag = True
Dim TG As Control
Do
CommandButton1.Enabled = False
For Each TG In Frame2.Controls
    If InStr(TG.Name, "Toggglebutton") <> 0 Then
    If TG.Caption <> A Then TG = False
    End If
Next
    For Each TG In Frame2.Controls
    If TG.Value Then A = TG.Caption
    Next
Loop Until A <> ""
Cells(4, 40) = A
flag = False
End Sub
J'ai mis le code d'un bouton aussi, au cas ou le problème vienne de ce coté.
Merci à ceux qui prendront le temps de se pencher dessus et m'expliquer ce qui coince.
 

Pièces jointes

  • Exercice.xlsm
    25.3 KB · Affichages: 5

Dim.Reichart

XLDnaute Occasionnel
Bon, j'avais pas mal d'erreurs (j'en ai surement encore, vu que ça ne fonctionne pas comme je voudrais).
J'ai mis un moment à comprendre que A était intialisée avec le nom du bouton déjà, mais j'ai aussi trouvé comment trier mes boutons en extrayant le numero du bouton de la chaine de nom.
Par contre, maintenant, dès que je clique sur une année, l'userform se ferme, pas de mois ni de validation...
VB:
Private Sub t_click(Tr)
Dim M, A As String, S As Long

If flag Then Exit Sub
flag = True
CommandButton2.Enabled = False
For Each Tr In Me.Controls
'S = Right(Tr.Name, Len(Tr.Name) - InStr(1, Tr.Name, "n"))
If Right(Tr.Name, Len(Tr.Name) - InStr(1, Tr.Name, "n")) <> 0 And Right(Tr.Name, Len(Tr.Name) - InStr(1, Tr.Name, "n")) < 13 Then

If Tr Then A = Tr.Caption
If Tr.Caption <> A Then Tr = False

Else
If Tr Then M = Tr.Caption
If Tr.Caption <> M Then Tr = False
End If
Next

CommandButton2.Enabled = True
Cells(4, 39) = M
Cells(4, 40) = A
flag = False
Unload Me
End Sub
Ah, et aussi, quand j'ai voulu extraire de la chaine de caractére, j'ai tenté de declarer une variable egale au résultat, sauf que le résultat est traité comme une chaine, meme si ce sont des chiffres, donc je ne peux pas la comparer. Bizarrement, c'est accepté quand je met l'opération en brut, sans variable intermediaire.
 

Dim.Reichart

XLDnaute Occasionnel
Bon, finalement, j'ai abandonné l'idée de programmer un userform pour l'instant, c'est trop compliqué pour mon niveau actuel.
Du coup, je suis parti sur 12 boutons pour les mois, 3 pour les années et je veux attendre que les deux aient été sélectionnés pour continuer.
Le problème c'est qu'il passe à travers le "if"(juste après "Enregistrer la date sélectionnée"), vu que les conditions ne sont pas remplies.
Le code est ainsi:
VB:
Dim SR, Ann As Long, Q As String, MsgValue
Ligne1:
Q = ""
Ann = 0

'Afficher les mois et années cliquables
For SR = 1 To 12 Step 1
Q = Format("01/" & SR & "/2019", "mmmm")
Worksheets("KPI").OLEObjects("Affichage" & SR).Object.Caption = Q
Worksheets("kpi").Shapes.Range(Array("Affichage" & SR)).Visible = True
Next SR
For SR = 13 To 15 Step 1
Worksheets("KPI").OLEObjects("Affichage" & SR).Object.Caption = Year(Date) + SR - 14
Worksheets("kpi").Shapes.Range(Array("Affichage" & SR)).Visible = True
Next SR
'Enregistrer la date sélectionnée
If Q <> "" And Ann <> 0 Then
MsgValue = MsgBox("Afficher le planning à part de " & Q & " " & Ann, vbYesNoCancel, "Confirmez la date")
If MsgValue = vbCancel Then Exit Sub
If MsgValue = vbNo Then GoTo Ligne1
If MsgValue = vbYes Then
Range("am4") = Q
Range("an4") = Ann
For SR = 1 To 15 Step 1
Worksheets("kpi").Shapes.Range(Array("Affichage" & SR)).Visible = False
Next SR
End If
End If
Dans le code de chaque bouton, j'ai
Code:
Sub Affichage12(Q)
Q = "Décembre"
End Sub
Sub Affichage13(Ann)
Ann = Year(Date) - 1
End Sub
Avec Q ou Ann, selon que c'est un bouton mois ou année.
Les boutons mois fonctionnent avec un point d'arrêt, à priori pas les boutons années, mais surtout, sans point d'arrêt la macro s'arréte de suite après avoir fait apparaitre et nommé les boutons.
Donc, la question est: Comment faire pour "attendre" que mes deux valeurs soient sélectionnées?"
Merci.
 

Dim.Reichart

XLDnaute Occasionnel
Je viens de me rendre compte que j'ai oublié de remettre le fichier à jour.
La macro est "Planning", en feuille KPI.
Mais sinon, est-ce que c'est possible de faire une msgbox avec 12 boutons? Même si dans le principe, je trouve ça assez sale comme technique, mais si je n'y arrive pas par des moyens plus "propres", j'y viendrais surement.
 

Pièces jointes

  • Suivi global.xlsb
    269.7 KB · Affichages: 8

Discussions similaires

Réponses
3
Affichages
166

Statistiques des forums

Discussions
314 647
Messages
2 111 533
Membres
111 193
dernier inscrit
Raf'