【问题标题】:Excel VBA DO loop to scan range of dates and fill in missing datesExcel VBA DO循环扫描日期范围并填写缺失的日期
【发布时间】:2015-01-14 12:42:05
【问题描述】:

我有一个包含约 20,000 行数据的工作表。每行在 C 列中都有一个交易日期。每个工作表将仅包含上个月的数据。我想要发生的事情是循环遍历每个日期并确保没有丢失日期,如果缺少日期,我需要循环将丢失的日期插入新行。我在网上找到了这个,并尝试将它定制到我的工作表中,但无法让它工作:

 Dim i As Long:  i = 1
 'Adds missing dates as new rows
 Do
 If Cells(i + 1, "C") > Cells(i, "C") + 1 Then
      Rows(i + 1).Insert xlShiftDown
      Cells(i + 1, "C") = Cells(i, "C") + 1
 End If
 i = i + 1
 Loop Until Cells(i + 1, "C") = ""

我有一堆不同的宏,它们将数据格式化为表格,然后按交易日期对其进行排序。我不确定该表是否会产生另一个问题,但我似乎无法让它工作。

非常感谢任何提示!

【问题讨论】:

  • C 列的值是唯一的吗?即每一行都有不同的日期?是在谈论工作日还是工作日?
  • 不,C中的值不是唯一的,有很多重复的日期。它们最多只跨越 31 天,因此每个日期都有成百上千的记录。它们是一周中的几天(全部 7 天)。

标签: date loops excel excel-2010 vba


【解决方案1】:

给使用此代码的任何人的注意事项 - 您必须对日期进行格式化,以便在个位数月份(即 1 月 - 例如“1/1/17”)中,您的月份前面有一个零,使其成为两位数(即 2017 年 1 月 1 日)。除非您这样做,否则代码将不起作用。在excel主页的“更多数据格式”下有一个数据类型,它将在一位数月份前包含零。感谢您的代码,它对我帮助很大!

【讨论】:

    【解决方案2】:

    从如下所示的数据开始:


    运行此代码以自下而上循环日期并插入缺失的行。

    Sub insertMissingDate()
        Dim wks As Worksheet
        Set wks = Worksheets("Sheet1")
    
        Dim lastRow As Long
        lastRow = wks.Range("C2").End(xlDown).Row
    
        'Work bottom up since we are inserting new rows
        For i = lastRow To 3 Step -1
            curcell = wks.Cells(i, 3).Value
            prevcell = wks.Cells(i - 1, 3).Value
    
            'Using a loop here allows us to bridge a gap of multiple missing dates
            Do Until curcell - 1 = prevcell Or curcell = prevcell
                'Insert new row
                wks.Rows(i).Insert xlShiftDown
    
                'Insert missing date into new row
                curcell = wks.Cells(i + 1, 3) - 1
                wks.Cells(i, 3).Value = curcell
            Loop
        Next i
    End Sub
    

    结果:

    【讨论】:

    • +1 表示插入时从底部开始的工作。记住总是一件好事
    • 这看起来很棒。当我阅读它时,它似乎将每个单元格与前一个单元格进行比较,当前一个单元格与当前单元格相同时会发生什么?许多日期都重复了数百/数千次?
    • 这将创建一个无限循环。我已经更新了答案以包含和OR 语句检查日期是否相等。只要对日期进行排序,这应该可以解决问题。
    • This: Do Until curcell - 1 <= prevcell 也可以解决这个问题,而不是使用 OR
    • 这太棒了!谢谢你。我已经用几个月不同的方式对其进行了测试,它几乎可以完美运行。我唯一的问题是:如果缺少该月的最后一天,它不会填写它。无论如何它也可以插入它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多