excel - 查找最早和最晚的日期并创建带有月份的时间表

标签 excel vba

我有一列长度未知(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 开始):
Wanted Output
谁能帮我吗?
我对 VBA 很陌生
先感谢您
山姆

最佳答案

由于 Excel 自动将我的输出格式化为 "yyyy/mm/d",我发现这有点困难。但是通过使用 Range.Value2 克服了这个问题属性而不是 Value .
相关文件:

  • Range.Value2 (MS Documentation)
  • Range.Resize (MS Documentation)
  • Arrays and Ranges (cpearson.com)
  • For...Next (MS Documentation)
  • WorksheetFunction.EDate (MS Documentation)
  • 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
    
    这个子:
  • 使用日期作为单元格 C1 和 C2 的开始和结束,它们使用 MIN 和 MAX 函数来查找范围内的最低和最高日期(参见下面的示例屏幕截图)
  • 计算两个日期之间的月份。这是分两个步骤,几个月和几年来完成的,以考虑您的日期跨度中的多年。
  • 循环使用 EDate 检查日期是否 <= 结束日期,如果是,则将日期添加到数组中。
  • 定义一个目标范围(我使用单元格 E1 作为起点),然后将数组值写入该范围。

  • 样本工作表数据测试:
    Sample worksheet date range and data
    和输出:
    Sample output

    笔记:
    您可能需要进行一些测试并修改计算/if 语句评估,因为我没有测试所有可能的日期场景 - 我使用的计算可能存在一些差异(例如结束日期少 1 天)然后是检查日期的日期)但又一次 - 这还没有经过测试。
    此解决方案允许您获取开始和结束日期并将所需格式输出到范围。

    注意 注意:
    使用 Value2如果在任何计算/评估中使用输出数据,可能会产生意想不到的结果 - 如果您必须使用 Value属性,并查找许多现有解决方案之一,以解决 excel 令人讨厌的日期自动格式化问题。

    关于excel - 查找最早和最晚的日期并创建带有月份的时间表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68097630/

    相关文章:

    Excel VBA - 将单元格中的日期与当前日期进行比较

    excel - 表示 Access 或 Excel 的常量

    vba - VBA 上的线性同余生成器

    c# - Excel:取回选定的行

    Excel 选择案例?

    排序英式日期

    excel - 如何在 Excel 中一次替换多个字符串?

    vba - 多个单元格范围作为值

    excel - 使用宏刷新 Excel 工作簿中的所有数据透视表

    excel - 在 Visual Basic 中将整数打印为字符串