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