我有一列长度未知(Q 列),我想在此列中找到最早和最晚的日期。第一个条目在单元格“Q2”中。日期不是按时间顺序排列的,所以我不能简单地看第一行和最后一行。此外,我想将两个日期之间的所有月份粘贴到新的工作表中。我试图找到最早和最晚的日期,但我已经在为代码苦苦挣扎。这是我的代码的摘录:
Dim SDate As Date, LDate As Date
Dim last_row As Long
Dim LastCell As String
last_row = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
LastCell = "Q" & last_row
Worksheets("Sheet1").Select
SDate = WorksheetFunction.Min(Range("Q2:LastCell"))
EDate = WorksheetFunction.Max(Range("Q2:LastCell"))
它告诉我它不能将 LastCell 值识别为 Range 的输入。 [Sheet1 中的日期格式为 dd.mm.yyyy]作为 Sheet2 中的输出,我希望它看起来像这样(从单元格 D2 开始):
谁能帮我吗?
我对 VBA 很陌生
先感谢您
山姆
最佳答案
由于 Excel 自动将我的输出格式化为 "yyyy/mm/d"
,我发现这有点困难。但是通过使用 Range.Value2
克服了这个问题属性而不是 Value
.
相关文件:
Sub ShowMonthsBetweenTwoDates()
Dim DatesArray As Variant
Dim StartDate As Date: StartDate = Range("C1")
Dim EndDate As Date: EndDate = Range("C2")
Dim Iteration As Long
Dim Years As Long
Dim Months As Long
Dim TotalMonths As Long
Months = (Month(EndDate) - Month(StartDate))
Years = (Year(EndDate) - Year(StartDate)) * 12
TotalMonths = (Months + Years)
ReDim DatesArray(TotalMonths)
For Iteration = LBound(DatesArray) To UBound(DatesArray)
If WorksheetFunction.EDate(StartDate, Iteration) <= EndDate Then
DatesArray(Iteration) = WorksheetFunction.EDate(StartDate, Iteration)
End If
Next Iteration
Iteration = 0
Dim DestinationRange As Range
Set DestinationRange = Range("E1").Resize(1, TotalMonths + 1)
DestinationRange.NumberFormat = "mmm-yy"
DestinationRange.Value2 = DatesArray
End Sub
这个子:样本工作表数据测试:
和输出:
笔记:
您可能需要进行一些测试并修改计算/if 语句评估,因为我没有测试所有可能的日期场景 - 我使用的计算可能存在一些差异(例如结束日期少 1 天)然后是检查日期的日期)但又一次 - 这还没有经过测试。
此解决方案允许您获取开始和结束日期并将所需格式输出到范围。
注意 注意:
使用
Value2
如果在任何计算/评估中使用输出数据,可能会产生意想不到的结果 - 如果您必须使用 Value
属性,并查找许多现有解决方案之一,以解决 excel 令人讨厌的日期自动格式化问题。
关于excel - 查找最早和最晚的日期并创建带有月份的时间表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68097630/