Formule recherche jour semaine

ya_v_ka

XLDnaute Impliqué
Hello le forum,

Voilà plusieurs jours que je sèche pour créer un tableau des jours fériés qui fonctionne pour toutes les dates et toutes les années.
Les formules proposées sur le net ont toutes leurs avantages et leurs défauts... Alors je me suis dit :

Si un spécialiste nous créait la panacée universelle sous forme de formule personnalisée du genre :

=CHERCHE.JOUR(a;m;j;o)

Qui correspondrait à :
a = année de recherche
m = mois de recherche (de 1 à 12)
j = jour recherché (de lundi : 1 à dimanche : 7)
o = occurrence dans le mois (de 1 à 5)

Ainsi en donnant par exemple : = CHERCHE.JOUR(2015;9;3;2) on trouverai le 2e mercredi de septembre 2015 !

Avec un petit souci pour la 5e occurrence qui pourrait se retrouver sur le mois suivant...

Y'aurait même moyen de compliquer en rajoutant le sens... afin de trouver le dernier lundi du mois ou l'avant-dernier jeudi...

Qu'en dites vous ?

Ya'v
 

job75

XLDnaute Barbatruc
Re : Formule recherche jour semaine

Bonjour Christian, Jean-Claude,

Et ça c'est mon code (vraiment bestial) :

Code:
Function CHERCHEJOUR(an%, mois As Byte, jour As Byte, ordre As Byte) As Date
If mois * jour * ordre = 0  Or mois > 12 Or jour > 7 Or ordre > 5 Then End 'valeur d'erreur
Dim prem As Date, n As Byte, i As Byte
prem = DateSerial(an, mois, 1)
Do
  If Weekday(prem + i, 2) = jour Then
    CHERCHEJOUR = prem + i
    n = n + 1
    If n = ordre Then Exit Do
  End If
  i = i + 1
Loop
If Month(CHERCHEJOUR) <> mois Then CHERCHEJOUR = CHERCHEJOUR - 7
End Function
Bonne fin de soirée.
 
Dernière édition:

ya_v_ka

XLDnaute Impliqué
Re : Formule recherche jour semaine

Hello,

JCGL --> Comment fais-tu pour retrouver aussi vite de tels joyaux... après des heures de recherche je n'y suis jamais arrivé, sinon je n'aurais pas posté mon idée ! Merci en tous cas ;-)
job75 --> Superbe, simplement.

Merci à vous je vais pouvoir progresser cette fois !

Ya'v
 

tototiti2008

XLDnaute Barbatruc
Re : Formule recherche jour semaine

Bonsoir à tous,

Oui, je sais, un revenant :eek:

ma version

Code:
Function ChercheJour(an As Long, mois As Long, jour As Long, Occurrence As Long) As Date
Dim Dat As Date
    Dat = DateSerial(an, mois, 1)
    Dat = Dat + (7 + jour - Weekday(Dat, vbMonday)) Mod 7 + (Occurrence - 1) * 7
    If Month(Dat) = mois And Year(Dat) = an Then ChercheJour = Dat
End Function
 

job75

XLDnaute Barbatruc
Re : Formule recherche jour semaine

Bonjour Marc,

Quel plaisir de te revoir sur XLD, vraiment tu nous manquais beaucoup.

J'avais bien précisé que ma solution du post #4 était bestiale.

Moins facile à comprendre (mais a priori on peut se passer de Mod) :

Code:
Function CHERCHEJOUR(an%, mois As Byte, jour As Byte, ordre As Byte) As Date
If mois * jour * ordre = 0 Or mois > 12 Or jour > 7 Or ordre > 5 Then End  'valeur d'erreur
Dim prem As Date
prem = DateSerial(an, mois, 1)
CHERCHEJOUR = prem - Weekday(prem - jour - 1) + 7 * ordre
If Month(CHERCHEJOUR) <> mois Then CHERCHEJOUR = CHERCHEJOUR - 7
End Function
Bonne journée.
 

job75

XLDnaute Barbatruc
Re : Formule recherche jour semaine

Re,

Pour obtenir le dernier ou l'avant-dernier jour du mois on utilisera :

Code:
Function DernierJour(an%, mois As Byte, jour As Byte) As Date
If mois * jour = 0 Or mois > 12 Or jour > 7 Then End  'valeur d'erreur
Dim prem As Date
prem = DateSerial(an, mois + 1, 1)
DernierJour = prem - Weekday(prem - jour - 1)
End Function

Function AvantDernierJour(an%, mois As Byte, jour As Byte) As Date
If mois * jour = 0 Or mois > 12 Or jour > 7 Then End  'valeur d'erreur
Dim prem As Date
prem = DateSerial(an, mois + 1, 1)
AvantDernierJour = prem - Weekday(prem - jour - 1) - 7
End Function
A+
 

tototiti2008

XLDnaute Barbatruc
Re : Formule recherche jour semaine

Bonjour à tous, Bonjour job :)

Merci de ton accueil :)

Pour obtenir le dernier ou l'avant-dernier jour du mois on utilisera :

On peut juste utiliser la première fonction non ? il suffit d'enlever le test sur le mois à la fin et de mettre une occurrence à 0 pour le dernier, -1 pour l'avant dernier, (en pensant à mettre le mois suivant)
 

job75

XLDnaute Barbatruc
Re : Formule recherche jour semaine

Re, hello chère ânesse,

On peut juste utiliser la première fonction non ? il suffit d'enlever le test sur le mois à la fin et de mettre une occurrence à 0 pour le dernier, -1 pour l'avant dernier, (en pensant à mettre le mois suivant)

Bien sûr mais autant écrire les fonctions DernierJour et AvantDernierJour, vraiment très simples.

A+
 

ROGER2327

XLDnaute Barbatruc
Re : Formule recherche jour semaine

Bonjour à tous.


Essai :​
Code:
=SI(MOIS(DATE(A2;B2+(D2<0);C2+(D2>0))-1-MOD(DATE(A2;B2+(D2<0);5+(D2>0));7)+7*(D2+(D2<0)*(C2<=1+MOD(DATE(A2;B2+(D2<0);5+(D2>0));7))-(D2>0)*(C2>MOD(DATE(A2;B2+(D2<0);5+(D2>0));7))))=B2;
         DATE(A2;B2+(D2<0);C2+(D2>0))-1-MOD(DATE(A2;B2+(D2<0);5+(D2>0));7)+7*(D2+(D2<0)*(C2<=1+MOD(DATE(A2;B2+(D2<0);5+(D2>0));7))-(D2>0)*(C2>MOD(DATE(A2;B2+(D2<0);5+(D2>0));7)));"")
Traduction "VBA" :​
Code:
Function QuandJour(a%, m%, j%, o%)
Dim x As Date
  x = DateSerial(a, m - (o < 0), j - (o > 0)) - 1 - (DateSerial(a, m - (o < 0), 5 - (o > 0)) Mod 7) + 7 * (o + (o < 0) * (j <= 1 + (DateSerial(a, m - (o < 0), 5 - (o > 0)) Mod 7)) - (o > 0) * (j > (DateSerial(a, m - (o < 0), 5 - (o > 0)) Mod 7)))
  If Month(x) = m Then QuandJour = x Else QuandJour = ""
End Function
ou plus clairement :​
Code:
Function QuandJour(a%, m%, j%, o%)
Dim z As Date, y%, x As Date
  z = DateSerial(a, m - (o < 0), -(o > 0))
  y = 1 + ((z + 5) Mod 7)
  x = z + j - y + 7 * (o + (o < 0) * (j - y <= 0) - (o > 0) * (j - y >= 0))
  If Month(x) = m Then QuandJour = x Else QuandJour = ""
End Function
Voir l'utilisation en pièce jointe.​


Bonne journée.


ℝOGER2327
#7967


Jeudi 5 Tatane 142 (Saint Arsouille, patricien - fête Suprême Quarte)
30 Messidor An CCXXIII, 5,7112h - chalémie
2015-W29-6T13:42:25Z
 

Pièces jointes

  • QuelJourDansLeMois.xlsm
    15.9 KB · Affichages: 35
  • QuelJourDansLeMois.xlsm
    15.9 KB · Affichages: 47
  • QuelJourDansLeMois.xlsm
    15.9 KB · Affichages: 45

ya_v_ka

XLDnaute Impliqué
Re : Formule recherche jour semaine

Salut la gang,

Ca me fait plaisir de voir participer toutes ces pointures, même revenantes ;-)

Roger2327, si j'ai bien compris, lorsque l'occurrence est en négatif on recherche depuis la fin du mois... ou me trompé-je ?

Merci à toutes et tous pour vos réponses et possibilités.

Ya'v
 

ROGER2327

XLDnaute Barbatruc
Re : Formule recherche jour semaine

Re...


(...)
Roger2327, si j'ai bien compris, lorsque l'occurrence est en négatif on recherche depuis la fin du mois... ou me trompé-je ?
(...)
Vous ne vous trompez, mon cher. C'est ce que j'ai imaginé pour répondre à votre souhait (message #1) :


(...)
Y'aurait même moyen de compliquer en rajoutant le sens... afin de trouver le dernier lundi du mois ou l'avant-dernier jeudi...
(...)
C'eut été plus clair si j'avais joint le classeur de démonstration au lieu de mon brouillon.
Je joins donc ce classeur.​


Bon dimanche.


ℝOGER2327
#7968


Vendredi 6 Tatane 142 (Saints Robot et Cornard, citoyens - fête Suprême Quarte)
1[SUP]er[/SUP] Thermidor An CCXXIII, 3,8895h - épeautre
2015-W29-7T09:20:05Z
 

Pièces jointes

  • QuelJourDansLeMois.xlsm
    18.7 KB · Affichages: 37
  • QuelJourDansLeMois.xlsm
    18.7 KB · Affichages: 58
  • QuelJourDansLeMois.xlsm
    18.7 KB · Affichages: 59

Discussions similaires

Statistiques des forums

Discussions
312 228
Messages
2 086 421
Membres
103 205
dernier inscrit
zch