Почему дата возвращает "31-12-1899", когда 1 передается ей?

enter image description here

я использую windows 10 OS excel 13, поэтому в приведенном ниже коде 1 должен возвратить 1/1/1900 верно ? ниже - не почему.

On этой вопрос OP прошел 2016 и получил тот же результат, что и я, поэтому, если есть какая-то ошибка, почему я получил тот же результат, что и OP, когда я прошел 2016 ?

Sub ndat()

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

End Sub

enter image description here

2 ответов


целые числа и даты отображаются в VBA по-разному, чем на листе. Например:

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

выдает:

enter image description here

Примечание Вы можете получить даты до 1/1/1900

правка#1:

Это может помочь понять разницу. Я поместил несколько целых чисел в столбец A.

на B1, я ставлю =A1 и скопировать вниз. Я колонки B для отображения в формат даты.

Я использую этот UDF ():

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

заполнить столбец C:

enter image description here

обратите внимание на переход между строками #19 и #20


это просто сам рабочий лист. Или, чтобы быть правильным: рабочий лист-функциональность!

быстрый тест:

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

но переход на сегодняшнюю дату не показывает этот пробел:

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

это показывает, что где-то между 1 и 42463 есть разрыв (быстрая проверка lotus показывает это:

?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

только один последний тест, чтобы показать это снова:

?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

начиная с 61, просто теперь разница в числах. Но Lotus-Bug добавляет 1900-02-29 для "совместимости".

также: это "функция" для excel и не имеет ничего общего с basic, vbscript, vba.......... Все остальные программы работают правильно, и у него будет много проблем, если VBA не будет. Поэтому для" совместимости " VBA в excel просто делает это правильно;)