Déterminer 1er lundi du mois en semaine paire etc...
SF-TU
Messages postés
19
Statut
Membre
-
SF-TU Messages postés 19 Statut Membre -
SF-TU Messages postés 19 Statut Membre -
Bonjour,
Je vais essayer de vous expliquer rapidement mon souci.
J'ai un fichier Planning qui contient un onglet par semaine. Sur chaque onglet j'ai donc 6 dates correspondant aux jours de la semaine en question (l'onglet 1 correspond à la semaine 1 de l'année en cours, j'ai donc lundi 29/12/2014, mardi 30/12/2014 etc jusqu'au samedi 3/01/2015)
J'ai un autre fichier Clients, qui liste tous nos clients ainsi que la fréquence à laquelle on doit intervenir chez eux (tous les lundis, tous les lundis des semaines paires (ou impaires), le 1er lundi du mois (ou le 2ème, le dernier....), le 1er lundi du mois en semaine paire (ou impaire), le 1er lundi uniquement sur le mois pairs... etc etc bref toutes les fréquences possibles et bien-sûr pas que les lundis, ça marche aussi pour les autres jours de la semaine.
Je voudrais donc que pour chaque date de mon onglet actif du classeur Planning, vérifier si un client correspond à ce/ces critères. Et si c'est le cas, mettre le nom du client dans une cellule à côté de la date en question.
Par exemple, pour le lundi 5 janvier 2015, il faut extraire les clients qui ont une fréquence d'intervention du lundi de toutes les semaines, mais aussi du 1er lundi du mois, des lundis en semaine paire, du 1er lundi en semaine paire, du 1er lundi en mois impair.
J'ai fait quelques recherches mais j'ai beaucoup de mal à manipuler les dates et je voudrais comprendre comment vérifier tous les critères possibles:
Est-ce que c'est le:
1er lundi du mois?
2ème lundi du mois?
le dernier lundi?
le 1er lundi en semaine paire?
Et autre question, comment je peux écrire clairement la fréquence d'intervention pour que la macro puisse la comparer avec la date à tester? Pour le moment, j'ai fait une colonne "jour", une autre "récurrence" (toutes les semaines, une fois par mois..), une "semaine" (paire ou impaire), une "mois" (pair ou impair) et enfin une "fréquence" (le 1er, le 2ème, le dernier..)
Merci de m'apporter quelques réponses/ bouts de piste. J'avance lentement mais je préfère vraiment comprendre ce que je fait plutôt que d'écrire bêtement les solutions qu'on me donne! :-)
Si besoin je mettrais mes fichiers et mon code mais je vais devoir les épurer grandement! :-)
Bonne journée à tous!
Je vais essayer de vous expliquer rapidement mon souci.
J'ai un fichier Planning qui contient un onglet par semaine. Sur chaque onglet j'ai donc 6 dates correspondant aux jours de la semaine en question (l'onglet 1 correspond à la semaine 1 de l'année en cours, j'ai donc lundi 29/12/2014, mardi 30/12/2014 etc jusqu'au samedi 3/01/2015)
J'ai un autre fichier Clients, qui liste tous nos clients ainsi que la fréquence à laquelle on doit intervenir chez eux (tous les lundis, tous les lundis des semaines paires (ou impaires), le 1er lundi du mois (ou le 2ème, le dernier....), le 1er lundi du mois en semaine paire (ou impaire), le 1er lundi uniquement sur le mois pairs... etc etc bref toutes les fréquences possibles et bien-sûr pas que les lundis, ça marche aussi pour les autres jours de la semaine.
Je voudrais donc que pour chaque date de mon onglet actif du classeur Planning, vérifier si un client correspond à ce/ces critères. Et si c'est le cas, mettre le nom du client dans une cellule à côté de la date en question.
Par exemple, pour le lundi 5 janvier 2015, il faut extraire les clients qui ont une fréquence d'intervention du lundi de toutes les semaines, mais aussi du 1er lundi du mois, des lundis en semaine paire, du 1er lundi en semaine paire, du 1er lundi en mois impair.
J'ai fait quelques recherches mais j'ai beaucoup de mal à manipuler les dates et je voudrais comprendre comment vérifier tous les critères possibles:
Est-ce que c'est le:
1er lundi du mois?
2ème lundi du mois?
le dernier lundi?
le 1er lundi en semaine paire?
Et autre question, comment je peux écrire clairement la fréquence d'intervention pour que la macro puisse la comparer avec la date à tester? Pour le moment, j'ai fait une colonne "jour", une autre "récurrence" (toutes les semaines, une fois par mois..), une "semaine" (paire ou impaire), une "mois" (pair ou impair) et enfin une "fréquence" (le 1er, le 2ème, le dernier..)
Merci de m'apporter quelques réponses/ bouts de piste. J'avance lentement mais je préfère vraiment comprendre ce que je fait plutôt que d'écrire bêtement les solutions qu'on me donne! :-)
Si besoin je mettrais mes fichiers et mon code mais je vais devoir les épurer grandement! :-)
Bonne journée à tous!
5 réponses
Bonjour,
Mon premier conseil, en ce qui concerne les dates sous VBA, est d'utiliser un max de petites fonctions. En effet, avec les dates on réalise bien souvent le même type d'opération.
Mon second conseil est de s'accrocher parce que... ça "saoule" vite.
Voici déjà quelques fonctions :
🎼 Cordialement,
Franck 🎶
Mon premier conseil, en ce qui concerne les dates sous VBA, est d'utiliser un max de petites fonctions. En effet, avec les dates on réalise bien souvent le même type d'opération.
Mon second conseil est de s'accrocher parce que... ça "saoule" vite.
Voici déjà quelques fonctions :
Option Explicit
'variables
Dim Annee As Integer
Dim Mois As Integer
Dim Jour As Integer
'la sub principale :
Sub test()
MsgBox Combientieme("MERCREDI", CDate("12/02/2014"))
End Sub
'Les fonctions :
Function Combientieme(Jourdelasemaine As String, maDate As Date) As Integer
Dim i, Dates As Object, Cpt As Integer
Mois = Month(maDate)
Annee = Year(maDate)
Set Dates = CreateObject("Scripting.Dictionary")
For i = 1 To DernierJour(Mois, Annee)
If UCase(Format(i & "/" & Mois & "/" & Annee, "dddd")) = UCase(Jourdelasemaine) Then
Cpt = Cpt + 1
Dates(CDate(i & "/" & Mois & "/" & Annee)) = Cpt
End If
Next i
Combientieme = Dates(maDate)
End Function
Function DernierJour(Mois As Integer, Annee As Integer) As Integer
Select Case Mois
Case 1, 3, 5, 7, 8, 10, 12
DernierJour = 31
Case 4, 6, 9, 11
DernierJour = 30
Case 2
DernierJour = IIf(EstBissextile(Annee), 29, 28)
Case Else
DernierJour = 0 'cas d'une erreur
End Select
End Function
Function EstBissextile(Annee As Integer) As Boolean
EstBissextile = False
If Annee Mod 4 = 0 And (Annee Mod 100 <> 0 Or Annee Mod 400 = 0) Then EstBissextile = True
End Function
🎼 Cordialement,
Franck 🎶
Bonjour.
Voici des éléments, pour savoir à quel jour correspond une date, il faut utiliser Weekday().
Si tu cherches le premier lundi du moi, et bien par du premier jour, regarde si c'est un lundi si oui super, sinon ajoute un jour etc...
Pour savoir à quel numéro de semaine correspond une date regade ici https://www.mrexcel.com/board/threads/date-to-week-number-using-vba.218978/#post1069391
Pour ta récurrence, ça me parrait trés compliqué de mettre tous les paramètres dans une seule colonne, déjà ton départ est un jour ou un numéro (le mardi ou le 10), ensuite tu peux avoir une récurence mensuelle, hebdomadaire ou journalière.
Tu pourrais faire un UserForm avec des boutons à cocher et des listes déroulantes qui proposent toutes les conditions possibles.
Tu peux t"inspirer des récurrences des différents logiciels de rendez-vous (outlook, etc..)
Voici des éléments, pour savoir à quel jour correspond une date, il faut utiliser Weekday().
Si tu cherches le premier lundi du moi, et bien par du premier jour, regarde si c'est un lundi si oui super, sinon ajoute un jour etc...
Pour savoir à quel numéro de semaine correspond une date regade ici https://www.mrexcel.com/board/threads/date-to-week-number-using-vba.218978/#post1069391
Pour ta récurrence, ça me parrait trés compliqué de mettre tous les paramètres dans une seule colonne, déjà ton départ est un jour ou un numéro (le mardi ou le 10), ensuite tu peux avoir une récurence mensuelle, hebdomadaire ou journalière.
Tu pourrais faire un UserForm avec des boutons à cocher et des listes déroulantes qui proposent toutes les conditions possibles.
Tu peux t"inspirer des récurrences des différents logiciels de rendez-vous (outlook, etc..)
Bonjour,
Pour chercher le Nieme jour d'un mois.. tu peux utiliser ceci :
Et pour tester :
Pour chercher le Nieme jour d'un mois.. tu peux utiliser ceci :
Function niemejourMois(num_jour As Integer, position_jour As Integer, mois As Integer, annee As Integer) As Date
Dim firstDayOfMonth As Integer
Dim DatefirstDayOfMonth As Date
DatefirstDayOfMonth = CDate(Format(CDate("01/" & mois & "/" & annee), "dd/mm/YYYY"))
firstDayOfMonth = Day(DatefirstDayOfMonth)
If num_jour = firstDayOfMonth And position_jour = 1 Then
niemejourMois = firstDayOfMonth
Else
If num_jour = firstDayOfMonth Then
niemejourMois = DatefirstDayOfMonth + ((position_jour - 1) * 7)
Else
niemejourMois = DatefirstDayOfMonth + ((position_jour - 1) * 7) - firstDayOfMonth + num_jour
End If
End If
End Function
Et pour tester :
Sub test() ' Date du Quatrième Mercredi du mois de décembre 2014 : msgbox niemejourMois(3, 4, 12, 2014) End Sub
Aller.. une petite dernière...
Pour trouver (comme la précédente) le Nième jour (de la semaine) d'un mois donné..avec possibilité de ne prendre que les semaines PAIR / IMPAIR ou ALL (peu importe)
Et pour tester :
Il y a surement des ajustements à faire.. mais ça donne un bon début..
Pour trouver (comme la précédente) le Nième jour (de la semaine) d'un mois donné..avec possibilité de ne prendre que les semaines PAIR / IMPAIR ou ALL (peu importe)
Function listJoursduMois(num_jour As Integer, mois As Integer, annee As Integer, Optional filtreSemainePairImpair = "ALL") As Variant()
Dim dateTmp As Date
Dim L As Integer
Dim numSemaine As Integer
Dim arrListDateJofMonth()
Dim firstDayOfMonth As Integer
Dim DatefirstDayOfMonth As Date
Dim DateLastDayOfMonth As Date
DatefirstDayOfMonth = CDate(Format(CDate("01/" & mois & "/" & annee), "dd/mm/YYYY"))
DateLastDayOfMonth = DateAdd("d", -1, DateAdd("m", 1, DatefirstDayOfMonth))
firstDayOfMonth = Day(DatefirstDayOfMonth)
L = 0
dateTmp = DatefirstDayOfMonth
Do
'Debug.Print ("dateTmp : " & dateTmp & " -- weekday(dateTmp): " & Weekday(dateTmp))
If Weekday(dateTmp) - 1 = num_jour Then
numSemaine = WeekNum(dateTmp)
semainePair = (numSemaine Mod 2 = 0)
Select Case filtreSemainePairImpair
Case "ALL"
L = L + 1
ReDim Preserve arrListDateJofMonth(3, L)
arrListDateJofMonth(0, L - 1) = dateTmp
arrListDateJofMonth(1, L - 1) = numSemaine
arrListDateJofMonth(2, L - 1) = semainePair
Case "PAIR"
If semainePair = True Then
L = L + 1
ReDim Preserve arrListDateJofMonth(3, L)
arrListDateJofMonth(0, L - 1) = dateTmp
arrListDateJofMonth(1, L - 1) = numSemaine
arrListDateJofMonth(2, L - 1) = semainePair
End If
Case "IMPAIR"
If semainePair = False Then
L = L + 1
ReDim Preserve arrListDateJofMonth(3, L)
arrListDateJofMonth(0, L - 1) = dateTmp
arrListDateJofMonth(1, L - 1) = numSemaine
arrListDateJofMonth(2, L - 1) = semainePair
End If
End Select
End If
dateTmp = DateAdd("d", 1, dateTmp)
Loop Until dateTmp >= DateLastDayOfMonth
listJoursduMois = arrListDateJofMonth
End Function
Function WeekNum(D As Date) As Integer
WeekNum = CInt(Format(D, "ww", 2))
End Function
Et pour tester :
Sub test2() 'Par exemple... Connaitre la date ' du troisième mercredi du mois de novembre 2014 arrListJour = listJoursduMois(3, 11, 2014) MsgBox arrListJour(0, 3 - 1) 'Par exemple... Connaitre la date ' du jeudi du mois de novembre 2014 de la deuxieme semaine PAIR arrListJour = listJoursduMois(4, 11, 2014, "PAIR") MsgBox arrListJour(0, 2 - 1) 'Par exemple... Connaitre la date ' du jeudi du mois de novembre 2014 de la première semaine PAIR arrListJour = listJoursduMois(4, 11, 2014, "PAIR") MsgBox arrListJour(0, 1 - 1) End Sub
Il y a surement des ajustements à faire.. mais ça donne un bon début..
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Pour trouver le premier et le dernier jour du mois.. pas besoin de Select case...
ceci devrait suffire :
Dim DatefirstDayOfMonth As Date Dim DateLastDayOfMonth As Date DatefirstDayOfMonth = CDate(Format(CDate("01/" & mois & "/" & annee), "dd/mm/YYYY")) DateLastDayOfMonth = DateAdd("d", -1, DateAdd("m", 1, DatefirstDayOfMonth))Oui, pas nécessaire le Select Case, mais...
- je voulais juste trouver le numéro du dernier jour, 28 30 ou 31, pas la date du dernier jour du mois,
- je trouve le Select Case très explicite. On comprend facilement ou je veux en venir, enfin moi j'me comprends ;-)
- finalement il s'avère plus rapide que, par exemple :
Function Dernier_Jour(Mois As Integer, Annee As Integer) As Integer Dernier_Jour = Day(CDate("01/" & Mois + 1 & "/" & Annee) - 1) End FunctionVoilà pourquoi j'utilise cette méthode.