XL 2021 afficher nom dans un planning

  • Initiateur de la discussion Initiateur de la discussion malbae
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

malbae

XLDnaute Nouveau
Bonsoir,
Je souhaite afficher dans le calendrier le nom sur l'ensemble de la période concernée (arrivée/départ ds feuille réservation)
Pour l'instant le nom n’apparait que sur la date arrivée...
Pour info la couleur verte est une MFC

Merci pour vos lumières et bonne soirée
Paul
 

Pièces jointes

Bonsoir malbae,

Une solution VBA avec cette macro dans le code de la feuille "Calendrier" :
VB:
Private Sub Worksheet_Activate()
Dim r As Range
Application.ScreenUpdating = False
Set r = Range("C5:C35,E5:E35,G5:G35,I5:I35,K5:K35,M5:M35,O5:O35,Q5:Q35,S5:S35,U5:U35,W5:W35,Y5:Y35")
r = "=IFERROR(VLOOKUP(DATE($D$2,B$3,$A5),resa2,5,0),"""")"
For Each r In r
    If r.DisplayFormat.Interior.Color <> vbWhite And r = "" Then r = r(0)
Next r
End Sub
Elle se déclenche quand on active la feuille.

Bonne nuit.
 

Pièces jointes

Bonsoir malbae,

Une solution VBA avec cette macro dans le code de la feuille "Calendrier" :
VB:
Private Sub Worksheet_Activate()
Dim r As Range
Application.ScreenUpdating = False
Set r = Range("C5:C35,E5:E35,G5:G35,I5:I35,K5:K35,M5:M35,O5:O35,Q5:Q35,S5:S35,U5:U35,W5:W35,Y5:Y35")
r = "=IFERROR(VLOOKUP(DATE($D$2,B$3,$A5),resa2,5,0),"""")"
For Each r In r
    If r.DisplayFormat.Interior.Color <> vbWhite And r = "" Then r = r(0)
Next r
End Sub
Elle se déclenche quand on active la feuille.

Bonne nuit.
Bonsoir
Merci cela fonctionne parfaitement
Bonne nuit également
 
Encore une chose : il faut effacer la formule pour les 30 et 31 février, 31 avril, 31 juin etc... :
VB:
Private Sub Worksheet_Activate()
Dim r As Range
Application.ScreenUpdating = False
Set r = Range("C5:C35,E5:E35,G5:G35,I5:I35,K5:K35,M5:M35,O5:O35,Q5:Q35,S5:S35,U5:U35,W5:W35,Y5:Y35")
r = "=IFERROR(VLOOKUP(DATE($D$2,B$3,$A5),resa2,5,0),"""")"
For Each r In r
    If r.DisplayFormat.Interior.Color <> vbWhite And r = "" Then r = r(0)
    If r(1, 0) = "" Then r = "" 'pour les 30 et 31 février etc...
Next r
End Sub
 

Pièces jointes

Encore une chose : il faut effacer la formule pour les 30 et 31 février, 31 avril, 31 juin etc... :
VB:
Private Sub Worksheet_Activate()
Dim r As Range
Application.ScreenUpdating = False
Set r = Range("C5:C35,E5:E35,G5:G35,I5:I35,K5:K35,M5:M35,O5:O35,Q5:Q35,S5:S35,U5:U35,W5:W35,Y5:Y35")
r = "=IFERROR(VLOOKUP(DATE($D$2,B$3,$A5),resa2,5,0),"""")"
For Each r In r
    If r.DisplayFormat.Interior.Color <> vbWhite And r = "" Then r = r(0)
    If r(1, 0) = "" Then r = "" 'pour les 30 et 31 février etc...
Next r
End Sub
Ok
En revanche si je sélectionne une autre année (ex 2023) cela ne fonctionne pas.
Merci
 
En revanche si je sélectionne une autre année (ex 2023) cela ne fonctionne pas.
Oui il faut ajouter une macro Worksheet_Change ;
VB:
Private Sub Worksheet_Activate()
Dim r As Range
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
Set r = Range("C5:C35,E5:E35,G5:G35,I5:I35,K5:K35,M5:M35,O5:O35,Q5:Q35,S5:S35,U5:U35,W5:W35,Y5:Y35")
r = "=IFERROR(VLOOKUP(DATE($D$2,B$3,$A5),resa2,5,0),"""")"
For Each r In r
    If r.DisplayFormat.Interior.Color <> vbWhite And r = "" Then r = r(0)
    If r(1, 0) = "" Then r = "" 'pour les 30 et 31 février etc...
Next r
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Worksheet_Activate 'lance la macro
End Sub
Maintenant au lit.
 

Pièces jointes

Oui il faut ajouter une macro Worksheet_Change ;
VB:
Private Sub Worksheet_Activate()
Dim r As Range
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
Set r = Range("C5:C35,E5:E35,G5:G35,I5:I35,K5:K35,M5:M35,O5:O35,Q5:Q35,S5:S35,U5:U35,W5:W35,Y5:Y35")
r = "=IFERROR(VLOOKUP(DATE($D$2,B$3,$A5),resa2,5,0),"""")"
For Each r In r
    If r.DisplayFormat.Interior.Color <> vbWhite And r = "" Then r = r(0)
    If r(1, 0) = "" Then r = "" 'pour les 30 et 31 février etc...
Next r
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Worksheet_Activate 'lance la macro
End Sub
Maintenant au lit.
Parfait 😉
 
Bonjour malbae, le forum,

Non la méthode précédente n'est pas parfaite car les périodes à cheval sur 2 mois et surtout sur 2 années ne sont pas traitées correctement.

Utilisez le fichier joint avec cette solution :
VB:
Private Sub Worksheet_Activate()
Dim An%, tablo, i&, dat1 As Variant, dat2 As Variant, nom$, dat&
An = Val([D2])
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
Range("C5:C35,E5:E35,G5:G35,I5:I35,K5:K35,M5:M35,O5:O35,Q5:Q35,S5:S35,U5:U35,W5:W35,Y5:Y35") = "" 'RAZ
If An > 0 Then
    tablo = [resa].Resize(, 9) 'tableau structuré
    For i = 1 To UBound(tablo)
        dat1 = tablo(i, 5): dat2 = tablo(i, 6): nom = tablo(i, 9)
        If IsDate(dat1) And IsDate(dat2) Then
            If Year(dat1) = An Or Year(dat2) = An Then
                dat1 = Application.Max(CLng(CDate(dat1)), DateSerial(An, 1, 1))
                dat2 = Application.Min(CLng(CDate(dat2)), DateSerial(An, 12, 31))
                For dat = dat1 To dat2
                    Cells(4 + Day(dat), 1 + 2 * Month(dat)) = nom
                Next dat
            End If
        End If
    Next i
End If
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Worksheet_Activate 'lance la macro
End Sub
A+
 

Pièces jointes

Bonjour malbae, le forum, Non la méthode précédente n'est pas parfaite car les périodes à cheval sur 2 mois et surtout sur 2 années ne sont pas traitées correctement. Utilisez le fichier joint avec cette solution :
VB:
Private Sub Worksheet_Activate() Dim An%, tablo, i&, dat1 As Variant, dat2 As Variant, nom$, dat& An = Val([D2]) Application.ScreenUpdating = False Application.EnableEvents = False 'désactive les évènements Range("C5:C35,E5:E35,G5:G35,I5:I35,K5:K35,M5:M35,O5:O35,Q5:Q35,S5:S35,U5:U35,W5:W35,Y5:Y35") = "" 'RAZ If An > 0 Then tablo = [resa].Resize(, 9) 'tableau structuré For i = 1 To UBound(tablo) dat1 = tablo(i, 5): dat2 = tablo(i, 6): nom = tablo(i, 9) If IsDate(dat1) And IsDate(dat2) Then If Year(dat1) = An Or Year(dat2) = An Then dat1 = Application.Max(CLng(CDate(dat1)), DateSerial(An, 1, 1)) dat2 = Application.Min(CLng(CDate(dat2)), DateSerial(An, 12, 31)) For dat = dat1 To dat2 Cells(4 + Day(dat), 1 + 2 * Month(dat)) = nom Next dat End If End If Next i End If Application.EnableEvents = True 'réactive les évènements End Sub Private Sub Worksheet_Change(ByVal Target As Range) Worksheet_Activate 'lance la macro End Sub
A+
Bonjour malbae, le forum,

Non la méthode précédente n'est pas parfaite car les périodes à cheval sur 2 mois et surtout sur 2 années ne sont pas traitées correctement.

Utilisez le fichier joint avec cette solution :
VB:
Private Sub Worksheet_Activate()
Dim An%, tablo, i&, dat1 As Variant, dat2 As Variant, nom$, dat&
An = Val([D2])
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
Range("C5:C35,E5:E35,G5:G35,I5:I35,K5:K35,M5:M35,O5:O35,Q5:Q35,S5:S35,U5:U35,W5:W35,Y5:Y35") = "" 'RAZ
If An > 0 Then
    tablo = [resa].Resize(, 9) 'tableau structuré
    For i = 1 To UBound(tablo)
        dat1 = tablo(i, 5): dat2 = tablo(i, 6): nom = tablo(i, 9)
        If IsDate(dat1) And IsDate(dat2) Then
            If Year(dat1) = An Or Year(dat2) = An Then
                dat1 = Application.Max(CLng(CDate(dat1)), DateSerial(An, 1, 1))
                dat2 = Application.Min(CLng(CDate(dat2)), DateSerial(An, 12, 31))
                For dat = dat1 To dat2
                    Cells(4 + Day(dat), 1 + 2 * Month(dat)) = nom
                Next dat
            End If
        End If
    Next i
End If
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Worksheet_Activate 'lance la macro
End Sub
A+
Bonjour
Ca marche nickel !
Merci encore
 
Bonjour malbae, le forum,

Toujours dans le code de la feuille :
VB:
Private Sub Worksheet_Activate()
Dim An%, tablo, i&, dat1 As Variant, dat2 As Variant, nom$, dat&
An = Val([C2])
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
Range("B6:AF6,B8:AF8,B10:AF10,B12:AF12,B14:AF14,B16:AF16,B18:AF18,B20:AF20,B22:AF22,B24:AF24,B26:AF26,B28:AF28") = "" 'RAZ
If An > 0 Then
    tablo = [resa].Resize(, 9) 'tableau structuré
    For i = 1 To UBound(tablo)
        dat1 = tablo(i, 5): dat2 = tablo(i, 6): nom = tablo(i, 9)
        If IsDate(dat1) And IsDate(dat2) Then
            If Year(dat1) = An Or Year(dat2) = An Then
                dat1 = Application.Max(CLng(CDate(dat1)), DateSerial(An, 1, 1))
                dat2 = Application.Min(CLng(CDate(dat2)), DateSerial(An, 12, 31))
                For dat = dat1 To dat2
                    Cells(4 + 2 * Month(dat), 1 + Day(dat)) = nom
                Next dat
            End If
        End If
    Next i
End If
Columns("B:AF").AutoFit 'ajustement largeurs
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Worksheet_Activate 'lance la macro
End Sub
J'ai simplifié les MFC =B6<>"" et =C5<>"" sur l'autre calendrier.

A+
 

Pièces jointes

Bonjour malbae, le forum,

Toujours dans le code de la feuille :
VB:
Private Sub Worksheet_Activate()
Dim An%, tablo, i&, dat1 As Variant, dat2 As Variant, nom$, dat&
An = Val([C2])
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
Range("B6:AF6,B8:AF8,B10:AF10,B12:AF12,B14:AF14,B16:AF16,B18:AF18,B20:AF20,B22:AF22,B24:AF24,B26:AF26,B28:AF28") = "" 'RAZ
If An > 0 Then
    tablo = [resa].Resize(, 9) 'tableau structuré
    For i = 1 To UBound(tablo)
        dat1 = tablo(i, 5): dat2 = tablo(i, 6): nom = tablo(i, 9)
        If IsDate(dat1) And IsDate(dat2) Then
            If Year(dat1) = An Or Year(dat2) = An Then
                dat1 = Application.Max(CLng(CDate(dat1)), DateSerial(An, 1, 1))
                dat2 = Application.Min(CLng(CDate(dat2)), DateSerial(An, 12, 31))
                For dat = dat1 To dat2
                    Cells(4 + 2 * Month(dat), 1 + Day(dat)) = nom
                Next dat
            End If
        End If
    Next i
End If
Columns("B:AF").AutoFit 'ajustement largeurs
Application.EnableEvents = True 'réactive les évènements
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Worksheet_Activate 'lance la macro
End Sub
J'ai simplifié les MFC =B6<>"" et =C5<>"" sur l'autre calendrier.

A+
Merci beaucoup et bonne brise printanière
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
485
Deleted member 453598
D
  • Question Question
Microsoft 365 MFC dans tableau
Réponses
2
Affichages
224
Réponses
12
Affichages
500
Retour