Planning (N° semaine)

Bonjour,

Après avoir chercher pendant plusieurs heures, je commence à désespérer. Je cherche à faire une macro me permettant sur un planning de mettre en jaune la colonne correspondant à la semaine en cours.

J'ai un premier onglet ou je retrouve mon planning avec différentes lignes qui vont de 1 à 79

La première semaine commence colonne "M" et finit donc en colonne "BL"

J'ai un 2ème onglet nommé "Semaine n°" ou on retrouve une formule indiquant le numéro de semaine en B2.

J'avais commencé une macro mais je pense avoir pris la mauvaise poste (ps: je commence avec VBA..)

Si quelqu'un a des pistes pour m'aider à le réaliser.

Merci d'avances

Yann

Ah j'ai oublié de préciser, je sais que ceci est réalisable avec la mise en forme conditionnelle. Mais on m'a demandé de passer par des macro car le document est souvent modifié et la mise en forme conditionnelle a tendance à "sauter"

Yann

bon j'ai réussi à trouver avec :

Private Sub Worksheet_Change(ByVal Target As Range)
With Target

If Range("G1").Value = "1" Then
ActiveSheet.Range("M2:M79").Interior.ColorIndex = 27
Else
ActiveSheet.Range("M2:M79").Interior.ColorIndex = xlNone
End If

If Range("G1").Value = "2" Then
ActiveSheet.Range("N2:N79").Interior.ColorIndex = 27
Else
ActiveSheet.Range("N2:N79").Interior.ColorIndex = xlNone
End If

poursemaine

End With
End Sub

J'ai créer une case en G1 qui copie la valeur de B2 =N°semaine (aujourd'hui())

C'est du bricolage mais bon ça fonctionne.

Plus qu'à le faire 52 fois...

Bonjour,

je commence avec VBA

et tu ne prends pas d'emblée les bonnes habitudes pour progresser !

With inopérant : tu n'as visiblement pas compris l'utilisation d'une telle instruction !

Nombres entre guillemets !

La mise à jour d'une formule ne déclenche pas l'évènement Change...

Plus qu'à le faire 52 fois...

Ce qu'on ne fait jamais, car il y a toujours une autre solution.

Si ça fonctionne, c'est vraiment qu'Excel y met du sien ! et je serais étonné que cela dure éternellement !

Et il est vrai que l'objectif relève d'une MFC ! On est donc dans une utilisation de VBA pour pallier l'incapacité à faire fonctionner une MFC qui n'a a-priori aucune raison de "sauter". Et si malgré tout on est face à des manipulations conduisant à des fractionnements de MFC que l'on veut éviter, il est loisible de réécrire la MFC en VBA à chaque ouverture du classeur pour en maintenir l'unicité...

Il y a aussi que la fonction NO.SEMAINE ne renvoie pas le numéro de semaine selon la norme ISO8601 qui s'applique en Europe notamment. Il est donc utile de savoir sur quel théâtre géographique tu opères pour rectifier éventuellement ce point : Excel 2013 dispose d'une fonction renvoyant le numéro de semaine selon la norme ISO.

Cordialement.

Bonjour Mferrand,

D’abord merci pour votre réponse.

Actuellement le fichier fonctionne malgré mon bricolage, en effet je n'ai pas forcement compris l’utilité du "with"

J'ai récupéré le code sur internet et je l'ai adapté par rapport à mon fichier.

J'ai créé une macro au démarrage pour déclencher l’événement "change" (oui je sais encore une fois c'est du bricolage)

Je sais aussi qu'il y a forcement d'autres moyens que de le répéter 52 fois, malheureusement pour le moment je ne sais pas encore le faire...

Je pense que la mise à jour conditionnelle a tendance a sauter car le document est utilisé par plusieurs personnes ayant des versions d'excel allant de 2003 à 2016.

J'avais également penser à mettre à jour la MFC mais c'est hors de ma portée pour le moment..

J'habite en France, pour le NO.SEMAINE, comment puis je rectifier cette formule?

J'attends d'autres remarques qui me permettront de me perfectionner dans VBA!

Yann

Re,

Si ton fichier doit fonctionner sous Excel 2003, il faut calculer le numéro de semaine au moyen d'un formule, ou créer une fonction personnalisée... Comme on est déjà sur un classeur acceptant les macros, on peut opter pour cette dernière solution :

Function NSEM(d As Date) As Integer
    Dim dref
    Application.Volatile
    dref = DateSerial(Year(d + (8 - Weekday(d)) Mod 7 - 3), 1, 3)
    dref = dref - Weekday(dref) + 2
    NSEM = (d - dref) \ 7 + 1
End Function

S'utilise comme les fonctions Excel...

Cependant, un fichier xlsm ne s'ouvre pas sur 2003 ! (il faudrait qu'il soit enregistré au format 97-2003, en xls).

MFC coloration de la colonne semaine :

s'applique à la plage M2:BL82

formule :

=ET(M2="";M$1='Semaine n°'!$B$1)

dans la foulée, j'ai placé tes autres colorations sous MFC, s'appliquant à la même plage

formule pour vert :

=ET(M2<>"";M2<>"x")

formule pour rouge :

=M2="x"

Pour en assurer la pérennité, compte tenu de tes craintes en la matière... (auxquelles je ne crois pas trop, en tout cas si il y avait effectivement un risque, c'est que les manipulations feraient varier la plage d'application, et dans ce cas il faudrait la recalculer, ou utiliser une plage nommée...) une macro pour remettre en place les MFC à l'ouverture du classeur (proc. Workbook_Open) :

Private Sub Workbook_Open()
    Dim frm$
    With Worksheets("P1")
        With .Range("M2:BL82").FormatConditions
            .Delete
            frm = "=ET(M2="""";M$1='Semaine n°'!$B$1)"
            With .Add(xlExpression, , frm)
                .Interior.Color = vbYellow
                .StopIfTrue = False
            End With
            frm = "=ET(M2<>"""";M2<>""x"")"
            With .Add(xlExpression, , frm)
                .Interior.Color = vbGreen
                .StopIfTrue = False
            End With
            frm = "=M2=""x"""
            With .Add(xlExpression, , frm)
                .Interior.Color = vbRed
                .StopIfTrue = False
            End With
        End With
        .Activate
    End With
End Sub

Tu pourras noter :

- l'utilisation d'instructions With... End With imbriquées...

Une telle instruction consiste à mettre sous bloc With une expression renvoyant un objet auquel on veut se référer un nombre plus ou moins important de fois dans le bloc, s'y réfèrent les expressions débutant par un point (propriétés définissant des caractéristiques de l'objet ou renvoyant un objet affilié, méthodes de l'objet).

  • l'utilisation (par commodité) d'une variable pour définir les formules MFC sous forme de chaînes (texte),
  • et le fait que ces formules soient dans la langue utilisateur de la version d'Excel (retenir que ce mode de définition de formules dans du code VBA est relativement exceptionnel...)

- l'utilisation de la propriété Color, à préférer à ColorIndex (le système de couleurs affichables par Excel n'étant plus limité à la palette pour les versions postérieures à 2003).

Enfin si la coloration de la plage colonne correspondant à la semaine en cours par VBA, elle aurait été ciblée dans le code par :

    .Range("L2:L82").Offset(, s)

expression dans laquelle s est une variable à laquelle le numéro de semaine en cours a été affecté.

C'est plus pratique que définir 52 plages !

Cordialement.

Bonjour,

Je crois que j'ai encore du boulot pour tout comprendre sur VBA!

En tout cas un grand merci à toi pour toutes ces explications.

Cordialement

Yann

Rechercher des sujets similaires à "planning semaine"