【问题标题】:Insert Rows based on DateDiff (fill in inserted rows with dates)根据 DateDiff 插入行(用日期填充插入的行)
【发布时间】:2018-01-31 12:58:35
【问题描述】:

我正在使用来自this thread 的宏来插入新行

但问题是当 开始日期结束日期 相同时,我得到了

错误 1004

  • 您能否帮助修改 VBA 以跳过产生错误的那些行?
  • 是否有一种简单的方法可以在 B 列(标记为红色)中填写相应的日期以完成表格(每行一天)?

Start Date  End Date    Hours   Type
02-01-18    02-01-18    8   one day
04-01-18    04-01-18    4   half day
05-01-18    06-01-18    16  multiple days
07-01-18    10-01-18    16  multiple days
11-01-18    11-01-18    8   one day

更新:

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您可以使用 if 命令检查日期是否匹配,然后仅在不匹配时运行检查。代码现在将在开始日期和结束日期之间添加每个后续日期

    Public Sub AAA_Format()
    
    Dim i As Long
    Dim d As Long
    Dim LastRow As Long
    Dim j As Long
    Dim rng As Range, rng2 As Range
    Dim startrow As Long, insertedrow As Long
    Application.CutCopyMode = False
    
    With Worksheets("Data")
        LastRow = .UsedRange.Rows.Count
    
    
        For i = LastRow To 2 Step -1 '' starts at bottom and goes up, that way inserting rows doesn impact it
            'checks to see if 2 values are the same
            If Not Cells(i, "B") = Cells(i, "C") Then
            Debug.Print Cells(i, "B")
            Debug.Print Cells(i, "C")
    
                d = DateDiff("d", .Cells(i, "B"), .Cells(i, "C")) '' find differene
                 Debug.Print d
                  insertedrow = i + d
                .Rows(i + 1 & ":" & insertedrow).Insert Shift:=xlDown
            End If
    
            For j = 1 To d
                .Cells(i + j, 2) = .Cells((i + j) - 1, 2) + 1
                .Cells(i + j, 3) = "what ever you want to calc end date as"
                .Cells(i + j, 4) = "what ever you want to calc hours as"
                .Cells(i + j, 5) = "what ever you want to calc day as"
            Next j
    
        Next i
    
    End With
    
    End Sub
    

    要插入一列,您可以使用

    ActiveSheet.Range("D:D").EntireColumn.Insert
    

    并添加公式,你可以使用

    LastRow = ActiveSheet.Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row '' this find bottom row by starting on very last row of sheet and moving up until it finds a cell with a value in it
    Range("D2").Formula = "=IF(C2>0,C2,C1+1)"'' you might need to change , for ; depending on your language pack
    Range("D2:D" & LastRow ).FillDown
    

    【讨论】:

    • 谢谢大卫,确实,If 很简单,但我遇到了 j 函数的问题(第 37 行的 startrow) - 你能帮我查看整个代码吗:dotnetfiddle.net/q7HNkq(PS.我的来源数据文件的开始日期 - 我想用连续日期完成 - 在 B 列和可变行数中)
    • 很高兴为您提供帮助,我已经更新了我的代码以修复插入的行问题(我的错我错过了它)。通过从底部开始向上循环,您可以避免插入行的问题。看起来我弄错了棒广告的结尾,试图从另一个表中查找值。在我的新示例中,它将添加行,然后添加缺失的天数,一次递增一个。我不知道你是如何计算结束日期、小时数或日期类型的,所以只需输入一些文本。用你想要的公式替换它
    • 大卫,谢谢,我当然喜欢从底部开始的想法,但是,一些计算存在问题,我无法弄清楚为什么,因为其中一些是好的,有些不是,我在我的原始帖子中添加了一个截图,当我在我的示例数据上运行宏时——第一个 40 小时事件(从底部)计算得很好(绿色)——接下来的 2 天事件( 16 小时)计算很好,但原始日期(在 B 列中)被结束日期(红色)覆盖 - 另一个(黄色)在 col.B 中再次被一个奇怪的数字覆盖(为什么是 1 月 27 日而不是 29一月??)
    • 嗨,我明白你的意思,我不太清楚为什么会出现问题。猜测可能是调整大小的插入。我更新了我的代码并尝试将其更改为标准行插入,这对我来说似乎更稳定。给它之前让我知道
    • 大卫,它没有帮助,计算中仍然存在相同的错误。但是我发现了一个更简单的方法:一旦我插入了正确数量的空行,我就可以插入一个额外的列,然后使用这个公式从上往下 =IF(C2>0;C2;C1+1)这将根据需要填写从开始日期开始的日期... :-) 现在我只需要弄清楚如何将其传输到 VBA,因此我不必手动创建额外的列...
    猜你喜欢
    • 2016-08-02
    • 2018-03-02
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多