Archives par étiquette : Excel

Excel – VBA Date

Le type de données VBA Date

Les variables de type Date sont stockées sous la forme de nombres à virgule flottante de 64 bits (8 octets) IEEE représentant des dates comprises entre le 1er janvier 100 et le 31 décembre 9999, et des heures allant de 0:00:00 à 23:59:59. Toute valeur de littéral date peut être attribuée à une variable de type Date. Les littéraux date doivent être délimités par le signe #, par exemple #January 1, 1993# ou #1 Jan 93#.

Les variables de type Date affichent les dates au format de date abrégé reconnu par votre ordinateur. Les heures s’affichent au format horaire (plage de 12 ou 24 heures) défini dans votre ordinateur.

Lorsque d’autres types de données numériques sont convertis en données de type Date, les valeurs situées à gauche du séparateur décimal représentent la date, tandis que celles situées à droite correspondent à l’heure. Minuit est représenté par 0 et midi par 0,5. Les nombres entiers négatifs représentent des dates antérieures au 30 décembre 1899.

  • Le codage interne de la date Excel est un nombre réel double dont l’unité est le jour et les fractions des heures, minutes, secondes, etc…
  • La valeur référence 2 correspond au 1er janvier 1900 (voir liens référencés 2 et 3 ci-dessous). Il est souvent mentionné que 1 est la valeur de référence mais cela n’est que partiellement exact et ne satisfait qu’Excel et d’anciens logiciels. Cela ne satisfait en aucun cas les interactions avec d’autres logiciels ou références de temps comme EPOCH et d’autres. Ce défaut d’Excel n’a jamais été corrigé et ne le sera probablement jamais (voir lien référencé 2).
  • Dans la pratique, le calendrier Excel sans erreur comprend les valeurs de date >=61 (1er mars 1901 00:00:00) et <2958466 (31 décembre 9999 24:00:00).

La fonction VBA Format(expr, format, …)

Renvoie une valeur de type Variant (String) contenant une expression formatée en fonction des instructions contenues dans l’expression de mise en forme.

Syntaxe

Format(expression[, format[, firstdayofweek[, firstweekofyear]]])

La syntaxe de la fonction Format comprend les éléments suivants :

Élément Description
expression Toute expression valide.
format Facultatif. Expression de mise en forme valide, nommée ou définie par l’utilisateur.
firstdayofweek Facultatif. Constante indiquant le premier jour de la semaine.
firstweekofyear Facultatif. Constante indiquant la première semaine de l’année.
  • La fonction est sans erreur, y compris depuis la valeur de référence 2 (Excel 2010 et probablement toutes les versions).
  • Le formatage de dates Excel le plus complet est aaaa-mm-jj hh:mm:ss.000.
  • Excel ne prend pas en compte les TimeZone, ni les heures d’été et d’hiver.
  • Il est toutefois intéressant de noter que la référence 2 pour la date du 1er janvier 1900 autorise le calcul relatif de TimeZone aux limites de +/- 24 heures (1 jour).
  • Les valeurs de dates >=0 et <1 peuvent être assimilées à des heures >=#00:00:00# et <#24:00:00#.
  • Le formatage pour afficher l’heure est hh:mm:ss ou hh:mm:ss.000 ou encore d’autres variantes.

La fonction VBA CDate(expr)

La fonction ci-dessous convertit une expression en un type de données spécifique.

Syntaxe

CDate(expression)

L’argument expression peut être n’importe quelle expression de chaîne ou expression numérique.

Types renvoyés

Le nom de la fonction détermine le type renvoyé, comme le montre le tableau suivant :

Fonction Type renvoyé Plage de valeurs de l’argument expression
CDate Date Toute expression de date valide.

Utilisez la fonction IsDate pour déterminer si la valeur de l’argument date peut être convertie en date ou en heure. La fonction CDate reconnaît les littéraux date et heure ainsi que certains nombres appartenant à la plage de dates autorisées. Lors de la conversion d’un nombre en date, la partie entière du nombre est convertie en date. Si le nombre comprend une partie décimale, celle-ci est convertie en heures, exprimées en partant de minuit.

La fonction CDate reconnaît les formats de date définis dans les paramètres régionaux de votre système. L’ordre des jours, mois et années risque de ne pouvoir être défini si les données sont fournies dans un format différent des paramètres de date reconnus. En outre, les formats de date complets précisant le jour de la semaine ne sont pas reconnus.

Pour des raisons de compatibilité avec les versions antérieures de Visual Basic, il existe une fonction CVDate, dont la syntaxe est identique à celle de la fonction Cdate. Cependant, la fonction CVDate renvoie une donnée de type Variant et de sous-type Date et non une véritable donnée de type Date. Dans la mesure où il existe désormais un type Date intrinsèque, la fonction CVDate n’est plus nécessaire. On obtient le même résultat en convertissant une expression en donnée de type Date, puis en l’affectant à une donnée de type Variant. Cette technique est cohérente avec la conversion des autres types intrinsèques dans le sous-type Variant équivalent.

  • La valeur expression peut satisfaire à de nombreux critères d’analyse (parsing).
  • La fonction CDate n’est exacte que pour les dates >=#1.3.1900# (1er mars 1900).

Liens externes

  1. Feuille Excel d’étude DateTime: DateTime_2017-08-02.xlsm
  2. Confusion Excel pour l’année 1900: Microsoft – Excel suppose à tort que l’année 1900 est une année bissextile
  3. Différences entre Excel pour Windows ou Macintosh: EPFL – Problème de dates dans Excel danger!
  4. Calcul des années bissextiles: Vikidia – Année bissextile
  5. Calcul des années bissextiles: Wikipédia – Année bissextile
  6. Calcul des années bissextiles: Wikipédia – Année séculaire bissextile

Addendum

2017-12-29: Les fonctions VBA CDate et Format convertissent correctement les dates <#1.3.1900#. En fait, c’est le formatage des dates affichées dans les cellules du tableur Excel qui est incorrect. La valeur 2 correspond correctement à la date #1.1.1900#.

Excel – CSV et DateTime

Résumé des caractéristiques de la conversion automatique d’un champ DateTime à l’ouverture :

  • Le codage interne de la date Excel est un nombre réel dont l’unité est le jour et les fractions des heures, minutes, secondes, etc…
  • La référence ‘0’ est le 1er janvier 1900.
  • Le formatage Excel de DateTime le plus complet est ‘aaaa-mm-jj hh:mm:ss.000’.
  • Excel ne prend pas en compte les TimeZone, ni les heures d’été et d’hiver.
  • Excel effectue une conversion automatique des données lors de l’importation CSV. La conversion des champs de donnée DateTime est restreinte au format ‘aaaa-mm-jj hh:mm:ss’. Les informations supplémentaires de millisecondes ou de TimeZone sont éliminées.
  • Afin que l’information de temps universelle UTC puisse être déterminée avec exactitude, le fichier CSV doit contenir 3 champs qui sont ensuite combinés par une formule:
    • DateTime au format ‘aaaa-mm-jj hh:mm:ss’ (date et heure locales)
    • MSecs au format ‘nombre entier’ (0..999 [millisecondes])
    • TimeZone au format ‘nombre entier signé’ (+/- n [minutes])

    Le temps UTC est calculé ainsi: DateTime + Msecs/24/60/60/1000 + TimeZone/24/60.

Exemple de fichier CSV avec une date et heure locale 11.12.2013 17h11m22.345s dans le fuseau horaire de Paris +1h (heure d’hiver):

Encodage DateTime ISO 8601:

Feuille Excel d’étude DateTime: DateTime.xlsm
Format DateTime ISO 8601 simplifié: ECMAScript® Date Time String Format