Excel VBA日期将减去一天

spl*_*ena 2 excel vba 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
Run Code Online (Sandbox Code Playgroud)

格式格式: Custom dd/mm

示例:在单元格J3中,它包含1/1/1900但J3值在组合框中显示12/31/1899,最后一项将显示30/1/1900.我期待组合框将包含191年1月1日 - 19/1/1900的日期,如果选择1月等等.

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

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

Com*_*ern 5

问题是VBA如何存储日期和时间 - 它们实际上是整数部分的双打数,作为自18/31/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
Run Code Online (Sandbox Code Playgroud)

解决方案(虽然令人讨厌)是使用单元格的文本并将其转换为日期(除非您只需要字符串,在这种情况下根本不要将其强制转换):

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

在193年3月3日之前,日期演员不可逆转的更多诡计示范代码:

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
Run Code Online (Sandbox Code Playgroud)

  • 我在Access数据库应用程序中遇到类似的日期问题.浮点(双精度)值的舍入导致两个具有相同"日期"的日期被评估为不相等.我唯一的解决方案是将原生`Date`字段转换为内部`String`然后再转换为`Date`以强制等效.有时我只是将日期作为字符串进行比较. (2认同)