1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
| Option Explicit
'Auteur: patricktoulon/exceldownload/Version:4.1.9 maj du 26.11.2020/Adapté par Goninph 12.03.2023
'https://www.developpez.net/forums/d2147600/logiciels/microsoft-office/excel/macros-vba-excel/excel-vba-datepicker-mso365-numeros-semaines/#post11929194
'A copier dans la feuille
'''''''Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'''''''Dim DateFormats, DF 'Afficher le calendrier selon le format de la cellule
''''''' DateFormats = Array("ddd dd mm yy") 'format à reproduire dans la cellule pour activer le calendrier par ex: jjj jj mm aaaa
''''''' For Each DF In DateFormats
''''''' If DF = Target.NumberFormat Then
''''''' Cancel = True 'Empêche l'édition de la cellule active (F2) lors de Worksheet_BeforeDoubleClick Cancel = True permet de resortir du mode édition
''''''' Target = USF_Calendrier_Sem_Ferie.ShowX(Target)
''''''' End If
''''''' Next
'''''''End Sub
'A copier dans un userform
'''''''Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
''''''' TextBox1 = USF_Calendrier_Sem_Ferie.ShowX(TextBox1)
'''''''End Sub
Const bt1Back As Variant = &HE0E0E0 'Couleur Background bouton jour
Const bt1fc As Variant = &H0& 'Couleur texte bouton jour
Const btweekBack As Variant = &H80000004 'Couleur Background bouton jour weekend
Const btweekfc As Variant = &H808080 'Couleur texte bouton jour weekend
Const mobildayback As Variant = &HC0FFFF 'Couleur Background bouton jour mobile
Const mobildayFC As Variant = &HFF0000 'Couleur texte jour mobile
Const bt2Back As Variant = &H80000004 'Couleur Background boutons jour vide
Const backfériéday As Variant = &HC0C0FF 'Couleur Background boutons jour férié
Const fériédayFC As Variant = &H0& 'Couleur texte bouton jour férié
Const backDayRemonter As Variant = &H80C0FF 'Couleur Background bouton jour de la cellule ou usf
Const backDayVacances As Variant = &HFFFF80 'Couleur Background bouton vacances
Public region
Public Obj As Object
Public WithEvents Bout As MSForms.CommandButton 'map pour 42 bouton
Public lance As Boolean
Public jour
Public mois
Public an
Public valeur As Date
Public objX As Object
Private clavier(43) As New USF_Calendrier_Sem_Ferie 'tableau d'instance de l'userform
Public Function ShowX(Optional objX As Object)
Dim t#
Dim Forme
region = 13 'optionRegionale
Set Obj = objX 'les variables argument doivent etre instruites avant le show IMPORTANT!!!!!!!!!!
lance = True
'Option de placement
Me.startupposition = 0
Me.Left = Application.ActiveWindow.Left
Me.Top = Application.ActiveWindow.Top - 12
Me.Show
If TypeName(Obj) = "Range" Then
valeur = DateSerial(an, mois, jour)
Else
valeur = format(DateSerial(an, mois, jour), Forme)
End If
If valeur = "30/11/1999" Then
ShowX = "" 'On modifie valeur apres le show
Else
ShowX = valeur 'On modifie valeur apres le show
End If
Unload Me
End Function
Private Sub UserForm_Activate()
Dim i&, TRT$
If Not lance Then Unload Me: MsgBox " c'est une boite de dialogue plus un userform" & vbCrLf & "il se lance uniquememt par une de ses deux fonctions " & vbCrLf & """ShowX"" ou ""ShowTopLeft""": Exit Sub
ldate.Caption = "Aujourd'hui " & format(Date, "dddd dd.mm.yyyy")
config
Me.Caption = "Calendrier avec fériés vaudois"
For i = 1 To 42: Set clavier(i).Bout = Me.Controls("j" & i): Next 'mappage pour evenement unique (42 boutons) (intra userform sans module classe)
Me.Repaint
End Sub
Sub config()
Dim Listdays, La_Date, i&
USF_Calendrier_Sem_Ferie.region = 13
USF_Calendrier_Sem_Ferie.Cbmonth.List = Split("Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Août, Septembre, Octobre, Novembre, Décembre", ",")
If Not Obj Is Nothing Then 'Remonte la date existante dans le calendrier
If IsDate(Obj) Then
La_Date = Obj.Value
BT_Old_Value_JJ.Caption = Day(La_Date)
BT_Old_Value_MM.Caption = Month(La_Date)
BT_Old_Value_AA.Caption = Year(La_Date)
Else
La_Date = Date
BT_Old_Value_JJ.Caption = 0
BT_Old_Value_MM.Caption = 0
BT_Old_Value_AA.Caption = 0
End If
End If
USF_Calendrier_Sem_Ferie.Cbmonth.ListIndex = Month(La_Date) - 1
For i = 2023 To Year(La_Date) + 20: USF_Calendrier_Sem_Ferie.Cbyear.AddItem i: Next
SpinButton1.Value = Month(La_Date): SpinButton2.Value = Year(La_Date)
ReloadClavier
Me.Repaint
End Sub
'Evenement unique pour 42 boutons
Private Sub Bout_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
With USF_Calendrier_Sem_Ferie: .jour = Bout.Caption: .mois = .Cbmonth.ListIndex + 1: .an = .Cbyear.Value: .Hide: End With 'le unload se fait ailleurs
End Sub
Private Sub ldate_Click()
Dim Listdays, La_Date, i&
If USF_Calendrier_Sem_Ferie.region = 1000 Then USF_Calendrier_Sem_Ferie.region = Application.International(xlDateOrder) 'AUTOMATIQUE SYSTEM
USF_Calendrier_Sem_Ferie.Cbmonth.List = Split("Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Août, Septembre, Octobre, Novembre, Décembre", ",")
La_Date = Date
USF_Calendrier_Sem_Ferie.Cbmonth.ListIndex = Month(La_Date) - 1
For i = 2023 To Year(La_Date) + 20: USF_Calendrier_Sem_Ferie.Cbyear.AddItem i: Next
SpinButton1.Value = Month(La_Date): SpinButton2.Value = Year(La_Date)
ReloadClavier
Me.Repaint
End Sub
'Evenement combobox et spinbutton des mois et des années
Private Sub SpinButton1_Change():
With SpinButton1
If .Value = 0 Then .Value = 12: Cbyear.Value = Cbyear.Value - 1
If .Value = 13 Then .Value = 1: Cbyear.Value = Cbyear.Value + 1
Cbmonth.ListIndex = .Value - 1:
End With
End Sub
'Mise ajour du clavier
Public Sub ReloadClavier()
Dim X&, i&, A&, NB_JOURS&, Y&, WkD&
If Cbmonth.Value = "" Or Cbyear.Value = "" Then Exit Sub
Select Case USF_Calendrier_Sem_Ferie.region
Case 0, 22: WkD = vbSunday
Case 1, 2, 12, 13: WkD = vbMonday
End Select
X = Weekday(DateSerial(USF_Calendrier_Sem_Ferie.Cbyear, USF_Calendrier_Sem_Ferie.Cbmonth.ListIndex + 1, 1), WkD)
NB_JOURS = Day(DateSerial(Cbyear.Value, Cbmonth.ListIndex + 2, 0))
For i = 1 To 6: Me.Controls("sem" & i).Caption = "": Next
For i = 1 To 42
With USF_Calendrier_Sem_Ferie.Controls("j" & i)
.Caption = "": .Enabled = False: .BackColor = bt2Back: .ControlTipText = ""
If i >= X And A <= NB_JOURS - 1 Then
.Visible = True: A = A + 1: .Enabled = True: .Caption = A ' .BackColor = bt1Back
Y = CLng(DateSerial(USF_Calendrier_Sem_Ferie.Cbyear.Value, USF_Calendrier_Sem_Ferie.Cbmonth.ListIndex + 1, A))
Controls(.Tag).Caption = Evaluate("= TRUNC((" & Y & "-WEEKDAY(" & Y & ",2)+11-DATE(YEAR(" & Y & "-WEEKDAY(" & Y & " ,2)+4),1,1))/7)")
.BackColor = férié(i)
End If
End With
Next
End Sub
Private Function férié(i)
Dim La_Date As Date, paques As Date, ctrlJ As Object, CF^
Dim Date_Remontee As Variant
Dim Date_Début_Vacances As Variant
Set ctrlJ = USF_Calendrier_Sem_Ferie.Controls("J" & i)
La_Date = DateSerial(Cbyear, Cbmonth.ListIndex + 1, ctrlJ.Caption)
paques = CDate(((Round(DateSerial(Cbyear.Value, 4, (234 - 11 * (Cbyear.Value Mod 19)) Mod 30) / 7, 0) * 7) - 6))
férié = bt1Back: CF = bt1fc 'couleur base
ctrlJ.ForeColor = bt1fc
Date_Remontee = BT_Old_Value_JJ.Caption & "." & BT_Old_Value_MM.Caption & "." & BT_Old_Value_AA.Caption
If Date_Remontee <> "0.0.0" Then
Date_Remontee = BT_Old_Value_JJ.Caption & "." & BT_Old_Value_MM.Caption & "." & BT_Old_Value_AA.Caption
Else
Date_Remontee = 0
End If
Date_Début_Vacances = CDate("21/07/23") 'Début des vacances d'été
Select Case region
Case 13 'suisse
If Weekday(DateSerial(USF_Calendrier_Sem_Ferie.Cbyear, USF_Calendrier_Sem_Ferie.Cbmonth.ListIndex + 1, ctrlJ.Caption), vbMonday) > 5 Then férié = btweekBack: CF = btweekfc
Select Case True
' Case La_Date = CDate("01/03/" & Cbyear): férié = backfériéday: ctrlJ.ControlTipText = "Mardi Gras": CF = fériédayFC
Case La_Date = CDate("01/01/" & Cbyear): férié = backfériéday: ctrlJ.ControlTipText = "Jour de l'an": CF = fériédayFC
Case La_Date = CDate("02/01/" & Cbyear): férié = backfériéday: ctrlJ.ControlTipText = "Vaud et Jura": CF = fériédayFC
Case La_Date = paques - 2: férié = backfériéday: ctrlJ.ControlTipText = "Vendredi saint": CF = fériédayFC
Case La_Date = paques: férié = backfériéday: ctrlJ.ControlTipText = "Pâques": CF = fériédayFC
Case La_Date = paques + 1: férié = backfériéday: ctrlJ.ControlTipText = "Lundi de Pâques": CF = fériédayFC
Case La_Date = CDate("01/05/" & Cbyear.Value): férié = backfériéday: ctrlJ.ControlTipText = "Fête du travail": CF = fériédayFC
Case La_Date = paques + 39: férié = backfériéday: ctrlJ.ControlTipText = "Ascension": CF = fériédayFC
Case La_Date = paques + 40: férié = backDayVacances: ctrlJ.ControlTipText = "Pont de l'ascension": CF = fériédayFC
Case La_Date = paques + 49: férié = backfériéday: ctrlJ.ControlTipText = "Pentecôte": CF = fériédayFC
Case La_Date = paques + 50: férié = backfériéday: ctrlJ.ControlTipText = "Lundi de Pentecôte": CF = fériédayFC
Case La_Date = CDate("01/08/" & Cbyear.Value): férié = backfériéday: ctrlJ.ControlTipText = "Fête Nationale": CF = fériédayFC
Case La_Date = CDate("22/09/" & Cbyear) - Weekday("22/09/" & Cbyear.Value, 2): férié = backfériéday: ctrlJ.ControlTipText = "Jeûne Fédéral": CF = fériédayFC
Case La_Date = CDate("22/09/" & Cbyear) - Weekday("22/09/" & Cbyear.Value, 2) + 1: férié = backfériéday: ctrlJ.ControlTipText = "Lundi du Jeûne": CF = fériédayFC
Case La_Date = CDate("25/12/" & Cbyear): férié = backfériéday: ctrlJ.ControlTipText = "Noel": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 1): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 2): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 3): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 4): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 5): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 6): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 7): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 8): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 9): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 10): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 11): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 12): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 13): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 14): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 15): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 16): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 17): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 18): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 19): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 20): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 21): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 22): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = CDate(Date_Début_Vacances + 23): férié = backDayVacances: ctrlJ.ControlTipText = "Vacances": CF = fériédayFC
Case La_Date = Date: férié = mobildayback: CF = mobildayFC: ctrlJ.ControlTipText = "Aujourd'hui"
Case La_Date = CDate(Date_Remontee): férié = backDayRemonter: ctrlJ.ControlTipText = "Date saisie": CF = fériédayFC
End Select
End Select
ctrlJ.ForeColor = CF
End Function
Private Sub Cbmonth_Change(): SpinButton1.Value = Cbmonth.ListIndex + 1: USF_Calendrier_Sem_Ferie.ReloadClavier: End Sub
Private Sub Cbmonth_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger): KeyAscii = 0: End Sub
Private Sub Cbyear_Change(): SpinButton2.Value = Cbyear.Value: USF_Calendrier_Sem_Ferie.ReloadClavier: End Sub
Private Sub Cbyear_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger): KeyAscii = 0: End Sub
Private Sub SpinButton2_Change(): Cbyear.Value = SpinButton2.Value: End Sub
Private Sub BT_Fermer_Click() 'Ferme avec l'ancienne valeur
With USF_Calendrier_Sem_Ferie: .jour = BT_Old_Value_JJ.Caption: .mois = BT_Old_Value_MM.Caption: .an = BT_Old_Value_AA.Caption: .Hide: End With 'le unload se fait ailleurs
End Sub
Private Sub BT_Effacer_Click() 'Efface et ferme avec la valeur à rien
With USF_Calendrier_Sem_Ferie: .jour = 0: .mois = 0: .an = 0: .Hide: End With 'le unload se fait ailleurs
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then
With USF_Calendrier_Sem_Ferie: .jour = BT_Old_Value_JJ.Caption: .mois = BT_Old_Value_MM.Caption: .an = BT_Old_Value_AA.Caption: End With
Cancel = True
Me.Hide
Else
Cancel = False
End If
End Sub |
Partager