Recherche des jours fériés

Bonjour,

Voici un nouveau "Casse-tête". Je m'explique :

Contexte : J'ai un tableau dont chaque colonne est une date et qui est augmenté chaque jour d'une colonne avec la date du jour, sous certaines conditions. Une cellule de chaque colonne précise si ce jour est férié ou ouvrable. La liste des jours fériés est rassemblée dans une petite "base de données", plage d'une dizaine de cellules sur une ligne. Cette base est positionnée à droite de mon tableau et se décale donc d'une colonne chaque jour, et ressemble à cela (Jours fériés de la Bourse pour 20024) :

BDD : Samedi - Dimanche - 01/01/24 - 29/03/24 - 01/04/24 - 01/05/24 - 15/08/24 - 25/12/24 - 26/12/24

Contrainte : Avant de créer, via une macro, la colonne du prochain jour, je dois savoir à l'avance si ce prochain jour sera férié ou ouvrable, car cela conditionne la façon de créer la nouvelle colonne (impact sur les formules), et de l'afficher.

Recherches : Bien que j'ai pu résoudre le problème en Excel, j'ai tenté en VBA, par différents procédés de détecter la nature du jour suivant en allant chercher dans la base BDD la date du lendemain (J+1) qui me renverrait "Férié" si cette date est trouvée et "Ouvrable" si cette date n'est pas trouvée dans la base. J'ai notamment essayé avec "CountIf", sans succès car je me heurte à chaque fois à un défaut de syntaxe et la macro se met en défaut, en renvoyant notamment une incompatibilité de type ou une erreur de syntaxe. Je précise que la fonction RECHERCHEH (et son équivalent VBA HLookup) n'est pas appropriée car je n'ai pas de valeur à renvoyer mais seulement VRAI (Férié) si la date est trouvée dans la base ou FAUX (Ouvrable) dans le cas contraire.

Piece jointe : L'application dans laquelle j'ai besoin de cela est un fichier comprenant 10 onglets, dont l'un d'eux compte 5000 lignes et 150 colonnes, donc impossible à joindre à ce post. J'ai donc construit un petit exemple commenté qui, je pense, illustre assez bien le problème. Avec une de mes tentatives échouées. Je joins donc ce fichier représentatif, avec le bout de macro qui ne marche pas.

Question : Quelqu'un peut-il m'aider à résoudre ce problème ? D'avance, je vous remercie du temps que vous y passerez. Moi, je n'y parviens pas après de nombreuses et longues soirées, car je suis trop novice en VBA.

PS : En matière de VBA, il y a les marins d'eau douce (dont je suis) et les Kersauson (océan de compétences). Je m'adresse donc ici à tous les Kersauson du Forum.

Bonjour Catroun ,

Le plus simple est de nommer votre plage des jours fériés G3:K3 (FerieBourse par exemple) et alors:

   If Application.CountIf(Range("FerieBourse"), Range("C3") + 1) > 0 Then MsgBox "Férié"

nota : une fois la plage nommée, inutile d'allez rechercher où est cette plage et ce quelque soit le nombre de colonnes insérées.

Bonjour,

Ci-après la macro demandée. Je vous conseille d'utiliser MATCH/EQUIV plutot que NB.SI, c'est plus "simple". Match renvoie l'index de la valeur cherchée dans une liste.

Sub LendemainFérié()
  Dim jourTrouve As Integer
  jourTrouve = -1

  With Feuil1
    On Error Resume Next
    jourTrouve = WorksheetFunction.Match(.Range("C3").Value2 + 1, .Range("G3:K3").Value2, 0)
    On Error GoTo 0
  End With
  ' on vérifie que MATCH (equiv) a bien trouvé une valeur dans la liste
  ' si oui la valeur de jourTrouve est nécessairement >= 0)
  MsgBox IIf(jourTrouve > -1, "Férié", "Non férié")
End Sub

Si vous voulez un code plus complet, n'hésitez pas.

EDIT : j'arrive après la bataille

Bonjour saboh12617 ,

En général avec Match, j'utilise la syntaxe suivante :

Sub LendemainFériéBIS()
Dim jourTrouve As Long
  With Feuil1
    jourTrouve = Application.IfError(Application.Match(.Range("C3").Value2 + 1, .Range("G3:K3").Value2, 0), 0)
  End With
  MsgBox IIf(jourTrouve = 0, "Non Férié", "férié")
End Sub

qui présente selon moi l'avantage que :

  • on error resume next / on error goto 0 est inutile. Application.Match ne provoque pas une interception d'erreur, ce qui permet de traiter ensuite son résultat par Application.IfError

Qu'en penses tu ?

Salut mafraise,

Effectivement c'est plus propre. En plus j'avais mal interprété match qui renvoie les indexes à partir de 1 et non 0, donc mon test était trop large.

Ta solution est mieux. Je pense que l'op s'y retrouvera, sinon j'éditerai mon message.

Bonjour

Bonjour à tous

Une variante...

Bye !

Bonjour,
Et une petite dernière ?
Cdlt.

Sub LendemainFériéBIS()
Dim n
    With Feuil1
        n = Application.Match(.Range("C3").Value2 + 1, .Range("G3:K3").Value2, 0)
    End With
    MsgBox IIf(IsError(n), "Non Férié", "Férié")
End Sub

Bonjour à Tous (et Toutes).

Merci MaFraise : J'aime bien la simplicité de ta solution (en une seule ligne : C'est la classe !)

Nommer la plage pour éviter d'aller la chercher à chaque calcul est une excellente idée que je n'avais jamais exploitée. Et qui m'aurait bien servi en d'autres circonstances.

Avant de tester ton code, est-ce que je peux remplacer "C3" par sa valeur (valeur contenue dans C3) ? Car cette valeur est calculée par ailleurs dans ma macro générale. J'imagine que cela nécessite une petite adaptation du code, non ? Peut-être remplacer Range(C3) par ma variable DAE, qui contient déjà cette valeur ? Peux-tu m'aider dans l'écriture de cette adaptation ?

PS : Dim DAE As Date 'C'est la date de la dernière colonne du tableau, comme expliqué dans le fichier de simulation que j'avais joins à mon message d'origine

Merci de tes conseils. Bonne soirée.

Re,

Si dans la macro, on a une variable nommée DAE qui contient une date, alors on peut écrire :

If Application.CountIf(Range("FerieBourse"), DAE + 1) > 0 Then MsgBox "Férié"

ou si DAE est déjà la date incrémentée :

If Application.CountIf(Range("FerieBourse"), DAE) > 0 Then MsgBox "Férié"

nota : je ne suis pas certain d'avoir bien compris la demande complémentaires

Merci MaFraise !

Si si ! Tu as bien compris, je crois que ça va le faire !

Je teste ça ce soir et te tiens au courant du résultat.

Bonne soirée.

bonjour le fil,

avec une fonction personnalisée qu'on peut appeler sur la feuille et en VBA (voir ligne 30 et macro "test")

Function Lendemain(MaDate)
     If WorksheetFunction.WorkDay_Intl(MaDate, 1, "0000000", Range("feries")) = MaDate + 1 Then
          Lendemain = "ouvrable"
     Else
          Lendemain = "féries"
     End If
End Function

Mille mercis MaFraise,

DAE est la date non incrémentée, j'ai donc choisi ta première proposition.

C'est parfait, j'ai implémenté cela dans mon code, avec toutes les conséquences souhaitées, et qui donne entière satisfaction, par rapport à l'évolution que je voulais lui donner.

Je peux clore le topic. Encore merci et bonne soirée.

Rechercher des sujets similaires à "recherche jours feries"