2016-04-02 19 views
9

enter image description here1 Neden 1'e geçtiğinde tarih "31-12-1899" değerini döndürür?

Öyle aşağıdaki kod 1 sağ 1/1/1900 dönmelidir 10 OS 13 excel pencereleri kullanıyorum? onun altında değil neden.

this hakkında OP soru 2016 geçti ve aynı sonucu aldım bazı hata varsa neden OP 2016 geçtiğinde neden aynı sonucu aldım?

Sub ndat() 

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

End Sub 

enter image description here

+0

Tüm MS Office uygulamalarında temel tarih (tarih sıfırı) 12-30-1899 olduğundan ve bu tarihe 1 eklendiğinde 12 sonuçlanır. -31-1899. (Bunu bir Excel hücresine 0 koyarak ve bir tarih olarak biçimlendirerek kendiniz doğrulayabilirsiniz.) –

+0

@KenWhite o zaman neden MacroMan 1/1/1900 [buradan] aldı (http://stackoverflow.com/questions/36375368/ basit-neden-benim-msgbox-dönmeyen-geçerli yıl? noredirect = 1 # comment60374031_36375368) yorumlarda. Ayrıca sisteminizde CDate (1) 'yapabilir ve ne aldığınızı söyler misiniz? – newguy

+0

@KenWhite epoch tarihi hakkında doğrudur - hakkında bilgi alabilirsiniz * why * [here] (https://blogs.msdn.microsoft.com/ericlippert/2003/09/16/erics-complete-guide-to-vt_date /) – Comintern

cevap

5

Tamsayılar ve tarihler çalışma sayfasında daha VBA farklı harita. Örneğin:

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 

üretir:

Bu:

enter image description here

Not kala 1/1/1900

DÜZENLEME 1. tarihleri ​​alabilirsiniz farkı anlamaya yardımcı olabilir. A numaralı sütuna bazı tamsayılar koydum.

B1'da, =A1'u yerleştirin ve kopyalayın. Tarih biçiminde görüntülemek için sütun B'u biçimlendiriyorum.

enter image description here

Not sıraları arasındaki geçiş # 19 ve # 20

+0

Sorum yok, ama biliyor musunuz * neden * sıfır tarihleri ​​farklı? Bence bu sandviçteki gerçek et bu. –

+0

@MacroMan Bu sadece sıfır tarih değil! –

+0

Benim bölümümde kötü ifadeler - Yani * neden * çalışma sayfası ve VBA arasında farklı bir tamsayı haritalandırmasıdır? –

3

Bu:

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

doldurmak için kolon:

Bu UDF() kullanın sadece çalışma sayfasının kendisi. Ya da doğru olmak gerekirse: Çalışma sayfası işlevselliği!

Hızlı testi:

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

Ama bugünün tarih oluyor bu boşluğu görünmüyor:

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

yerde 1 ila 42.463 bir boşluk olduğunu göstermektedir (hızlı lotus çek bunu gösteriyor :

?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 

son bir deney tekrar görüntülemek için:

61 ile başlayan, artık sayılarda artık bir fark var. Ancak Lotus-Bug, "uyumluluk" için 1900-02-29'u ekler.

Ayrıca: excel için bir "özellik" dir ve temel, vbscript, vba .......... ile ilgisi yoktur. Diğer tüm programlar doğru şekilde çalışır ve çok fazla sorun olur eğer VBA olmazsa. Bu nedenle, "uyumluluk", VBA'da excel için doğru şekilde yapar;)

İlgili konular