Problème macro colorisation onglet
Prenons le cas où tu sélectionnes le mois d’avril.
Lorsque le balayage arrive à la Feuil4 (après le 31), le programme cherche à affecter la valeur suivante à cc :
cc=CDate("Feuil4 Avril 2013")
Cela génère une erreur. L’instruction est ignorée et cc conserve son ancienne valeur (31/04/2013).
La couleur est alors celle du 31.
Tu peux remédier à cela en réinitialisant cc en début ou fin de traitement (cc="").
A+
Merci frangy, je n'aurai jamais trouvé seul
Merci à tous ceux qui ont pu rendre ce code fonctionnel et qui m'ôte une très grosse épine du pieds.
Voici la macro finalisée et fonctionnelle mise en place (si ça peut aider quelqu'un d'autre), me reste les couleurs à changer mais là c'est dans mes cordes (enfin quelque chose à ma portée ^^)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aa As String, bb As String
Dim myRange As Range
Set myRange = [Fériés] 'plage jours fériés
aa = Worksheets("Feuil1").Range("C21") 'mois
bb = Worksheets("Feuil1").Range("D27") 'année
On Error Resume Next
For Each i In Sheets
cc = ""
cc = CDate(i.Name & " " & aa & " " & bb) 'construit la date à partir du nom de la feuille, mois et année
If IsDate(cc) Then 'si c'est une date alors
If Weekday(cc) = 1 Then 'vérifie si c'est dimanche
i.Tab.Color = vbRed 'onglet rouge
ElseIf Weekday(cc) = 7 Then 'samedi
i.Tab.Color = vbBlue 'onglet bleu
Else 'sinon onglet blanc
i.Tab.Color = vbWhite
End If
Else ' si n'est pas une date
i.Tab.Color = vbYellow 'onglet jaune
End If
For Each j In myRange 'pour chaque jour férié
If cc = j Then 'si l'onglet correspond à un jour férié
i.Tab.Color = vbGreen 'onglet vert
End If
Next j
Next i
End SubLe petit fichier
une autre petite question, dans la partie
Else ' si n'est pas une date
i.Tab.Color = vbYellow 'onglet jaune
End IfSi je remplace par :
Else ' si n'est pas une date
End IfC'est correct ou il faut obligatoirement une instruction derrière ?
Parce qu'il faut que je colorie certain onglets d'une couleur, ça semble fonctionner en supprimant l'instruction de coloriage jaune mais je ne suis pas sûr de moi.
Tu peux même supprimer la clause else.
Sinon, tu peux aussi l'utiliser pour gérer les autres couleurs
Else ' si n'est pas une date
If i.Name = "Feuil34" Then
i.Tab.Color = vbMagenta 'onglet Magenta
ElseIf i.Name = "Feuil999" Then
i.Tab.Color = vbCyan 'onglet Cyan
Else
i.Tab.Color = vbYellow 'onglet jaune
End If
End IfA+
C'est tout bon, juste parfait !
Encore merci
en fait, suite à ton idée, j'avais penser mettre ceci
Else ' si n'est pas une date
If IsNumeric(i.Name) Then
i.Tab.Color = vbBlack 'onglet noir
End If
End IfPar exemple pour février 2013, les onglets 29, 30 et 31 ne servent pas donc je voulais les passer en noir.
Dans l'idée j'effectue un test numérique, je colorie en noir et tout les onglets contenant du texte, je faisait ce que je voulais.
mais mon test ne fonctionne pas à priori, ça aurait été étonnant aussi, que j'y arrive tout seul...
Tu peux toujours adapter les conditions
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aa As String, bb As String
Dim myRange As Range
Set myRange = [Fériés] 'plage jours fériés
aa = Worksheets("Feuil1").Range("C21") 'mois
bb = Worksheets("Feuil1").Range("D27") 'année
On Error Resume Next
For Each i In Sheets
If IsNumeric(i.Name) Then
If CInt(i.Name) < 29 Then
cc = ""
cc = CDate(i.Name & " " & aa & " " & bb) 'construit la date à partir du nom de la feuille, mois et année
If IsDate(cc) Then 'si c'est une date alors
If Weekday(cc) = 1 Then 'vérifie si c'est dimanche
i.Tab.Color = vbRed 'onglet rouge
ElseIf Weekday(cc) = 7 Then 'samedi
i.Tab.Color = vbBlue 'onglet bleu
Else 'sinon onglet blanc
i.Tab.Color = vbWhite
End If
Else ' si n'est pas une date
i.Tab.Color = vbYellow 'onglet jaune
End If
For Each j In myRange 'pour chaque jour férié
If cc = j Then 'si l'onglet correspond à un jour férié
i.Tab.Color = vbGreen 'onglet vert
End If
Next j
Else
i.Tab.Color = vbBlack 'onglet noir
End If
End If
Next i
End SubA+
Je n'ai pas encore testé mais si je regarde ce bout de code
If CInt(i.Name) < 29 ThenCa va s'appliquer à tous les mois, hors janvier à 31 jours, Février une coup 28, un coup 29, etc...
Dans mon post précédent, je pensais que si le nom de la feuille n'était pas une date mais était un format numérique alors il se mettait en noir. Les 29, 30 et 31 février 2013 n'étant pas des dates valides, je m'étais dit qu'ils seraient considérés comme des nombres.
Effectivement, je n'avais pas bien saisi la finalité
Private Sub Worksheet_Change(ByVal Target As Range)
Dim aa As String, bb As String
Dim myRange As Range
Set myRange = [Fériés] 'plage jours fériés
aa = Worksheets("Feuil1").Range("C21") 'mois
bb = Worksheets("Feuil1").Range("D27") 'année
On Error Resume Next
For Each i In Sheets
cc = ""
cc = CDate(i.Name & " " & aa & " " & bb) 'construit la date à partir du nom de la feuille, mois et année
If IsDate(cc) Then 'si c'est une date alors
If Weekday(cc) = 1 Then 'vérifie si c'est dimanche
i.Tab.Color = vbRed 'onglet rouge
ElseIf Weekday(cc) = 7 Then 'samedi
i.Tab.Color = vbBlue 'onglet bleu
Else 'sinon onglet blanc
i.Tab.Color = vbWhite
End If
Else ' si n'est pas une date
If IsNumeric(i.Name) Then
i.Tab.Color = vbBlack 'onglet noir
Else
i.Tab.Color = vbYellow 'onglet jaune
End If
End If
For Each j In myRange 'pour chaque jour férié
If cc = j Then 'si l'onglet correspond à un jour férié
i.Tab.Color = vbGreen 'onglet vert
End If
Next j
Next i
End SubA+
Bah là, tout est niquel
j'avais pourtant mis
Else ' si n'est pas une date
If IsNumeric(i.Name) Then
i.Tab.Color = vbBlack 'onglet noir
End If
End Ifet ça ne fonctionnait pas
Enfin ça me rassure, je n'était pas si loin de la solution.
Merci pour ton implication