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é
 

Fichiers joints

Yaloo

XLDnaute Barbatruc
Re : Dates VBA , des exemples de manipulations

Bonsoir René,

Merci pour ce fichier et le partage ;).

A+
 

néné06

XLDnaute Accro
Re : Dates VBA , des exemples de manipulations

Bonsoir Yaloo,

Je ne pense pas avoir d'erreurs et ravi que ce fichier intéresse quelques personnes !

A+

René
 

tototiti2008

XLDnaute Barbatruc
Re : Dates VBA , des exemples de manipulations

Bonsoir René, Bonsoir Yaloo,

Merci du partage, je regarderais ça un peu plus tard :)
 

néné06

XLDnaute Accro
Re : Dates VBA , des exemples de manipulations

Bonsoir à toi Tototiti2008,
Et je compte bien que tu me fasses part des remarques et corrections éventuelles.

A+

René
 

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
 

Eric C

XLDnaute Accro
Re : Dates VBA , des exemples de manipulations

Bonsoir le forum
Bonsoir néné06, Yaloo & tototiti2008

Très belle présentation. Je prends pour moi qui redécouvre les codes Vbastiques. MERKI à toi.
 

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
 

Fichiers joints

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é
 

Fichiers joints

Leskwal

XLDnaute Occasionnel
Re : Dates VBA , des exemples de manipulations

Bonjour le Forum

Beau Travail

Un grand Merci

Cordialement

Pascal
 

Modeste geedee

XLDnaute Barbatruc
Re : Dates VBA , des exemples de manipulations

Bonsour®
l'utilisation sur des ecrans à plus faible résolution n'est toujours pas satisfaisante ...
pourquoi ne pas utiliser les controles Onglets ou multipages ???
 

VIARD

XLDnaute Occasionnel
Re : Dates VBA , des exemples de manipulations

Bonjour néné06 et à tous

Compliment pour ce joli travail.
Je le mets dans ma musette.
Effectivement on peut améliorer la résolution.
Merci pour le partage.

Salutation
Jean-Paul
 

pierrejean

XLDnaute Barbatruc
Re : Dates VBA , des exemples de manipulations

Bonjour à tous

Je dois être né sous une mauvaise étoile
Voici ce que j'obtiens

age curieux.jpg
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas