Je viens de découvrir un bug lié aux options de classeur 1900/1904 ;-((
Je viens de découvrir un bug lié aux options de classeur 1900/1904 ;-((
Je viens de découvrir un bug lié aux options de classeur 1900/1904 ;-((
Salut Michel,
Je viens de découvrir un bug lié aux options de classeur 1900/1904 ;-((
Il n'y a pas véritablement de bug.
VBA fonctionne avec SON propre système de représentation des dates (qui vont au
delà de 1900, soit dit en passant).
Pour une même date donnée D (important), le VBA.Weekday(D,1) te retournera
TOUJOURS le même nombre (de 1 à 7) PEU IMPORTE tes options de calendrier.
Pour t'en convaincre:
En A1: ÚTE(2003;12;1)
Sub Test
Dim d as Date
d = Range("A1")
MsgBox Weekday(d)
End Sub
Si tu alternes entre calendriers 1900/1904 et tu roules la proc, tu obtiens
toujours 2 (un Lundi). CQFD.
Évidemment, si tu mets ta date en dur, le changement de calendrier fera VARIER
cette date et la fonction weekday te retournera un chiffre différent.
Salutations,
Daniel M.
Salut Michel,
Je viens de découvrir un bug lié aux options de classeur 1900/1904 ;-((
Il n'y a pas véritablement de bug.
VBA fonctionne avec SON propre système de représentation des dates (qui vont au
delà de 1900, soit dit en passant).
Pour une même date donnée D (important), le VBA.Weekday(D,1) te retournera
TOUJOURS le même nombre (de 1 à 7) PEU IMPORTE tes options de calendrier.
Pour t'en convaincre:
En A1: ÚTE(2003;12;1)
Sub Test
Dim d as Date
d = Range("A1")
MsgBox Weekday(d)
End Sub
Si tu alternes entre calendriers 1900/1904 et tu roules la proc, tu obtiens
toujours 2 (un Lundi). CQFD.
Évidemment, si tu mets ta date en dur, le changement de calendrier fera VARIER
cette date et la fonction weekday te retournera un chiffre différent.
Salutations,
Daniel M.
Salut Michel,
Je viens de découvrir un bug lié aux options de classeur 1900/1904 ;-((
Il n'y a pas véritablement de bug.
VBA fonctionne avec SON propre système de représentation des dates (qui vont au
delà de 1900, soit dit en passant).
Pour une même date donnée D (important), le VBA.Weekday(D,1) te retournera
TOUJOURS le même nombre (de 1 à 7) PEU IMPORTE tes options de calendrier.
Pour t'en convaincre:
En A1: ÚTE(2003;12;1)
Sub Test
Dim d as Date
d = Range("A1")
MsgBox Weekday(d)
End Sub
Si tu alternes entre calendriers 1900/1904 et tu roules la proc, tu obtiens
toujours 2 (un Lundi). CQFD.
Évidemment, si tu mets ta date en dur, le changement de calendrier fera VARIER
cette date et la fonction weekday te retournera un chiffre différent.
Salutations,
Daniel M.
Mes tests de ce matin faisaient intervenir 2 classeurs deifférents, un basé
sur 1900, l'autre sur 1904, avec dans chacun, dans la même cellule,
"1/12/2003", et Weekdays me renvoyait la bonne valeur pour celui basé
sur 1900 et pas pour l'autre.
Mes tests de ce matin faisaient intervenir 2 classeurs deifférents, un basé
sur 1900, l'autre sur 1904, avec dans chacun, dans la même cellule,
"1/12/2003", et Weekdays me renvoyait la bonne valeur pour celui basé
sur 1900 et pas pour l'autre.
Mes tests de ce matin faisaient intervenir 2 classeurs deifférents, un basé
sur 1900, l'autre sur 1904, avec dans chacun, dans la même cellule,
"1/12/2003", et Weekdays me renvoyait la bonne valeur pour celui basé
sur 1900 et pas pour l'autre.
Salut Michel,Mes tests de ce matin faisaient intervenir 2 classeurs deifférents, un basé
sur 1900, l'autre sur 1904, avec dans chacun, dans la même cellule,
"1/12/2003", et Weekdays me renvoyait la bonne valeur pour celui basé
sur 1900 et pas pour l'autre.
Si tu as vraiment 2 classeurs avec la MÊME date (et des calendriers différents)
et que VBA.Weekday() retourne deux valeurs différentes, envoie-les moi, je veux
voir ça!
Tu remplaces 'prenom' par daniel et tu enlèves '.inutil' dans le nom de domaine.
Salutations,
Daniel M.
Salut Michel,
Mes tests de ce matin faisaient intervenir 2 classeurs deifférents, un basé
sur 1900, l'autre sur 1904, avec dans chacun, dans la même cellule,
"1/12/2003", et Weekdays me renvoyait la bonne valeur pour celui basé
sur 1900 et pas pour l'autre.
Si tu as vraiment 2 classeurs avec la MÊME date (et des calendriers différents)
et que VBA.Weekday() retourne deux valeurs différentes, envoie-les moi, je veux
voir ça!
Tu remplaces 'prenom' par daniel et tu enlèves '.inutil' dans le nom de domaine.
Salutations,
Daniel M.
Salut Michel,Mes tests de ce matin faisaient intervenir 2 classeurs deifférents, un basé
sur 1900, l'autre sur 1904, avec dans chacun, dans la même cellule,
"1/12/2003", et Weekdays me renvoyait la bonne valeur pour celui basé
sur 1900 et pas pour l'autre.
Si tu as vraiment 2 classeurs avec la MÊME date (et des calendriers différents)
et que VBA.Weekday() retourne deux valeurs différentes, envoie-les moi, je veux
voir ça!
Tu remplaces 'prenom' par daniel et tu enlèves '.inutil' dans le nom de domaine.
Salutations,
Daniel M.
Je te confirme l'existence du bug.
Je te confirme l'existence du bug.
Je te confirme l'existence du bug.
Michel,Je te confirme l'existence du bug.
Le "vraiment" visait à ce que tu t'en tiennes à l'exemple le plus simple (deux
dates identiques dans 2 classeurs) de façon à ce qu'on ne s'égare pas dans les
programmes. Comme c'est le cas ici. ;-)
Car, en _toute logique_, pour prétendre qu'il y a un bug dans VBA.Weekday selon
les
calendriers, il faudrait que le simple test que je t'ai proposé échoue. Or, il
fonctionne très bien. N'est-ce pas? ;-)
Donc, regardons du côté de ta proc événementielle Calculate.
Parce que VBA a son propre système de date, il lui faut interpréter les dates
correctement selon les différents classeurs.
En formattant des nombres en String "Lu", "Ma" etc., tu ne permets pas à VBA de
traiter les entrées de la ligne 3 en date: ceci est fondamental (IsDate sur les
entrées Dates retourne False).
Il les interprète en nombre (et son système est compatible 1900) ce qui donne
rigoureusement 1999-11-30 pour B3 (vérifie par une instruction VBA.Format()).
Avec ce petit changement (récupère la valeur à partir de la ligne 1, qui elle
est formattée en Date), cela baigne :
Application.WorksheetFunction.Index(Mat, Weekday(c(-1, 1), 2))
C'est pas un bug : c'est le comportement attendu de VBA au complet (Weekday
compris). Parce que les systèmes 1900 et 1904 sont incompatibles au niveau des
nombres, il lui faut un critère pour savoir si une cellule représente une date
ou un simple nombre (pour faire les corrections appropriées selon les
calendriers), IsDate() donne ce critère. Ton formatage en ligne 3 rend cette
différence impossible à déterminer.
Tu peux toujours utiliser MOD 7, qui lui traite toujours son argument comme un
nombre (mais là, ça devient beaucoup plus compliqué pour d'autres calculs
calendaires).
Une autre solution consiste à s'acheter un VRAI micro et à travailler en
calendrier 1900. :-))
Salutations,
Daniel M.
Michel,
Je te confirme l'existence du bug.
Le "vraiment" visait à ce que tu t'en tiennes à l'exemple le plus simple (deux
dates identiques dans 2 classeurs) de façon à ce qu'on ne s'égare pas dans les
programmes. Comme c'est le cas ici. ;-)
Car, en _toute logique_, pour prétendre qu'il y a un bug dans VBA.Weekday selon
les
calendriers, il faudrait que le simple test que je t'ai proposé échoue. Or, il
fonctionne très bien. N'est-ce pas? ;-)
Donc, regardons du côté de ta proc événementielle Calculate.
Parce que VBA a son propre système de date, il lui faut interpréter les dates
correctement selon les différents classeurs.
En formattant des nombres en String "Lu", "Ma" etc., tu ne permets pas à VBA de
traiter les entrées de la ligne 3 en date: ceci est fondamental (IsDate sur les
entrées Dates retourne False).
Il les interprète en nombre (et son système est compatible 1900) ce qui donne
rigoureusement 1999-11-30 pour B3 (vérifie par une instruction VBA.Format()).
Avec ce petit changement (récupère la valeur à partir de la ligne 1, qui elle
est formattée en Date), cela baigne :
Application.WorksheetFunction.Index(Mat, Weekday(c(-1, 1), 2))
C'est pas un bug : c'est le comportement attendu de VBA au complet (Weekday
compris). Parce que les systèmes 1900 et 1904 sont incompatibles au niveau des
nombres, il lui faut un critère pour savoir si une cellule représente une date
ou un simple nombre (pour faire les corrections appropriées selon les
calendriers), IsDate() donne ce critère. Ton formatage en ligne 3 rend cette
différence impossible à déterminer.
Tu peux toujours utiliser MOD 7, qui lui traite toujours son argument comme un
nombre (mais là, ça devient beaucoup plus compliqué pour d'autres calculs
calendaires).
Une autre solution consiste à s'acheter un VRAI micro et à travailler en
calendrier 1900. :-))
Salutations,
Daniel M.
Michel,Je te confirme l'existence du bug.
Le "vraiment" visait à ce que tu t'en tiennes à l'exemple le plus simple (deux
dates identiques dans 2 classeurs) de façon à ce qu'on ne s'égare pas dans les
programmes. Comme c'est le cas ici. ;-)
Car, en _toute logique_, pour prétendre qu'il y a un bug dans VBA.Weekday selon
les
calendriers, il faudrait que le simple test que je t'ai proposé échoue. Or, il
fonctionne très bien. N'est-ce pas? ;-)
Donc, regardons du côté de ta proc événementielle Calculate.
Parce que VBA a son propre système de date, il lui faut interpréter les dates
correctement selon les différents classeurs.
En formattant des nombres en String "Lu", "Ma" etc., tu ne permets pas à VBA de
traiter les entrées de la ligne 3 en date: ceci est fondamental (IsDate sur les
entrées Dates retourne False).
Il les interprète en nombre (et son système est compatible 1900) ce qui donne
rigoureusement 1999-11-30 pour B3 (vérifie par une instruction VBA.Format()).
Avec ce petit changement (récupère la valeur à partir de la ligne 1, qui elle
est formattée en Date), cela baigne :
Application.WorksheetFunction.Index(Mat, Weekday(c(-1, 1), 2))
C'est pas un bug : c'est le comportement attendu de VBA au complet (Weekday
compris). Parce que les systèmes 1900 et 1904 sont incompatibles au niveau des
nombres, il lui faut un critère pour savoir si une cellule représente une date
ou un simple nombre (pour faire les corrections appropriées selon les
calendriers), IsDate() donne ce critère. Ton formatage en ligne 3 rend cette
différence impossible à déterminer.
Tu peux toujours utiliser MOD 7, qui lui traite toujours son argument comme un
nombre (mais là, ça devient beaucoup plus compliqué pour d'autres calculs
calendaires).
Une autre solution consiste à s'acheter un VRAI micro et à travailler en
calendrier 1900. :-))
Salutations,
Daniel M.
Je ne suis pas d'accord avec toi ;-))
Pas de problème.
Si cela te convient mieux, disons que c'est la
confirmation de la faiblesse d'Excel
à manipuler les dates formatées (vieux problème (antérieur à VBA) des
recherches qui fonctionnent sur une date non formatée, mais qui échouent en
cas de formatage).
L'un des principes de base des tableurs, non respecté ici, est que la valeur
d'une
cellule est indépendante de de son formatage.
Que le IsDate renvoie une information qui varie en fonction du formatage de la
cellule ne paraît pas vraiment satisfaisant ;-))
Surtout quand la cellule contient
la formule "±", et que B1 est formatée en date.
Que le problème ne survienne qu'avec les classeurs ayant un calendrier basé
sur
1904 n'est pas plus satisfaisant.
Si la contrainte est liée à l'existence des
2 types de calendrier, il faut les unifier
et proposer un outil pour traiter les classeurs lors
d'un changement de version
Quant au concept de VRAI micro, ...
... *n
Je ne suis pas d'accord avec toi ;-))
Pas de problème.
Si cela te convient mieux, disons que c'est la
confirmation de la faiblesse d'Excel
à manipuler les dates formatées (vieux problème (antérieur à VBA) des
recherches qui fonctionnent sur une date non formatée, mais qui échouent en
cas de formatage).
L'un des principes de base des tableurs, non respecté ici, est que la valeur
d'une
cellule est indépendante de de son formatage.
Que le IsDate renvoie une information qui varie en fonction du formatage de la
cellule ne paraît pas vraiment satisfaisant ;-))
Surtout quand la cellule contient
la formule "±", et que B1 est formatée en date.
Que le problème ne survienne qu'avec les classeurs ayant un calendrier basé
sur
1904 n'est pas plus satisfaisant.
Si la contrainte est liée à l'existence des
2 types de calendrier, il faut les unifier
et proposer un outil pour traiter les classeurs lors
d'un changement de version
Quant au concept de VRAI micro, ...
... *n
Je ne suis pas d'accord avec toi ;-))
Pas de problème.
Si cela te convient mieux, disons que c'est la
confirmation de la faiblesse d'Excel
à manipuler les dates formatées (vieux problème (antérieur à VBA) des
recherches qui fonctionnent sur une date non formatée, mais qui échouent en
cas de formatage).
L'un des principes de base des tableurs, non respecté ici, est que la valeur
d'une
cellule est indépendante de de son formatage.
Que le IsDate renvoie une information qui varie en fonction du formatage de la
cellule ne paraît pas vraiment satisfaisant ;-))
Surtout quand la cellule contient
la formule "±", et que B1 est formatée en date.
Que le problème ne survienne qu'avec les classeurs ayant un calendrier basé
sur
1904 n'est pas plus satisfaisant.
Si la contrainte est liée à l'existence des
2 types de calendrier, il faut les unifier
et proposer un outil pour traiter les classeurs lors
d'un changement de version
Quant au concept de VRAI micro, ...
... *n
Salut Michel,Je ne suis pas d'accord avec toi ;-))
Pas de problème.Si cela te convient mieux, disons que c'est la
confirmation de la faiblesse d'Excel
à manipuler les dates formatées (vieux problème (antérieur à VBA) des
recherches qui fonctionnent sur une date non formatée, mais qui échouent en
cas de formatage).
Avoir et maintenir 2 systèmes de représentation impose de faire des choix assez
difficiles (quand est-ce qu'une entrée numérique constitue une date ou non?)
lors des différentes opérations numériques sur celles-ci (addition,
soustraction) dans le language de programmation (VBA).
Je trouve plus problématique les incapacités des recherches de dates avec .Find
(selon les formats).L'un des principes de base des tableurs, non respecté ici, est que la valeur
d'unecellule est indépendante de de son formatage.
Un bon point: l'interprétation par VBA met à mal ce principe.
Mais:
1-Elle est indépendante au niveau de la feuille de calcul: JOURSEM(B3;2)
retourne la bonne info.
2-Sans vouloir t'offusquer, les exemples fournis ne sont pas si fréquents que
ça. Il arrive rarement qu'on formate une date en une string comme "Lun". On
passe par TEXTE() habituellement.
Quoiqu'il en soit, il est vrai que l'interprétation par VBA requiert certaines
précautions (prudence si on formate une date sous un format non-date).
Que le IsDate renvoie une information qui varie en fonction du formatage de la
cellule ne paraît pas vraiment satisfaisant ;-))
Surtout quand la cellule contient
la formule "±", et que B1 est formatée en date.
Le rôle de IsDate() est strictement d'essayer de savoir si la cellule est une
date ou autre chose. Dans le système d'Excel, en présence d'un _nombre_, la
seule autre info disponible pour savoir si le système a affaire à une date est
le format. Sauf au moment de la saisie: et là, s'il n'y a pas eu préformatage,
on est correct.Que le problème ne survienne qu'avec les classeurs ayant un calendrier basé
sur1904 n'est pas plus satisfaisant.
Si la contrainte est liée à l'existence des
2 types de calendrier, il faut les unifier
et proposer un outil pour traiter les classeurs lors
d'un changement de version
D'accord.
Même si l'outil de conversion se heurterait aux mêmes problèmes que VBA
(difficultés à reconnaître de façon 100% précise, les dates d'un classeur): mais
c'est vrai que ça serait un 'one-time operation' (au moment de la conversion).
Quant au concept de VRAI micro, ...
... *n
Une corde sensible? ;-) Les propriétaires de Mac sont tellement susceptibles
;-))
Salutations,
Daniel M.
Salut Michel,
Je ne suis pas d'accord avec toi ;-))
Pas de problème.
Si cela te convient mieux, disons que c'est la
confirmation de la faiblesse d'Excel
à manipuler les dates formatées (vieux problème (antérieur à VBA) des
recherches qui fonctionnent sur une date non formatée, mais qui échouent en
cas de formatage).
Avoir et maintenir 2 systèmes de représentation impose de faire des choix assez
difficiles (quand est-ce qu'une entrée numérique constitue une date ou non?)
lors des différentes opérations numériques sur celles-ci (addition,
soustraction) dans le language de programmation (VBA).
Je trouve plus problématique les incapacités des recherches de dates avec .Find
(selon les formats).
L'un des principes de base des tableurs, non respecté ici, est que la valeur
d'une
cellule est indépendante de de son formatage.
Un bon point: l'interprétation par VBA met à mal ce principe.
Mais:
1-Elle est indépendante au niveau de la feuille de calcul: JOURSEM(B3;2)
retourne la bonne info.
2-Sans vouloir t'offusquer, les exemples fournis ne sont pas si fréquents que
ça. Il arrive rarement qu'on formate une date en une string comme "Lun". On
passe par TEXTE() habituellement.
Quoiqu'il en soit, il est vrai que l'interprétation par VBA requiert certaines
précautions (prudence si on formate une date sous un format non-date).
Que le IsDate renvoie une information qui varie en fonction du formatage de la
cellule ne paraît pas vraiment satisfaisant ;-))
Surtout quand la cellule contient
la formule "±", et que B1 est formatée en date.
Le rôle de IsDate() est strictement d'essayer de savoir si la cellule est une
date ou autre chose. Dans le système d'Excel, en présence d'un _nombre_, la
seule autre info disponible pour savoir si le système a affaire à une date est
le format. Sauf au moment de la saisie: et là, s'il n'y a pas eu préformatage,
on est correct.
Que le problème ne survienne qu'avec les classeurs ayant un calendrier basé
sur
1904 n'est pas plus satisfaisant.
Si la contrainte est liée à l'existence des
2 types de calendrier, il faut les unifier
et proposer un outil pour traiter les classeurs lors
d'un changement de version
D'accord.
Même si l'outil de conversion se heurterait aux mêmes problèmes que VBA
(difficultés à reconnaître de façon 100% précise, les dates d'un classeur): mais
c'est vrai que ça serait un 'one-time operation' (au moment de la conversion).
Quant au concept de VRAI micro, ...
... *n
Une corde sensible? ;-) Les propriétaires de Mac sont tellement susceptibles
;-))
Salutations,
Daniel M.
Salut Michel,Je ne suis pas d'accord avec toi ;-))
Pas de problème.Si cela te convient mieux, disons que c'est la
confirmation de la faiblesse d'Excel
à manipuler les dates formatées (vieux problème (antérieur à VBA) des
recherches qui fonctionnent sur une date non formatée, mais qui échouent en
cas de formatage).
Avoir et maintenir 2 systèmes de représentation impose de faire des choix assez
difficiles (quand est-ce qu'une entrée numérique constitue une date ou non?)
lors des différentes opérations numériques sur celles-ci (addition,
soustraction) dans le language de programmation (VBA).
Je trouve plus problématique les incapacités des recherches de dates avec .Find
(selon les formats).L'un des principes de base des tableurs, non respecté ici, est que la valeur
d'unecellule est indépendante de de son formatage.
Un bon point: l'interprétation par VBA met à mal ce principe.
Mais:
1-Elle est indépendante au niveau de la feuille de calcul: JOURSEM(B3;2)
retourne la bonne info.
2-Sans vouloir t'offusquer, les exemples fournis ne sont pas si fréquents que
ça. Il arrive rarement qu'on formate une date en une string comme "Lun". On
passe par TEXTE() habituellement.
Quoiqu'il en soit, il est vrai que l'interprétation par VBA requiert certaines
précautions (prudence si on formate une date sous un format non-date).
Que le IsDate renvoie une information qui varie en fonction du formatage de la
cellule ne paraît pas vraiment satisfaisant ;-))
Surtout quand la cellule contient
la formule "±", et que B1 est formatée en date.
Le rôle de IsDate() est strictement d'essayer de savoir si la cellule est une
date ou autre chose. Dans le système d'Excel, en présence d'un _nombre_, la
seule autre info disponible pour savoir si le système a affaire à une date est
le format. Sauf au moment de la saisie: et là, s'il n'y a pas eu préformatage,
on est correct.Que le problème ne survienne qu'avec les classeurs ayant un calendrier basé
sur1904 n'est pas plus satisfaisant.
Si la contrainte est liée à l'existence des
2 types de calendrier, il faut les unifier
et proposer un outil pour traiter les classeurs lors
d'un changement de version
D'accord.
Même si l'outil de conversion se heurterait aux mêmes problèmes que VBA
(difficultés à reconnaître de façon 100% précise, les dates d'un classeur): mais
c'est vrai que ça serait un 'one-time operation' (au moment de la conversion).
Quant au concept de VRAI micro, ...
... *n
Une corde sensible? ;-) Les propriétaires de Mac sont tellement susceptibles
;-))
Salutations,
Daniel M.
Je crois qu'on a plus ou moins fait le tour de la question ;-))
fil initial; il s'agissait de quelqu'un qui avait une version d'Excel en
anglais,
mais voulait pouvoir afficher le jour de semaine sous la forme "Lu", "Ma", ...
TOUT EN VOULANT pouvoir continuer à faire des calculs de dates sur le contenu
des cellules.
Je crois qu'on a plus ou moins fait le tour de la question ;-))
fil initial; il s'agissait de quelqu'un qui avait une version d'Excel en
anglais,
mais voulait pouvoir afficher le jour de semaine sous la forme "Lu", "Ma", ...
TOUT EN VOULANT pouvoir continuer à faire des calculs de dates sur le contenu
des cellules.
Je crois qu'on a plus ou moins fait le tour de la question ;-))
fil initial; il s'agissait de quelqu'un qui avait une version d'Excel en
anglais,
mais voulait pouvoir afficher le jour de semaine sous la forme "Lu", "Ma", ...
TOUT EN VOULANT pouvoir continuer à faire des calculs de dates sur le contenu
des cellules.
Rebonsoir,
Mais la demande initiale ne l'était pas non plus ; je ne sais pas si tu as suivi le
fil initial; il s'agissait de quelqu'un qui avait une version d'Excel en anglais,
mais voulait pouvoir afficher le jour de semaine sous la forme "Lu", "Ma", ...
TOUT EN VOULANT pouvoir continuer à faire des calculs de dates sur le contenu
des cellules.
Rebonsoir,
Mais la demande initiale ne l'était pas non plus ; je ne sais pas si tu as suivi le
fil initial; il s'agissait de quelqu'un qui avait une version d'Excel en anglais,
mais voulait pouvoir afficher le jour de semaine sous la forme "Lu", "Ma", ...
TOUT EN VOULANT pouvoir continuer à faire des calculs de dates sur le contenu
des cellules.
Rebonsoir,
Mais la demande initiale ne l'était pas non plus ; je ne sais pas si tu as suivi le
fil initial; il s'agissait de quelqu'un qui avait une version d'Excel en anglais,
mais voulait pouvoir afficher le jour de semaine sous la forme "Lu", "Ma", ...
TOUT EN VOULANT pouvoir continuer à faire des calculs de dates sur le contenu
des cellules.