OVH Cloud OVH Cloud

Astuce 1900/1904

10 réponses
Avatar
Michel Gaboly
Bonjour,

J'ai découvert hier une astuce facilitant le report de dates entre classeurs
n'utilisant pas le même calendrier. Je ne crois pas qu'ele soit sur Excelabo.

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
http://www.gaboly.com

10 réponses

Avatar
DJ9B
Bon et bien moi j'ai tout lu jusqu'au bout ;o) !
Merci Michel pour cette astuce !

--
@ tantôt !
email : http://www.cerbermail.com/?05npeGunAn
Site : http://www.dj9b.fr.st



Dans le fameux MPFE Michel Gaboly a écrit il y a peu :

Bonjour,

J'ai découvert hier une astuce facilitant le report de dates entre
classeurs n'utilisant pas le même calendrier. Je ne crois pas qu'ele
soit sur Excelabo.

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 "¡ + 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 ;-))))


Avatar
Frédéric Sigonneau
Bonsoir Michel,

Je n'ai encore lu cette astuce nulle part, mais il est clair qu'elle peut
grandement faciliter les échanges de dates en VBA entre des classeurs de
calendriers différents.
D'après les petits tests que je viens de faire, il semble que le bloquage de
l'ajustement automatique des dates opéré par Excel se fait indifféremment avec
-0 ou +0.
Je mets de côté cette intéressante petite trouvaille, merci de l'avoir partagée
:-)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonjour,

J'ai découvert hier une astuce facilitant le report de dates entre classeurs
n'utilisant pas le même calendrier. Je ne crois pas qu'ele soit sur Excelabo.

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 "¡ + 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
http://www.gaboly.com


Avatar
Misange
archivé !

Misange migrateuse http://www.excelabo.net
mail : http://cerbermail.com/?k5Q8Dh2mta


le 04/11/2003 11:43:
Bonjour,

J'ai découvert hier une astuce facilitant le report de dates entre classeurs
n'utilisant pas le même calendrier. Je ne crois pas qu'ele soit sur Excelabo.

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 "¡ + 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
http://www.gaboly.com




Avatar
Michel Gaboly
De rien, DJ9B.

Content d'avoir eu au moins un lecteur ;-))




Bon et bien moi j'ai tout lu jusqu'au bout ;o) !
Merci Michel pour cette astuce !

--
@ tantôt !
email : http://www.cerbermail.com/?05npeGunAn
Site : http://www.dj9b.fr.st

Dans le fameux MPFE Michel Gaboly a écrit il y a peu :

Bonjour,

J'ai découvert hier une astuce facilitant le report de dates entre
classeurs n'utilisant pas le même calendrier. Je ne crois pas qu'ele
soit sur Excelabo.

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 "¡ + 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
http://www.gaboly.com


Avatar
Michel Gaboly
Bonjour Frédéric,

C'était avec plaisir ;-))



Bonsoir Michel,

Je n'ai encore lu cette astuce nulle part, mais il est clair qu'elle peut
grandement faciliter les échanges de dates en VBA entre des classeurs de
calendriers différents.
D'après les petits tests que je viens de faire, il semble que le bloquage de
l'ajustement automatique des dates opéré par Excel se fait indifféremment avec
-0 ou +0.
Je mets de côté cette intéressante petite trouvaille, merci de l'avoir partagée
:-)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonjour,

J'ai découvert hier une astuce facilitant le report de dates entre classeurs
n'utilisant pas le même calendrier. Je ne crois pas qu'ele soit sur Excelabo.

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 "¡ + 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
http://www.gaboly.com



--
Cordialement,

Michel Gaboly
http://www.gaboly.com


Avatar
Michel Gaboly
Merci Misange ;-))


archivé !

Misange migrateuse http://www.excelabo.net
mail : http://cerbermail.com/?k5Q8Dh2mta

le 04/11/2003 11:43:
Bonjour,

J'ai découvert hier une astuce facilitant le report de dates entre classeurs
n'utilisant pas le même calendrier. Je ne crois pas qu'ele soit sur Excelabo.

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 "¡ + 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
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com


Avatar
Daniel.j
Bonsoir Michel,
Je mettrais tout cela sur la FAQ !?
Daniel


"Michel Gaboly" a écrit dans le message de news:

| Bonjour,
|
| J'ai découvert hier une astuce facilitant le report de dates entre classeurs
| n'utilisant pas le même calendrier. Je ne crois pas qu'ele soit sur Excelabo.
|
| 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 "¡ + 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
| http://www.gaboly.com
|
|
Avatar
Michel Gaboly
Merci Daniel, ;-))

Ton message du 5 novembre m'avait échappé.


Bonsoir Michel,
Je mettrais tout cela sur la FAQ !?
Daniel

"Michel Gaboly" a écrit dans le message de news:

| Bonjour,
|
| J'ai découvert hier une astuce facilitant le report de dates entre classeurs
| n'utilisant pas le même calendrier. Je ne crois pas qu'ele soit sur Excelabo.
|
| 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 "¡ + 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
| http://www.gaboly.com
|
|


--
Cordialement,

Michel Gaboly
http://www.gaboly.com

Avatar
Myriam
Salut !
Merci Michel pour ce cours édifiant sur l'age de nos machines...
A+
--
J'aime ces forums, mais ôter 'virgule.' pour me répondre par e-mail !!!
< >
Myriam M.

"Michel Gaboly" a écrit dans le message de
news:
Merci Daniel, ;-))

Ton message du 5 novembre m'avait échappé.


Bonsoir Michel,
Je mettrais tout cela sur la FAQ !?
Daniel

"Michel Gaboly" a écrit dans le message de news:

| Bonjour,
|
| J'ai découvert hier une astuce facilitant le report de dates entre
classeurs


| n'utilisant pas le même calendrier. Je ne crois pas qu'ele soit sur
Excelabo.


|
| 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 "¡ + 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
| http://www.gaboly.com
|
|


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





Avatar
Michel Gaboly
De rien, Myriam ;-))


Salut !
Merci Michel pour ce cours édifiant sur l'age de nos machines...
A+
--
J'aime ces forums, mais ôter 'virgule.' pour me répondre par e-mail !!!
< >
Myriam M.

"Michel Gaboly" a écrit dans le message de
news:
Merci Daniel, ;-))

Ton message du 5 novembre m'avait échappé.


Bonsoir Michel,
Je mettrais tout cela sur la FAQ !?
Daniel

"Michel Gaboly" a écrit dans le message de news:

| Bonjour,
|
| J'ai découvert hier une astuce facilitant le report de dates entre
classeurs


| n'utilisant pas le même calendrier. Je ne crois pas qu'ele soit sur
Excelabo.


|
| 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 "¡ + 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
| http://www.gaboly.com
|
|


--
Cordialement,

Michel Gaboly
http://www.gaboly.com





--
Cordialement,

Michel Gaboly
http://www.gaboly.com