Decalage n°semaine avec date

bonjour,

j ai un souci avec la semaine et la date réelle (aujourd'hui :semaine 22 début le 30 mai alors que mon fichier ouvre semaine 33 au 6 juin) et je ne trouve pas pourquoi

de plus mes listbox bloquent aussi (incompatibilité de type) mais j ai vérifié ma requête et ne vois pas ce qui cloche

merci de votre aide

le fichier étant lourd, j'ai mis un lien

https://www.cjoint.com/c/FEEnaeLkIMZ

Bonsoir,

une petite erreur le fichier s'ouvre en semaine 23 au 06/06/2016 et non pas semaine 33...

Ceci dit ce doit être du à une erreur de calcul "connu" d'Excel... bien que VBA soit plus précis...

Bref , sur ce site il y a pas mal de sujet sur ces histoire d'erreur, d'ailleurs certain imprimeur devraient y faire un tour avant d'imprimer leur calendrier, j'en ai trouvé qui avait "une semaine" d'avance !

là un lien : https://forum.excel-pratique.com/post452191.html?hilit=calcul n° de semaine#p452191

et là : https://forum.excel-pratique.com/excel/formule-numero-semaine-format-annee-numerosemaine-t67238-10.html?hilit=semaine

@ bientôt

LouReeD

Bonsoir,

Ton calcul est faux... mais plutôt que de continuer avec les fonctions de Microsoft qui n'a jamais réussi à faire un calcul pérenne du numéro de semaine européen (on finit toujours par rencontrer un bogue un jour ou l'autre malgré la simplicité de ce calcul !) je conseille d'utiliser une fonction sûre, par exemple :

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

Cordialement.

bonjour

merci ferrand pour ta réponse mais cette formule :

Function NSem(d As Date) As Integer

Dim dref

dref = DateSerial(Year(d + (8 - Weekday(d)) Mod 7 - 3), 1, 3)

dref = dref - Weekday(dref) + 2

NSem = (d - dref) \ 7 + 1

End Function[/b]

je l insere à quel niveau car j ai 2 parties ou il y a le n° de semaine

de plus pour les listbox qu'en est il

merci

C'est une fonction. Tu la colles donc dans un module. Elle renvoie le numéro de semaine à partir d'une date.

Partout où tu as besoin du numéro de semaine dans ton code tu l'utilises pour le renvoyer : NSem(ladateconcernée).

Je n'ai pas ton classeur sous les yeux, je regarderai dans la soirée.

A+

Bonsoir,

J'ai jeté un oeil... et je t'avoue que devant la difficulté de s'y retrouver rapidement je ne suis pas très enclin à approfondir...

Pour ce qui est du problème semaine, il te suffit de coller la fonction en tête du module (parce que les procédures Function se placent avant les procédures Sub dans un module, je pense qu'on ne te l'a pas encore dit...) et avec ta variable N_semaine tu fais simplement : N_semaine = NSsem(Date).

Date plutôt que Now, car Now te renvoie aussi l'heure et si tu n'as pas besoin des deux en même temps, Date est tout à fait indiqué (de même que Time l'est pour avoir l'heure indépendamment de la date).

En outre, le type de procédures Auto_... telle Auto_Open, constitue depuis longtemps une vieillerie remplacée avantageusement par les procédures évènementielles, ce que tu aurais donc intérêt à faire, et donc placer ce code dans une procédure Workbook_Open dans le module ThisWorkbook.

Egalement, la présence de 4 modules ne fait que disperser le code et occuper de la place inutilement en mémoire, un suffit largement à accueillir tout ton code et celui qui tu auras à ajouter (des modules distincts se mettent en place s'ils sont justifiés par des utilisations spécifiques qui conduisent à y placer une partie du code pour l'isoler du reste, ce qui n'est pas le cas ici.

Tu as pris soin de nommer tes modules, je n'ai rien contre mais il me semble que le renommage des contrôles, qui lui apporte de nombreux avantages aurait dû passer avant les modules, pour lesquels c'est relativement secondaire, or les contrôles n'ont pas été renommés et on va à la pêche pour savoir lequel est quoi...

J'ai réussi à voir tes ListBox (pas évident !) mais j'ai cherché en vain leur mention dans le code. Ils n'apparaissent qu'une fois :

sheets(ListBox2.Value).Select
sheets(ListBox1.Value).Select

Je ne vois donc pas comment ils peuvent être alimentés... ni quel problème ils te posent... ?

Si je peux encore ajouter quelques remarques dans le désordre :

- Dès que je vois Select écrit dans une ligne de code, j'ai la tentation de m'arrêter là, parce que je sais que je vais souffrir ! Sauf les rares cas où il s'agit de manipuler l'interface pour faire visualiser telle ou telle partie du fichier à l'utilisateur à un moment précis, c'est toujours inutile... Il y a pire dans le genre, mais les deux lignes citées plus haut, une sélection se substituant nécessairement à la précédente, montrent que si la seconde sera de toute façon superflue, la première est de plus totalement gratuite puisque abandonnée sitôt faite !

- Je crois aussi qu'il faut prioritairement apprendre à indenter correctement le code, ce qui permet de le lire en sachant rapidement ce qu'on lit... et aussi à manier les boucles pour éviter de longues énumérations dont on peut agréablement se dispenser.

Pour le reste, je n'ai pas spécialement regardé la nature de ton projet mais j'ai tout de même vu le grand nombre de feuille, dont 53 pour les semaines de l'année : dans ma conception d'un planning, cela en fait déjà 52 de trop, une doit me suffire pour afficher l'une ou l'autre des 53 semaines, les données étant alors stockées de façon plus économique, tout en devant rester accessibles et appelables à tout moment. Mais cela, doit se penser avant de passer à la réalisation.

Bonne continuation cependant.

bonjour

merci pour toutes ces infos MFERRAND, je vais revoir tout cela de près , remanier les codes

Rechercher des sujets similaires à "decalage semaine date"