2015-01-11 7 views
6

Quando uso il DateValue formula ("01/01/1900") ottengo 1 e formattato come una data che mostra come 01/01/1900Bug in VBA DateValue() in VBA Excel?

Quando uso VBA

.Range("A1").Value = DateValue("01/01/1900") 

mostra come "02/01/1900" nella cella

Come è possibile?

Se io uso per esempio

.Range("A1").Value = DateValue("01/01/1901") 

funziona benissimo!

Testa fusa !!!

Microsoft afferma che - "Utilizzo del sistema di data predefinito in Microsoft Excel per Windows, l'argomento DATE_TEXT deve rappresentare una data tra il 1 gennaio 1900 e il 31 dicembre 9999"

+0

[I giorni della settimana prima del 1 marzo 1900 sono errati in Excel] (http://support.microsoft.com/kb/214058/en-us) – GSerg

+3

possibile duplicato del [Perché i giorni feriali Excel sbagliato per 1900?] (http://superuser.com/questions/481496/why-are-excel-weekdays-wrong-for-1900) – GSerg

+1

il link dice WeekDay, non è sicuro perché questo influenzerebbe DateValue? anche la cella dice 02/01/1900 ma l'editor VBA dice 01/01/1900 sul tooltip ma in realtà è il 02/01/1900 che usa per il confronto - .Range ("A1"). Valore <> "02/01/1900" equivale come vero ma la cella dice 02/01/1900 - buggy as hell –

risposta

4

Insomma, DateTime epoca di Excel non è lo stesso del periodo DateTime di VBA. Anche se, sono lo stesso una volta passato il 28 febbraio 1900.

Da Joel Spolksy's blog:

Nella maggior parte dei moderni ambienti di programmazione, le date vengono memorizzate come veri numeri. La parte intera del numero è il numero di giorni dal una data concordata in passato, chiamata l'epoca. In Excel, di oggi data 16 giugno 2006, è conservato come 38884, contando giorni in cui Gennaio 1st, 1900 è pari a 1.

ho iniziato a lavorare attraverso le varie funzioni di data e ora in base e la data e l'ora funzioni in Excel, provando le cose, quando I notato qualcosa di strano nella documentazione di Visual Basic: Basic utilizza il 31 dicembre 1899 come epoca invece del 1 gennaio 1900, ma per qualche motivo, la data odierna era la stessa in Excel come era in di base.

Huh?

Sono andato a trovare uno sviluppatore di Excel che era abbastanza vecchio da ricordare perché. Ed Fries sembrava conoscere la risposta.

"Oh", mi ha detto. "Dai un'occhiata al 28 febbraio 1900."

"Sono 59", ho detto.

"Ora prova il 1 marzo."

"È 61!"

"Che cosa è successo a 60?" Ha chiesto Ed

"29 febbraio 1900 è stato un anno bisestile! È divisibile per 4!"

"Buona supposizione, ma nessun sigaro", disse Ed, e mi lasciò a chiedermi un mentre.

Oops. Ho fatto qualche ricerca.Gli anni divisibili per 100 non sono anni bisestili, a meno che non siano anche divisibili per 400.

Il 1900 non era un anno bisestile.

"È un bug in Excel!" Ho esclamato

"Beh, non proprio," disse Ed. "Dovevamo fare così perché abbiamo bisogno di per poter importare fogli di lavoro Lotus 123".

"Quindi, è un errore in Lotus 123?"

"Sì, ma probabilmente un uno intenzionale. Lotus ha dovuto adattarsi in 640K. Questo non è un sacco di memoria. Se si ignora 1900, si può capire se un dato anno è un anno bisestile solo guardando a vedere se i due bit più a destra di sono pari a zero.Questo è molto semplice e veloce.I tipi di Lotus probabilmente hanno pensato che non fosse sbagliato per quei due mesi in modo in passato. Sembra che i ragazzi di base volessero essere anali circa quei due mesi, così hanno spostato l'epoca un giorno indietro. "

"Aargh!" Ho detto, e sono andato a studiare perché c'era una casella di controllo nella finestra di dialogo delle opzioni chiamata Sistema data 1904.


Le informazioni qui di seguito è stato preso da this Super User answer.


come descritto nel Microsoft KB 214058:

Days of the week before March 1, 1900 are incorrect in Excel

Informazioni

Quando il sistema di data in Microsoft Excel è stato originariamente creato, è stato progettato per essere pienamente compatibile con la data sistemi utilizzati da altri programmi di fogli di calcolo.

Tuttavia, in questo sistema di data, l'anno 1900 viene erroneamente interpretato come anno bisestile. Poiché non esiste il 29 febbraio ("giorno bisestile") nell'anno 1900, il giorno della settimana per qualsiasi data precedente al 1 ° marzo 1900 (il giorno successivo al "giorno bisestile"), non viene calcolato correttamente.

Gli "altri programmi di foglio di calcolo" si riferiscono alle Lotus 1-2-3, che era molto popolare a quei tempi, e in modo non corretto presuppone che l'anno 1900 è stato un anno bisestile. Questo è spiegato ancora più in dettaglio in KB 214326:

Excel 2000 incorrectly assumes that the year 1900 is a leap year

Informazioni

Quando Lotus 1-2-3 è stato rilasciato, il programma presume che l'anno 1900 è stato un anno bisestile, anche se in realtà non era un anno bisestile. Ciò ha reso più facile per il programma gestire gli anni bisestili e non ha causato alcun danno a quasi tutti i calcoli di date in Lotus 1-2-3.

Quando Microsoft Multiplan e Microsoft Excel sono stati rilasciati, hanno anche ipotizzato che il 1900 fosse un anno bisestile.Questa supposizione consentiva a Microsoft Multiplan e Microsoft Excel di utilizzare lo stesso sistema di data seriale utilizzato da Lotus 1-2-3 e fornire una maggiore compatibilità con Lotus 1-2-3. Trattare il 1900 come anno bisestile ha anche reso più semplice per gli utenti spostare i fogli di lavoro da un programma all'altro.

Sebbene sia tecnicamente possibile correggere questo comportamento in modo che le versioni correnti di Microsoft Excel non presuppongano che 1900 sia un anno bisestile, gli svantaggi di farlo superano i vantaggi.

Se questo comportamento dovesse essere corretto, sorgerebbero molti problemi, tra cui le seguenti:

  • Quasi tutte le date in corrente fogli di lavoro di Microsoft Excel e altri documenti sarebbero diminuiti di un giorno. Correggere questo spostamento richiederebbe molto tempo e sforzi, specialmente nelle formule che usano le date.
  • Alcune funzioni, come la funzione WEEKDAY, restituiscono valori diversi; ciò potrebbe causare il malfunzionamento delle formule nei fogli di lavoro.
  • La correzione di questo comportamento interromperà la compatibilità della data seriale tra Microsoft Excel e altri programmi che utilizzano le date.

Se il comportamento rimane non corretta, solo un problema si verifica:

  • La funzione WEEKDAY restituisce valori non corretti per date precedenti 1 marzo 1900. Poiché la maggior parte degli utenti non utilizzano date prima del 1 marzo 1900, questo problema è raro.