Problème macro colorisation onglet

Bonjour,

J'ai cette macro qui est fonctionnelle

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sh As Worksheet
Dim LaDate As Long
Application.ScreenUpdating = False
If Target.Count > 1 Then Exit Sub
If Not Intersect(Target, Union(Range("C21"), Range("D27"))) Is Nothing Then
    For Each Sh In Sheets
        Sh.Tab.ColorIndex = -4142
        If IsNumeric(Sh.Name) Then
            If IsDate(Sh.Name & "/" & Me.[Mois] & "/" & Me.[Année]) Then
                LaDate = CLng(CDate(Sh.Name & "/" & Me.[Mois] & "/" & Me.[Année]))
                If Not IsError(Application.Match(LaDate, Me.[Fériés], 0)) Then
                    Sh.Tab.ColorIndex = 36
                ElseIf Application.Weekday(LaDate) = 7 Then
                    Sh.Tab.ColorIndex = 46
                ElseIf Application.Weekday(LaDate) = 1 Then
                    Sh.Tab.ColorIndex = 25
                End If
            End If
        End If
    Next Sh
End If
End Sub

J'ai 52 onglets et certain de ces onglets doivent avoir des couleurs.

Je cherchais à remplacer

For Each Sh In Sheets

par

For Sh = 1 to 31

mais ça ne fonctionne pas comment je peux modifier le code de manière à ce que seul les onglets nommer de 1 à 31 soient concernés ?

PS je mettrais un fichier exemple si besoin en soirée parce que là je suis sur un petit notebook qui n'a pas excel.

Salut Fred,

juste le code de principe... je te laisse l'adapter à tes besoins

For a = 1 To 31
Sheets(a).Tab.Color = vbRed
Next a

Bonjour,

Tu pourrais te contenter d'un test

    For Each Sh In Sheets
        If IsNumeric(Sh.Name) Then
            If Sh.Name <= 31 Then
                'traitement ......
            End If
        End If
    Next Sh

A+

Il fallait juste créer une nouvelle variable ???

J'ai hâte de tester ça ce soir, je tournais en rond depuis un bon moment avant de me décider à demander de l'aide...

Bon finalement, je reviens vers vous parce que je n'arrive à rien, c'est pourtant pas manque d'avoir essayer, mais la je capitule.

En plus j'ai 2 problèmes maintenant...

je n'arrive toujours pas à coloriser les onglets de 1 à 31 uniquement et en plus cette macro a été écrite pour fonctionner lorsque le classeur est en calendrier 1900, mais voilà, dans le fichier ou j'essai de la placer, le classeur est en 1904, et je n'ai pas le choix à cause des heures négatives que je dois faire apparaître.

J'ai adapté le calcul de mes jours fériés pour le calendrier 1904 (mais là c'est des formules), dès que je touche au VBA, j'ai plus rien qui fonctionne

La colorisation des samedi et dimanche est décalées d'une journée et les fériés ne fonctionne pas.

Si je passe le classeur en 1900 et que je change le mois ou l'année, tout rentre dans l'ordre.

Voilà mon petit fichier d'exemple :

Salut Fred,

essaye ça, ça devrait résoudre tes problèmes... tu changeras les couleurs des onglets et tu intègreras le code dans ta macro évènementielle si ça te convient.

26dates-onglets.zip (27.22 Ko)

Enorme merci Game Over, en prime avec les explications trop top

Il y a quand même un truc qui me chiffonne, dans ton code même si on change de calendrier 1904 à 1900, c'est niquel alors que sur la macro d'avant il y a un "bug", comment l'expliquer ?

Enfin je sais qu'entre les 2 il y a les 1462 jours, mais je ne vois pas pourquoi, il y a une répercussion sur la macro...

EDIT :

Set myRange = Range("B2:B12") 'plage jours fériés

j'aurais souhaité le remplacé par

Set myRange = Range("Fériés") 'plage jours fériés

dans ma macro évènementiel mais j'ai une belle erreur 1004. Je suppose que c'est lié au fait que ma plage n'est pas dans la feuille pour le coup.

Sinon le code fonctionne parfaitement

Fred35 a écrit :

Il y a quand même un truc qui me chiffonne, dans ton code même si on change de calendrier 1904 à 1900, c'est niquel alors que sur la macro d'avant il y a un "bug", comment l'expliquer ?

aucune idée en ce qui concerne le plantage de la macro initiale

Fred35 a écrit :

EDIT :

Set myRange = Range("B2:B12") 'plage jours fériés

j'aurais souhaité le remplacé par

Set myRange = Range("Fériés") 'plage jours fériés

dans ma macro évènementiel mais j'ai une belle erreur 1004. Je suppose que c'est lié au fait que ma plage n'est pas dans la feuille pour le coup.

c'est aussi mon avis.

Bonjour Fred35,

Bonjour Game Over,

Si tu as bien défini le nom "Fériés" et que son étendue est le classeur, ce nom devrait être reconnu dans toutes les feuilles.

Par contre, il serait plus prudent de préciser la référence des feuilles pour les variables aa et bb.

    aa = Worksheets("Feuil1").Range("C21") 'mois
    bb = Worksheets("Feuil1").Range("D27") 'année
20dates-onglets.zip (27.16 Ko)

A+

Bien vu frangy, merci pour tes corrections... cela permet à la macro de fonctionner lorsqu'elle est lancée depuis n'importe quelle feuille du classeur.

Merci à vous 2, j'ai du coup aussi utilisé la référence de la feuille pour les Fériés et tout fonctionne, mais je ne comprends toujours pas pourquoi ma plage nommée Fériés ne fonctionne pas.

Sachant que Fériés est défini comme suit :

=Feuil34!$B$2:$B$12

Que je mettes

Set myRange = Worksheets("Feuil34").Range("B2:B12") 'plage jours fériés

ou

Set myRange = Range("Fériés") 'plage jours fériés

je devrais obtenir le même résultat.

Ce n'est pas bien grave, la macro fonctionne nickel, mais j'aurai bien aimé comprendre le truc.

J'suis déjà pas doué avec le vba mais si des trucs que je pensais savoir ne fonctionne pas...

As-tu vérifié la portée (étendue) du nom "Fériés" dans le gestionnaire de noms ?

A+

Tu parles bien du menu insertion/nom/définir ?

Je suis sous 2003, je ne vois rien pas de mode étendu ou alors c'est quelques chose que je n'ai jamais utilisé.

En même temps il fonctionne sur les 31 feuilles de mon classeur puisque j'utilises une MFC de type

=OU($A$1=Fériés)

Il me semble bien avoir lu que jusqu'à 2003 la gestion des noms n'était pas terrible.

Peux-tu lancer ce test depuis une feuille différente de celle qui contient la plage nommée ?

Sub test()
Dim Plage As Range
    Set Plage = [Fériés]
    MsgBox "Plage " & Plage.Address
End Sub

A+

J'obtiens

Plage $B$2:$B$12

Donc tu fais bien la lecture sans générer d'erreur.

Essaie d'intégrer cette même syntaxe à ton code.

A+

J'ai intégré le code que tu ma donné dans la macro évènementiel et il me détecte bien la plage Fériés, mais l'erreur persiste, c'est à rien comprendre.

erreur 1004

et comme ça ?

Set myRange = [Fériés]

Je voyais plutôt la chose comme cela

10dates-onglets-1.zip (23.55 Ko)

A+

C'est tout bon,

Je ne savais pas qu'on pouvais appelé une plage comme ça, j'ai vraiment beaucoup de boulot pour apprendre le vba.

En tout cas, merci beaucoup à vous pour le coup de main


Finalement il y a encore un petit soucis...

En insérant des feuilles après Feuil31, le comportement de la macro change.

La coloration des onglets différent malgré le test numérique, elles prennent la couleur de la feuille 31.

voir dans l'exemple ci dessous.

Rechercher des sujets similaires à "probleme macro colorisation onglet"