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,最后一项将显示为30/1/1900。我期待组合框将包含191年1月1日 - 19/1/1900的日期,如果选择1月等等。
我已尝试打印个别值MsgBox (dt.Range("J3").Value)
,但它给了我12/31/1899但该单元格的内容是1/1/1900。
*注意我没有任何会改变单元格内容的代码。
答案 0 :(得分: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
解决方案(虽然令人讨厌)是使用单元格的 文本 并将其投射到某个日期(除非你只需要字符串,在这种情况下不要总而言之:)
For Each ICell In dt.Range(strStart & "3 : " & strEnd & "3")
Me.cboStartDate.AddItem CDate(ICell.Text)
Next ICell
在19/3/19之前,日期演员不可逆转的更多诡计示范代码:
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