'--------------------------------------------------------------------------------------- ' Procédure_____: Nom_de_Periode ' Date__________: 27/10/2021 ' Auteur________: www.CapLSS.com - https://www.caplss.com/viewtopic.php?t=217 ' Objet_________: Retourner le Nom de la Période d'une date et durée (S/M/T/A) fournies ' Référence_____: Fonction générique ' Appel_________: Nom_de_Periode(LaDate, LaDuree, opt. PasdInfo, opt. Alerte) ' Appel_________: /!\ Nécessite : No_Semaine_ISO ' Retour________: Nom Composé avec la Date et la Durée (AYYYY,AYYYYTX,YYYYMXX,YYYYSXX) ' Retour________: Si une Alerte est en place et se déclenche, "!" est ajouté en fin ' Options_______: Si PasdInfo := true, n'Affiche pas de message si une erreur est trouvée ' Options_______: Si Alerte := true, surveille la synchronisation de la date sur la Période ' Compatibilité_: (2003-2019)Office (11.0-16.0)Excel (+)32-bit (+)64-bit ' Statut________: (x)Validé ()En attente validation ()En cours développement '--------------------------------------------------------------------------------------- ' 2009.10.26 v1.00 DEV Création initiale. Donne le Nom de la Période définie ' 2012.01.14 v1.10 DEV Ajoute la gestion des erreurs et l'option de message. ' 2021.03.19 v1.20 DEV Ajoute une nouvelle Grandeur (A: Année) ' 2021.03.26 v1.30 DEV Ajoute une Alerte optionnelle si la date est asynchrone à la période ' 2021.04.01 v1.31 BUG Un trimestre commençant le 1er d'un mois quelconque ne sort pas d'alerte ' FIX Correction de la formule pour que le jour -OU- le mois déclenchent l'alerte ' 2021.10.27 v1.32 DEV Meilleure gestion des erreurs et compatibilité (suppression caractères accentués) ' Private Function Nom_de_Periode(LaDate As Date, LaDuree As String, Optional PasdInfo As Boolean, Optional Alerte As Boolean) As String ' ' /!\ Attention, nécessite No_Semaine_ISO pour la version hebdomadaire ' Dim EstErreur As Boolean Dim locForm As String ' Garantit que LaDate est juste une date LaDate = Int(LaDate) If Not IsDate(LaDate) Then LaDate = 0 ' Si la Date est en erreur : ce jour If LaDate = 0 Then LaDate = Date ' Adresse Formule locForm = "" On Error Resume Next locForm = Application.ThisCell.Address On Error GoTo 0 ' Gestion des erreurs EstErreur = False ' De quelle Unité (de Période) ? Select Case UCase(Left(LaDuree, 1)) Case "S" ' Semaine ISO ' Retournera tout de même la valeur, même en cas d'erreur Nom_de_Periode = Year(LaDate) & "S" & Format(No_Semaine_ISO(LaDate), "00") & Nom_de_Periode If (Alerte And Weekday(LaDate) <> 2) Then If locForm <> "" And Not PasdInfo Then MsgBox "En " & locForm & " : La Période Hebdomadaire : " & Nom_de_Periode & ", ne commence pas un Lundi." & Chr(10) & "Risque d'avoir une synthèse incorrecte.", Buttons:=vbInformation, Title:="Date asynchone à la Période" End If Nom_de_Periode = Nom_de_Periode & "!" End If Case "M" ' Mois ' Retournera tout de même la valeur, même en cas d'erreur Nom_de_Periode = Year(LaDate) & "M" & Format(Month(LaDate), "00") If (Alerte And Day(LaDate) <> 1) Then If locForm <> "" And Not PasdInfo Then MsgBox "En " & locForm & " : La Période Mensuelle : " & Nom_de_Periode & ", ne commence pas le premier jour du Mois." & Chr(10) & "Risque d'avoir une synthèse incorrecte.", Buttons:=vbInformation, Title:="Date asynchone à la Période" End If Nom_de_Periode = Nom_de_Periode & "!" End If Case "T" ' Trimestre ' Retournera tout de même la valeur, même en cas d'erreur Nom_de_Periode = Year(LaDate) & "T" & Int((Month(LaDate) - 1) / 3) + 1 & Nom_de_Periode If (Alerte And (Day(LaDate) <> 1 Or Int((Month(LaDate) - 1) / 3) <> ((Month(LaDate) - 1) / 3))) Then If locForm <> "" And Not PasdInfo Then MsgBox "En " & locForm & " : La Période Trimestrielle : " & Nom_de_Periode & ", ne commence pas le premier jour du Trimestre." & Chr(10) & "Risque d'avoir une synthèse incorrecte.", Buttons:=vbInformation, Title:="Date asynchone à la Période" End If Nom_de_Periode = Nom_de_Periode & "!" End If Case "A" ' Année ' Retournera tout de même la valeur, même en cas d'erreur Nom_de_Periode = "A" & Year(LaDate) & Nom_de_Periode If (Alerte And (Day(LaDate) <> 1 Or Month(LaDate) <> 1)) Then If locForm <> "" And Not PasdInfo Then MsgBox "En " & locForm & " : La Période Annuelle : " & Nom_de_Periode & ", ne commence pas le premier jour de l'Année." & Chr(10) & "Risque d'avoir une synthèse incorrecte.", Buttons:=vbInformation, Title:="Date asynchone à la Période" End If Nom_de_Periode = Nom_de_Periode & "!" End If Case Else 'Erreur ou Inconnu ' Retournera "" au minimum Nom_de_Periode = "" If Alerte Then If locForm <> "" And Not PasdInfo Then MsgBox "En " & locForm & " : La Durée fournie : " & LaDuree & ", n'est pas conforme." & Chr(10) & "Format Attendu : ", Buttons:=vbCritical, Title:="Impossible de Déterminer la Période" End If Nom_de_Periode = Nom_de_Periode & "!" End If End Select ' End Function