Excel VBAdate正在减去一天

Private Sub cboMonth1_Change() Dim rng As Range Dim rngStart As Range Dim rngEnd As Range Dim dt As Worksheet Dim strStart As String Dim strEnd As String Dim ICell As Range Set dt = Worksheets("Sheet1") If Me.cboMonth1.Value = "January" Then Set rng = Range("J2") ElseIf Me.cboMonth1.Value = "February" Then Set rng = Range("AO2") End If If rng.MergeCells Then Set rng = rng.MergeArea Set rngStart = rng.Cells(1, 1) Set rngEnd = rng.Cells(rng.Rows.Count, rng.Columns.Count) strStart = Mid(rngStart.Address, 1, Len(rngStart.Address) - 1) strEnd = Mid(rngEnd.Address, 1, Len(rngEnd.Address) - 1) Me.cboStartDate.Clear For Each ICell In dt.Range(strStart & "3 : " & strEnd & "3") Me.cboStartDate.AddItem (ICell.Value) Next ICell Else MsgBox ("Not merge cells") End If End Sub 

单元格格式: Custom dd/mm

例如:在单元格J3中包含1/1/1900,但J3值显示12/31/1899在combobox中最后一个项目将显示30/1/1900。 我期望combobox将包含从1/1/1900 – 31/1/1900如果select1月等date。

我已经尝试打印单个值MsgBox (dt.Range("J3").Value)但它给了我12/31/1899,但该单元格的内容是1/1/1900。

*注意我没有任何代码会改变单元格的内容。

问题是VBA如何存储date和时间 – 实际上它们是整数部分的双倍数,是自18/18/1899以来的天数。 问题是,它只是不能正确工作天'0'和'1'。 我不确定这个问题是浮点精度还是在Excel-VBA转换中会丢失,但是您可以用下面的代码看到效果:

 Debug.Print Format(CDate(0), "dd/mm/yyyy") 'Outputs 12/30/1899 Debug.Print Format(CDate(1), "dd/mm/yyyy") 'Outputs 12/30/1899 Debug.Print Format(CDate(2), "dd/mm/yyyy") 'Outputs 01/01/1900 Debug.Print Format(CDate(3), "dd/mm/yyyy") 'Outputs 01/02/1900 

解决scheme(尽pipe令人讨厌)是使用单元格的文本并将其转换为date(除非您只需要string,在这种情况下根本不需要):

 For Each ICell In dt.Range(strStart & "3 : " & strEnd & "3") Me.cboStartDate.AddItem CDate(ICell.Text) Next ICell 

具有date不可逆转性的更多奇怪的演示代码在1/3/1900之前投射:

 Debug.Print CDate(ActiveSheet.Range("J3").Text) 'Outputs 01/01/1900 Debug.Print CDate(ActiveSheet.Range("J3").Value) 'Outputs 12/30/1899 Debug.Print CDbl(CDate(ActiveSheet.Range("J3").Text)) 'Outputs 2 Debug.Print CDbl(CDate(ActiveSheet.Range("J3").Value)) 'Outputs 1