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 Sub

Le petit fichier

une autre petite question, dans la partie

Else ' si n'est pas une date
   i.Tab.Color = vbYellow 'onglet jaune
End If

Si je remplace par :

Else ' si n'est pas une date
End If

C'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 If

A+

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 If

Par 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 Sub

A+

Je n'ai pas encore testé mais si je regarde ce bout de code

If CInt(i.Name) < 29 Then

Ca 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 Sub

A+

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 If

et ça ne fonctionnait pas

Enfin ça me rassure, je n'était pas si loin de la solution.

Merci pour ton implication

Rechercher des sujets similaires à "probleme macro colorisation onglet"