Excel VBA日期被减去一天

Excel VBA日期被减去一天,vba,excel,Vba,Excel,单元格格式:自定义dd/mm 示例:在单元格J3中,它包含1/1/1900,但J3值在组合框中显示12/31/1899,最后一项将显示30/1/1900。如果选择一月,我希望组合框将包含1900年1月1日到1900年1月31日的日期,以此类推 我曾尝试打印单个值MsgBox(dt.Range(“J3”).Value)但它给出了1899年12月31日,但该单元格的内容是1/1/1900 *注意,我没有任何代码会改变单元格的内容。问题在于VBA如何存储日期和时间-它们实际上是整数部分的两倍,即自18

单元格格式:
自定义dd/mm

示例:在单元格J3中,它包含1/1/1900,但J3值在组合框中显示12/31/1899,最后一项将显示30/1/1900。如果选择一月,我希望组合框将包含1900年1月1日到1900年1月31日的日期,以此类推

我曾尝试打印单个值
MsgBox(dt.Range(“J3”).Value)
但它给出了1899年12月31日,但该单元格的内容是1/1/1900


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

问题在于VBA如何存储日期和时间-它们实际上是整数部分的两倍,即自1899年12月31日以来的天数。问题是它在“0”和“1”天内无法正常工作。我不确定问题是浮点精度还是Excel VBA转换中丢失了什么,但您可以通过下面的代码看到效果:

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
解决方法(尽管令人讨厌)是使用单元格的文本并将其转换为日期(除非您只需要字符串,在这种情况下,根本不转换):

1900年1月3日之前日期转换的不可逆性的更多wierdness演示代码:

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

我在Access数据库应用程序中遇到了类似的日期问题。浮点(双精度)值的舍入导致具有相同“日期”的两个日期计算为不相等。我唯一的解决方案是将本机
日期
字段转换为内部
字符串
,然后返回到
日期
,以强制等效。有时我只是把日期作为字符串进行比较。
For Each ICell In dt.Range(strStart & "3 : " & strEnd & "3")
    Me.cboStartDate.AddItem CDate(ICell.Text)
Next ICell
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