Microsoft 365 Demande d'aide pour MFC sur cellules contenant des dates

LAETI-TOINOU

XLDnaute Occasionnel
Bonjour les expert, bonjour la communauté,

Je reviens une nouvelle fois vers vous pour que vous m'apportiez votre aide précieuse sur une formule qui me pose problème.

En effet, dans le cadre de mon association, j'ai commencé un calendrier des manifestation pour 2023.

Sur ce tableau, j'aimerais "automatiser" le format de cellules, via des MFC.

- Pour les week-ends, ça semble fonctionner,
- Pour les vacances scolaires, ça semble fonctionner également.
- Pour les jours fériés, ça ne fonctionne pas. Seul le 1er janvier fonctionne.

Pour la forme du calendrier, je suis partie du document de base que j'utilise tous les ans.
Pour l'onglet "JF et V Scol", je suis repartie d'un onglet que j'avais récupéré d'un précédent fichier.

Merci d'avance pour votre aide.

Bonne journée ensoleillée.


Laëtitia
 

Pièces jointes

  • CF - CALENDRIER DES MANIFESTATIONS 2023 - V3.xlsx
    189.7 KB · Affichages: 14

JHA

XLDnaute Barbatruc
Bonjour à tous,

La formule est assez facile à comprendre.
Tu as une plage nommée "Feries" qui prend en compte la colonne "date" du tableau "_tb_Fériés".
Avec la fonction equiv(), on recherche l'emplacement de cette date dans la plage nommée. Si cette date est connue, la fonction retourne une position dans la liste (1,2,3,4,etc..), dans le cas contraire, la fonction retourne une erreur(#N/A).
La fonction estnum() retourne "vrai" ou "faux" suivant le résultat de la fonction equiv(), si la date est trouvée, ce sera "vrai" si la fonction equiv() retourne une erreur, ce sera "faux".



JHA
 

job75

XLDnaute Barbatruc
Bonjour LAETI-TOINOU, JHA,

Les MFC c'est bien mais quand il y en a trop comme ici ce n'est vraiment pas l'idéal.

Voyez le fichier joint et ces macros dans le code de la 1ère feuille :
VB:
Private Sub Worksheet_Activate()
Worksheet_Change [AE1] 'lance la macro
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [AE1]) Is Nothing Then Exit Sub
Dim ferie As Range, vacance, ub%, r As Range, i%
Set ferie = [_tb_Fériés[Date]]
vacance = [_tb_ZB].Resize(, 3) 'matrice, plus rapide
ub = UBound(vacance)
Set r = [A5:AC35,A50:AC80] 'plages adaptables
Application.ScreenUpdating = False
r.Interior.ColorIndex = xlNone 'RAZ
For Each r In r
    If IsDate(r) Then
        With r(1, 0).Resize(, 4).Interior
            If Weekday(r, 2) > 5 Then .Color = RGB(217, 225, 242) 'bleu clair
            For i = 1 To ub
                If r >= vacance(i, 2) And r <= vacance(i, 3) Then .Color = RGB(153, 255, 153): Exit For 'vert clair
            Next i
            If IsNumeric(Application.Match(CLng(r), ferie, 0)) Then .Color = RGB(248, 203, 173) 'rose
        End With
    End If
Next r
End Sub

Private Sub CommandButton1_Click() 'bouton RAZ
If MsgBox("Etes-vous sûr de vouloir effacer les libellés ?", vbQuestion + vbYesNo, "Effacer") = 7 Then Exit Sub
On Error Resume Next 'si aucune SpecialCell
With [A5:AC35,A50:AC80] 'plages adaptables
    .SpecialCells(xlCellTypeConstants) = ""
    .SpecialCells(xlCellTypeBlanks).Font.Color = RGB(48, 84, 150)
End With
End Sub
La Worksheet_Change se lance quand on modifie l'année en AE1 ou qu'on active la feuille.

Le bouton RAZ efface tous les libellés.

Il n'y a plus de MFC dans la feuille.

A+
 

Pièces jointes

  • CF - CALENDRIER DES MANIFESTATIONS 2023(1).xlsm
    204.5 KB · Affichages: 9

LAETI-TOINOU

XLDnaute Occasionnel
Bonjour à tous,

La formule est assez facile à comprendre.
Tu as une plage nommée "Feries" qui prend en compte la colonne "date" du tableau "_tb_Fériés".
Avec la fonction equiv(), on recherche l'emplacement de cette date dans la plage nommée. Si cette date est connue, la fonction retourne une position dans la liste (1,2,3,4,etc..), dans le cas contraire, la fonction retourne une erreur(#N/A).
La fonction estnum() retourne "vrai" ou "faux" suivant le résultat de la fonction equiv(), si la date est trouvée, ce sera "vrai" si la fonction equiv() retourne une erreur, ce sera "faux".



JHA
Merci JHA,

Je comprends mieux, grâce à ces explications.
 

LAETI-TOINOU

XLDnaute Occasionnel
Bonjour LAETI-TOINOU, JHA,

Les MFC c'est bien mais quand il y en a trop comme ici ce n'est vraiment pas l'idéal.

Voyez le fichier joint et ces macros dans le code de la 1ère feuille :
VB:
Private Sub Worksheet_Activate()
Worksheet_Change [AE1] 'lance la macro
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [AE1]) Is Nothing Then Exit Sub
Dim ferie As Range, vacance, ub%, r As Range, i%
Set ferie = [_tb_Fériés[Date]]
vacance = [_tb_ZB].Resize(, 3) 'matrice, plus rapide
ub = UBound(vacance)
Set r = [A5:AC35,A50:AC80] 'plages adaptables
Application.ScreenUpdating = False
r.Interior.ColorIndex = xlNone 'RAZ
For Each r In r
    If IsDate(r) Then
        With r(1, 0).Resize(, 4).Interior
            If Weekday(r, 2) > 5 Then .Color = RGB(217, 225, 242) 'bleu clair
            For i = 1 To ub
                If r >= vacance(i, 2) And r <= vacance(i, 3) Then .Color = RGB(153, 255, 153): Exit For 'vert clair
            Next i
            If IsNumeric(Application.Match(CLng(r), ferie, 0)) Then .Color = RGB(248, 203, 173) 'rose
        End With
    End If
Next r
End Sub

Private Sub CommandButton1_Click() 'bouton RAZ
If MsgBox("Etes-vous sûr de vouloir effacer les libellés ?", vbQuestion + vbYesNo, "Effacer") = 7 Then Exit Sub
On Error Resume Next 'si aucune SpecialCell
With [A5:AC35,A50:AC80] 'plages adaptables
    .SpecialCells(xlCellTypeConstants) = ""
    .SpecialCells(xlCellTypeBlanks).Font.Color = RGB(48, 84, 150)
End With
End Sub
La Worksheet_Change se lance quand on modifie l'année en AE1 ou qu'on active la feuille.

Le bouton RAZ efface tous les libellés.

Il n'y a plus de MFC dans la feuille.

A+
Merci beaucoup pour cette proposition, que je trouve vraiment bien, mais bien au dessus de mes connaissances.

Le problème est que je ne connais pas le VBA, à part deux trois petites choses que m'a enseigné @AtTheOne.

Tant qu'il n'y a aucune modification tout va bien, si le document est amené à évoluer, je ne sais pas faire.

Afin de le mettre en pratique, puisqu'il a le mérite d'exister, j'aimerais savoir comment modifier les colonnes indiquant les vacances scolaires. J'aimerais, en effet, que les vacances scolaires ne soient pas aussi "voyantes", mais apparaissent sur le côté sur les colonnes D / I / N / S / X et AC.

Merci, merci.

Bonne fin de journée.

Laëtitia
 
Dernière édition:

job75

XLDnaute Barbatruc
J'aimerais, en effet, que les vacances scolaires ne soient pas aussi "voyantes", mais apparaissent sur le côté sur les colonnes D / I / N / S / X et AC.
Pas de problème, voyez ce fichier (2) modifié à ce niveau :
VB:
    If IsDate(r) Then
        With r(1, 0).Resize(, 4).Interior
            If Weekday(r, 2) > 5 Then .Color = RGB(217, 225, 242) 'bleu clair
            If IsNumeric(Application.Match(CLng(r), ferie, 0)) Then .Color = RGB(248, 203, 173) 'rose
        End With
        For i = 1 To ub
            If r >= vacance(i, 2) And r <= vacance(i, 3) Then r(1, 3).Interior.Color = vbGreen: Exit For 'vert
        Next i
    End If
Essayez de bien comprendre ce code, c'est à votre portée.
 

Pièces jointes

  • CF - CALENDRIER DES MANIFESTATIONS 2023(2).xlsm
    202.8 KB · Affichages: 4

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonsoir à toutes & à tous, bonjsoirr @LAETI-TOINOU &@Job75

Content de te voir sur le site Laëtitia.

Je suis convaincu que la solution de @job75 avec macro est la meilleure (ton calendrier ne change qu'une fois par an, le changement provoque la mise à jour, pas la peine d'avoir des MFC).

Mais pour le fun, j'aime bien me gratter la cervelle, voici une solution sans macro, avec :
  • une formule unique pour toutes les dates
  • 4 MFC pour toute la feuille, qui gèrent les jours ordinaires (bordures), les jours fériés (texte en rouge), les week-ends (fond gris-bleu) et les vacances (barre verticale bleue).
Je suis dispo pour fournir des explications ...
Amicalement
Alain
 

Pièces jointes

  • MFC sur cellules contenant des dates.xlsx
    181.3 KB · Affichages: 9
Dernière édition:

LAETI-TOINOU

XLDnaute Occasionnel
Pas de problème, voyez ce fichier (2) modifié à ce niveau :
VB:
    If IsDate(r) Then
        With r(1, 0).Resize(, 4).Interior
            If Weekday(r, 2) > 5 Then .Color = RGB(217, 225, 242) 'bleu clair
            If IsNumeric(Application.Match(CLng(r), ferie, 0)) Then .Color = RGB(248, 203, 173) 'rose
        End With
        For i = 1 To ub
            If r >= vacance(i, 2) And r <= vacance(i, 3) Then r(1, 3).Interior.Color = vbGreen: Exit For 'vert
        Next i
    End If
Essayez de bien comprendre ce code, c'est à votre portée.
Bonjour Job75, bonjour tout le monde,

Merci pour cette nouvelle présentation que je préfère à la précédente.

Malheureusement, je m'y perds en lisant toutes ces lignes.
J'ai voulu remplacer le Vert des vacances scolaires par un bleu RGB 62, 142, 238, mais je n'y arrive pas.
D'où mon problème, entre autres, de travailler avec des fichiers conçus avec du VBA.

Laëtitia
 

LAETI-TOINOU

XLDnaute Occasionnel
Bonsoir à toutes & à tous, bonjsoirr @LAETI-TOINOU &@Job75

Content de te voir sur le site Laëtitia.

Je suis convaincu que la solution de @job75 avec macro est la meilleure (ton calendrier ne change qu'une fois par an, le changement provoque la mise à jour, pas la peine d'avoir des MFC).

Mais pour le fun, j'aime bien me gratter la cervelle, voici une solution sans macro, avec :
  • une formule unique pour toutes les dates
  • 4 MFC pour toute la feuille, qui gèrent les jours ordinaires (bordures), les jours fériés (texte en rouge), les week-ends (fond gris-bleu) et les vacances (barre verticale bleue).
Je suis dispo pour fournir des explications ...
Amicalement
Alain
Bonjour Alain,

Merci pour ton tableau qui a nettement moins de MFC que le mien.

Ce tableau est plus facile à comprendre.

Après, effectivement, une fois que la mise en forme générale du fichier est figée, il n'y a pas de raison que le tableau de Job75 ne me convienne pas.

Peux-tu, malgré tout, m'expliquer un peu le détail des formules de MFC, que je les comprenne pour les reproduire ?

Est-il également possible de faire apparaître les ponts ?

Merci.

Laëtitia
 

job75

XLDnaute Barbatruc
Bonjour LAETI-TOINOU, AtTheOne,
J'ai voulu remplacer le Vert des vacances scolaires par un bleu RGB 62, 142, 238, mais je n'y arrive pas.
Allons allons, il suffit de remplacer vbGreen par RGB(62, 142, 238) !!!

Pour les vacances vert prairie convient bien mais bleu de la mer va bien aussi :rolleyes:

A+
 

Pièces jointes

  • CF - CALENDRIER DES MANIFESTATIONS 2023(3).xlsm
    203.6 KB · Affichages: 10

AtTheOne

XLDnaute Impliqué
Supporter XLD
Bonne nuit tout le monde,
Laëtitia, j'ai fait un petit Gif animé pour te montrer comment accéder au code de Job75 qui se situe dans le code de la feuille 1 (cf le post #5 de job75)
Tu fais ALT+F11 et ...
1647988199627.gif


Bon courage
Alain
 
Dernière édition: