2016-04-02 20 views
9

enter image description herePerché la data restituisce "31-12-1899" quando 1 viene passato ad esso?

Sto usando Windows 10 OS eccellono 13 così nel seguente codice 1 dovrebbe restituire 1/1/1900 giusto? al di sotto non si spiega perché.

su this domanda OP passato 2016 e ottenuto lo stesso risultato, ho ottenuto così se c'è qualche errore perché ho ottenuto lo stesso risultato di OP quando ho passato 2016?

Sub ndat() 

Dim dt As Date 
dt = 2016 
Debug.Print "dt is " & dt 

End Sub 

enter image description here

+0

Poiché la data di base (data zero) in tutte le applicazioni MS Office è 12-30-1899 e l'aggiunta di 1 a tale data risulta in 12 -31-1899. (Puoi verificarlo da solo inserendo 0 in una cella di Excel e formattandolo come data.) –

+0

@KenWhite allora perché MacroMan ha ottenuto 1/1/1900 [qui] (http://stackoverflow.com/questions/36375368/ simple-why-is-my-msgbox-not-return-the-current-year? noredirect = 1 # comment60374031_36375368) nei commenti. Inoltre puoi fare '? CDate (1)' sul tuo sistema e dirmi cosa ottieni? – newguy

+0

@KenWhite è corretto sulla data di epoca - puoi leggere su * perché * [qui] (https://blogs.msdn.microsoft.com/ericlippert/2003/09/16/erics-complete-guide-to-vt_date /) – Comintern

risposta

5

interi e date map in modo diverso in VBA che nel foglio di lavoro. Per esempio:

Sub marine() 
    Dim i As Integer, d As Date 
    Dim mgs As String 

    msg = "" 
    For i = -10 To 10 
     d = CDate(i) 
     msg = msg & i & vbTab & Format(d, "mm/dd/yyyy") & vbCrLf 
    Next i 

    MsgBox msg 
End Sub 

produce:

enter image description here

Nota è possibile ottenere le date prima 1/1/1900

EDIT # 1:

Questo può aiutare a capire la differenza. Ho inserito alcuni numeri interi nella colonna A.

In B1, ho inserito =A1 e la copia. Formattare la colonna B da visualizzare nel formato data.

Io uso questo UDF():

Public Function VBA_Date(i As Long) As String 
    VBA_Date = Format(CDate(i), "mm/dd/yyyy") 
End Function 

Per riempire colonna C:

enter image description here

nota la transizione tra le righe # 19 e # 20

+0

Non è una mia domanda, ma lo sai * perché * le date zero sono diverse? Penso che sia la vera carne in questo panino. –

+0

@MacroMan Non è solo la data zero! –

+0

Frase errata da parte mia - Voglio dire * perché * è la mappatura dei numeri interi tra il foglio di lavoro e VBA? –

3

E ' solo il foglio di lavoro stesso. O per essere corretto: la funzionalità del foglio di lavoro!

prova rapida:

?cdate(1) 
1899-12-31 
?format(1,"YYYY-MM-DD") 
1899-12-31 
?worksheetfunction.Text(1,"YYYY-MM-DD") 
1900-01-01 

Ma andando per la data di oggi non mostra questa lacuna:

?clng(now) 
42463 
?worksheetfunction.Text(now,"0") 
42463 

Ciò dimostra che da qualche parte tra 1 e 42463 è un gap (il controllo di loto veloce mostra che :

?cdate(60) & " --- " & cdate(61) 
1900-02-28 --- 1900-03-01 
?format(60,"YYYY-MM-DD") & " --- " & format(61,"YYYY-MM-DD") 
1900-02-28 --- 1900-03-01 
?worksheetfunction.Text(60,"YYYY-MM-DD") & " --- " & worksheetfunction.Text(61,"YYYY-MM-DD") 
1900-02-29 --- 1900-03-01 

Solo un ultimo test per vederlo di nuovo:

01.235.164,106174 millions
?format("1900-02-28","0") & " --- " & format("1900-03-01","0") 
60 --- 61 
?worksheetfunction.Text("1900-02-28","0") & " --- " & worksheetfunction.Text("1900-03-01","0") 
59 --- 61 

a partire da 61, c'è semplicemente una differenza di numeri. Ma il Lotus-Bug aggiunge il 1900-02-29 per "compatibilità".

Inoltre: questa è una "funzionalità" per Excel e non ha nulla a che fare con base, vbscript, vba .......... Tutti gli altri programmi funzionano nel modo corretto e otterrebbero molti problemi se VBA non lo farebbe. Quindi per "compatibilità" il VBA in Excel lo fa nel modo corretto;)

Problemi correlati