Dates VBA , des exemples de manipulations

néné06

XLDnaute Accro
Bonsoir à toutes et tous,

J'ai fais un petit fichier pour me remémorer la syntaxe et la codification lors de l'utilisation des dates en VBA.
Je pense que ce petit exemple peut être utile à certains, qui ont des problèmes avec la manipulation des dates.

Bonne soirée à tous


René
 

Pièces jointes

  • Manipuler les dates.xls
    55.5 KB · Affichages: 213

Modeste geedee

XLDnaute Barbatruc
Re : Dates VBA , des exemples de manipulations

Bonsour®
Bonsoir à toutes et tous,

J'ai fais un petit fichier pour me remémorer la syntaxe et la codification lors de l'utilisation des dates en VBA.
Je pense que ce petit exemple peut être utile à certains, qui ont des problèmes avec la manipulation des dates.

Bonne soirée à tous
René

quelques petites remarques :
- Dimensions du userform réservé aux trés hautes résolutions :(

- numéro de semaine ISO à corriger :
BUG: Format or DatePart Functions Can Return Wrong Week Number for Last Monday in Year
Code:
Function WOY (MyDate As Date) As Integer   ' Week Of Year
  WOY = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
  If WOY > 52 Then
    If Format(MyDate + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then WOY = 1
  End If
End Function
 

ROGER2327

XLDnaute Barbatruc
Re : Dates VBA , des exemples de manipulations

Bonjour à tous.


Bonne idée, ce regroupement. (Sauf que je ne peux voir la chose en entier avec mon petit écran.)
À propos du numéro de semaine, il ne faut pas croire, et encore moins répandre, ce que raconte Bill avec sa prétendue "correction" par le bricolage "WOI" : c'est pure affabulation.

Code:
          DATE             WOY    N° de semaine 
______________________________________(ISO)____

  lundi  8 janvier 1900     1           2       
  lundi 15 janvier 1900     2           3       
  lundi 22 janvier 1900     3           4       
  lundi 29 janvier 1900     4           5       
  lundi  5 février 1900     5           6       
  lundi 12 février 1900     6           7       
  lundi 19 février 1900     7           8       
  lundi 26 février 1900     8           9       
 dimanche 2 janvier 2101   53          52       
 dimanche 2 janvier 2501   53          52       
 dimanche 2 janvier 2901   53          52       
 dimanche 2 janvier 3301   53          52       
 dimanche 2 janvier 3701   53          52       
 dimanche 2 janvier 4101   53          52       
 dimanche 2 janvier 4501   53          52       
 dimanche 2 janvier 4901   53          52       
 dimanche 2 janvier 5301   53          52       
 dimanche 2 janvier 5701   53          52       
 dimanche 2 janvier 6101   53          52       
 dimanche 2 janvier 6501   53          52       
 dimanche 2 janvier 6901   53          52       
 dimanche 2 janvier 7301   53          52       
 dimanche 2 janvier 7701   53          52       
 dimanche 2 janvier 8101   53          52       
 dimanche 2 janvier 8501   53          52       
 dimanche 2 janvier 8901   53          52       
 dimanche 2 janvier 9301   53          52       
 dimanche 2 janvier 9701   53          52


Bonne journée.


ROGER2327
#6508


Mercredi 18 Pédale 140 (Saint Nosocome, carabin - fête Suprême Quarte)
22 Ventôse An CCXXI, 1,4594h - persil
2013-W11-2T03:30:10Z
 

Modeste geedee

XLDnaute Barbatruc
Re : Dates VBA , des exemples de manipulations

Bonsour®
Bonjour à tous.
À propos du numéro de semaine, il ne faut pas croire, et encore moins répandre, ce que raconte Bill avec sa prétendue "correction" par le bricolage "WOI" : c'est pure affabulation.

:rolleyes: tant que l'on travaillera avec le calendrier 1900
les numéros de série inférieurs au 01/03/1900 seront et resteront faux !!!!

Quant à correction apportée par la KB200299 et concernant les dates que je ne vivrai jamais ;)...
BUG: Format or DatePart Functions Can Return Wrong Week Number for Last Monday in Year

tu as hélas raison...
peut-etre en corrigeant comme ceci ??

Code VBA:
Function WOY(MyDate As Date) As Integer ' Week Of Year
WOY = Format(MyDate, "ww", vbMonday, vbFirstFourDays)
If WOY > 52 Then
If Weekday(MyDate + 7, 2) < 4 Then WOY = 1
End If
End Function
 

néné06

XLDnaute Accro
Re : Dates VBA , des exemples de manipulations

Bonjour Modeste geedee,Roger2327 et à tous les participants de ce fil.

@ Modeste geedee et Roger2327

Je dois vous dire que je suis embêté car j'ai un rendez_vous la semaine 52 /2101 et je ne veux pas le rater !
Blague mise à part , pour notre cours passage, est-ce que les dates sont valides avec les semaines que mon programme affiche ?

J'ai testé sur les années de 2012 à 2016 et cela me semble OK !
D'après ce que me répond Roger, je ne change rien et la programmation est viable .

Merci de vous être intéressés au fichier.

René
 

ROGER2327

XLDnaute Barbatruc
Re : Dates VBA , des exemples de manipulations

Suite...


(...) tant que l'on travaillera avec le calendrier 1900
les numéros de série inférieurs au 01/03/1900 seront et resteront faux !!!! (...)
Si on faisait l'erreur de croire Bill et ses potes on admettrait que​
Excel enregistre les dates sous forme de numéros de série séquentiels afin de pouvoir les utiliser dans des calculs. Le 1er janvier 1900 est le numéro de série 1 et le 1er janvier 2008 est le numéro de série 39448 car 39 447 jours se sont écoulés depuis le 1er janvier 1900. Microsoft Excel pour Macintosh utilise un autre calendrier par défaut.
Est-ce bien vrai ?

En vérité, en vérité, je vous le dis : Excel enregistre les dates sous forme de trois séries séquentielles d'entiers afin d'en rendre l'utilisation incommode dans les calculs. Tout d'abord, une première série de numéros de série séquentiels allant de 1 à 59 est utilisée pour les dates du 1[sup]er[/sup] janvier au 28 février 1900. Ensuite, une deuxième série de numéros de série séquentiels allant de 61 à 2958465 est utilisée pour les dates du 1[SUP]er[/SUP] mars 1900 au 31 décembre 9999. Ainsi, le 1[SUP]er[/SUP] janvier 2008 porte le numéro de série 39448 parce qu'en comptant les jours depuis le 1[SUP]er[/SUP] janvier 1900 (n° 1), il devrait porter le n° 39447. Enfin, une série de numéros de série séquentiels réduite au seul terme 60 complète le dispositif pour représenter, une date inexistante dans le calendrier grégorien : le 29 février 1900. C'est plus mieux comme ça. Malgré la réflexion de centaines d'ingénieurs et l'investissement d'un nombre considérable de milliards de dollars, aucun système plus rationnel n'a pu être imaginé depuis une trentaine d'année.

Évangile selon Roger, 23-27​

(Article issu de la traduction automatique)
Heureusement, on a de la chance ! On dispose dans Windows d'une bibliothèque de liens dynamiques nommées Oleaut32.dll pour exploiter ce remarquable système d'indexation.

Zut ! On n'a pas de chance !​
Lors de la détermination du numéro de semaine d'une date selon la norme ISO 8601, l'appel de la fonction sous-jacente au fichier Oleaut32.dll renvoie par erreur la semaine 53 au lieu de la semaine 1 pour le dernier lundi de certaines années.
(...)
Dans Visual Basic et Visual Basic pour Applications, toutes les fonctions de date, à l'exception de la fonction DateSerial, s'appuient sur des appels au fichier Oleaut32.dll. Étant donné que les fonctions Format() et DatePart() peuvent renvoyer le numéro de la semaine d'une date donnée, elles sont toutes deux concernées par ce bogue.
(...)
Si ! On a de la chance !​
(...)
Pour éviter ce problème, vous devez employer le code alternatif fourni dans cet article.
M... ! Voir les messages précédents...
Pas de chance !

Une seule solution : écrire un truc avec les fonctions pas boguées (il y en a aussi).

Après moult tests, Mesdames DateSerial et Year ont l'air sain. Donc, sous toutes réserves, S.G.D.G. cela va de soi, et aux risques et périls des amateurs audacieux (l'auteur déclinant toute responsabilité en matière de dommages passés, présents ou à venir, autant que directs, indirects, collatéraux ou autres) :​
VB:
Function NOSEM%(d As Date)
Dim n&
    If ThisWorkbook.Date1904 Then
        If d = 0 Then d = DateSerial(1904, 1, 1)
    Else
        If d < 61 Then d = d + 1
    End If
    n = DateSerial(Year(d - 3 + (7 - (d - 1) Mod 7) Mod 7), 1, 1)
    NOSEM = (d - 3 - n + (2 + (n + 6) Mod 7) Mod 7) \ 7 + 1
End Function
(À vérifier sans modération.)​


Assez rigolé !
À plus tard.



ROGER2327
#6509


Mercredi 18 Pédale 140 (Saint Nosocome, carabin - fête Suprême Quarte)
22 Ventôse An CCXXI, 7,1411h - persil
2013-W11-2T17:08:19Z
 

néné06

XLDnaute Accro
Re : Dates VBA , des exemples de manipulations

Bonsoir Roger2327 et merci pour tant de documentation sur les dates!

Je dois avouer, cela me dépasse.

Je laisse mon fichier dans l'état en espérant que la formule
"NumSem = Format(TextBox2.Value, "ww", vbMonday, vbFirstFourDays)", ne donne pas un numéro de semaine erroné dans la période de 1920 à 2120.


Comme vous le mentionnez plus haut, pour les utilisateurs de ce fichier,
(l'auteur déclinant toute responsabilité en matière de dommages passés, présents ou à venir, autant que directs, indirects, collatéraux ou autres) :

Merci !!

René
 

ROGER2327

XLDnaute Barbatruc
Re : Dates VBA , des exemples de manipulations

Re...


(...)
Je laisse mon fichier dans l'état en espérant que la formule
"NumSem = Format(TextBox2.Value, "ww", vbMonday, vbFirstFourDays)", ne donne pas un numéro de semaine erroné dans la période de 1920 à 2120.
(...)
Il y a au moins une date gênante : le deux janvier 2101 (voir le message #8).


Bonne nuit !


ROGER2327
#6510


Mercredi 18 Pédale 140 (Saint Nosocome, carabin - fête Suprême Quarte)
22 Ventôse An CCXXI, 9,2373h - persil
2013-W11-2T22:10:10Z
 

tototiti2008

XLDnaute Barbatruc
Re : Dates VBA , des exemples de manipulations

Bonsoir à tous,

ne donne pas un numéro de semaine erroné dans la période de 1920 à 2120.

Ci-joint la liste des différences détectées

Edit : ma version ne prend pas en charge le fameux 60ème jour du calendrier, contrairement à celle de Roger
 

Pièces jointes

  • NumSem.xls
    31.5 KB · Affichages: 88
Dernière édition:

néné06

XLDnaute Accro
Re : Dates VBA , des exemples de manipulations

Bonsoir à tous et merci à Roger et Tototiti pour leurs aides précieuses.

Grâce au renseignement fournis par Roger, j'ai ajouté la fonction du #11
Je me suis livré à quelques tests fournis par Tototiti au #14.

Cela a l'air de fonctionner et donc de ne pas afficher des numéros de semaines faux.

Merci à tous

René
 

Pièces jointes

  • Copie de Manipuler les dates.xls
    75.5 KB · Affichages: 114

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof