Retour à la FAQ


Astuce facilitant le report de dates entre classeurs n'utilisant pas le même calendrier. de Michel Gaboly

Pour ceux qui ont besoin de précisions sur le fonctionnement des calendriers
sans Excel et la différence entre les options 1900 et 1904, ils trouveront un rappel plus bas.

Hier, pour un développement en cours avec Excel PC, j'ai eu besoin de récupérer
des données, dont des dates, d'un document existant. J'ai écrit une macro et je l'ai
testée dans une feuille du classeur contenant les macros.

J'ai récupéré mes données sans problème particulier.

J'ai ensuite adapté le traitement pour reporter les données sur un autre document
préexistant, fourni par le client. Cette fois, les dates étaient modifiées :

le 1er septembre 2003 devenait le 2 septembre 2007.

Ce comportement est typique des différences liées aux calendriers 1900 et 1904.

Effectivement, pour les 2 documents fournis par le client (Source et Destination),
l'option "Calendrier depuis 1904" était cochée, ce qui n'était pas le cas du document contenant les macros.

Cependant, si la macro était capable de reporter correctement la date en interne
(sur une feuille appartenant au classeur contenant la macro effectuant le report),
je me suis demandé si une astuce ne pouvait pas régler le problème.

Dans Excel on a parfois affaire a des nombres qui ne sont pas reconnus comme tels
(résultat d'une fonction texte par exemple). L'astuce consiste à multiplier par 1 ou
à ajouter 0 pour forcer Excel à convertir en numérique ce qui ne l'est pas.

Le même principe fonctionne aussi pour 1900/1904 : en désignant par Ref (objet
Range), la cellule contenant la date à reporter, l'instruction :

ActiveCell.Value = Ref

ne gère pas la difficulté liée à une source basée sur le calendrier 1904. Par contre avec :

ActiveCell.Value = Ref - 0

tout rentre dans l'ordre. Le décalage de 4 ans et un jour n'existe plus. ;-))

Voici comment le vérifier :

1 - Créer un nouveau classeur
2 - Cocher l'option "Calendrier depuis 1904"
3 - Entrer une date dans une cellule
4 - Resélectionner la cellule contenat la date
5 - Exécuter le code ci-dessous :

Sub ReportDate()
Dim Ref As Range, Dest1 As Workbook, Dest2 As Workbook
Set Ref = ActiveCell
' Ajout d'un classeur avec un calendrier démarrant en 1904
Workbooks.Add
Set Dest1 = ActiveWorkbook
Dest1.Date1904 = True
' Ajout d'un classeur avec un calendrier ne démarrant pas en 1904
Workbooks.Add
Set Dest2 = ActiveWorkbook
Dest2.Date1904 = False
' Report sur les 2 classeurs
Report Dest1, Ref
Report Dest2, Ref
End Sub

Sub Report(w As Workbook, Ref As Range)
With w.ActiveSheet.Range("A1")
Range(.Offset(0), .Offset(1)).NumberFormat = "dddd d mmmm yy"
.ColumnWidth = 20
.Value = Ref - 0
.Offset(1) = Ref
End With
End Sub

Ce code crée 2 classeurs, l'un avec un calendrier 1900, l'autre avec un calendrier 1904.

Ensuite la date contenue dans la cellule active du classeur préexistant est reportée
dans les cellules A1 et A2 de chacun des 2 classeurs créés.

En cellule A1, on utilise "= Ref - 0", Ref représentant la cellule de référence, contenant la date initiale.

En cellule A2, on utilise "=Ref"

Dans le classeur avec le calendrier 1900, le contenu des cellules A1 et A2 est iden-
tique, tandis que dans le second, il y a le classique écart de 4 ans et 1 jour entre le contenu des cellules A1 et A2.

RAPPEL - Quand Excel est sorti en 1985, sur Mac uniquement, le calendrier
utilisé démarrait en 1904. Pour Excel une date était considérée (c'est d'ailleurs
toujours le cas) comme un numéro de série où une unité représente 24 heures.
Le 1er janvier 1904 était le jour O (zéro). La correspondance entre un nombre et
une date fonctionne ainsi :

1 2 janvier 1904,
30 31 janvier 1904
59 29 février 1904 (année bissextile)
365 31 décembre 1904

... 36000 25 juillet 2002
36467 4 novembre 2003

Ce système facilite la gestion des dates, puisque le nombre de jours entre 2 dates
correspond à une simple soustraction.

Pour les mêmes raisons, si A1 contient une date, écrire dans une cellule "=A1 + 7"
fera apparaître une date postérieure d'une semaine à celle de A1.

S'il n'y avait pas les années bissextiles, ajouter 36500 représenterait un siècle.

Lors de l'apparition d'Excel sur PC (fin 1987), le sytème a été repris mais avec
un décalage de 4 ans et 1 jour : la valeur 1 (au lieu de 0 sur Mac) correspond au
1er janvier 1900. Le 4 novembre 2003 correspond alors au nombre 37929

Depuis lors, le calendrier 1904 est resté la norme sur Mac, le calendrier 1900
sur PC. Pour des raisons de compatibilité, il existe une option (onglet "Calcul"
des "Préférences" ("Options" sur PC") du menu "Outils"), qui permet de choisir
entre les 2 calendriers, en cochant ou non "Calendrier depuis 1904" dans les "Options de classeur".

Modifier cette option ne concerne que le classeur actif.

Le problème est que lorsque qu'on copie des données contenant des dates entre 2 clas-
seurs pour lesquels l'option n'est pas la même, les dates sont modifiées de 1462 jours
(4 ans et 1 jour), car ce qui est copié, ce n'est pas la date elle-même, mais le numéro
de série : dans un classeur basé sur le calendrier 1904, une cellule contenant la date
du 4 novembre 2003 contient en fait le numéro de série 36467. Après collage dans
un classeur basé sur le calendrier 2000, on obtient le 3 novembre 1999, puis- qu'en
fait on a collé 36467 alors que c'est 37929 qui correspond au 4 novembre 2003 avec
le calendrier 1900.

Le moins que l'on puisse dire est que la première fois, c'est désorientant ;-))

Bravo à ceux qui ont eu le courage de tout lire ;-))))

-- Cordialement,
Michel Gaboly

 


[top]