Excel 合并行,求一列值的和,并保留最早开始时间和最晚结束时间

Excel 合并行,求一列值的和,并保留最早开始时间和最晚结束时间,excel,vba,Excel,Vba,我已经能够找到代码来合并行,删除不再需要的重复行,并对其中一列求和。然而,这些代码是基于ActiveCells的,这对我来说是行不通的。我需要这个来处理大范围的数据。如下面的示例所示,将有2行、3行或更多行需要合并。但我还有一个额外的要求,我就是找不到解决方案。下面是一组我们可以用作示例的小数据。这里有4列(实际数据集中还有5列,但它们都是重复数据,在本例中不需要)代表挑战。我需要将这三行合并为一行,在B列中添加值(下面继续) 最终结果是,保留最早的开始日期和时间,并保留最晚的开始日期和时间:

我已经能够找到代码来合并行,删除不再需要的重复行,并对其中一列求和。然而,这些代码是基于ActiveCells的,这对我来说是行不通的。我需要这个来处理大范围的数据。如下面的示例所示,将有2行、3行或更多行需要合并。但我还有一个额外的要求,我就是找不到解决方案。下面是一组我们可以用作示例的小数据。这里有4列(实际数据集中还有5列,但它们都是重复数据,在本例中不需要)代表挑战。我需要将这三行合并为一行,在B列中添加值(下面继续)

最终结果是,保留最早的开始日期和时间,并保留最晚的开始日期和时间:


数据将位于A列到Z列(第1行是标题列),数据每小时添加一次。对于所有其他代码,我通常将行数限制为2000行。我们还没有超过这个数字。我有一个自定义菜单,我将使用它来触发代码,因为它的目的是尽可能少的用户输入(自动化是关键)。有没有办法用VBA实现这一点?

这里是我为您编写的一段代码。它会满足你的要求,但我相信有更好的方法来满足你的要求,因为你需要更多的信息

Sub combineLikes()

endRng = Range("D92000").End(xlUp).Row
i = 2
Do Until i > endRng
    If Range("A" & i).Value = Range("A" & i).Offset(1, 0).Value Then
        Range("B" & i).Value = Range("B" & i).Value + Range("B" & i).Offset(1, 0).Value
        If Range("C" & i).Value > Range("C" & i).Offset(1, 0).Value Then Range("C" & i).Value = Range("C" & i).Offset(1, 0).Value
        If Range("D" & i).Value < Range("D" & i).Offset(1, 0).Value Then Range("D" & i).Value = Range("D" & i).Offset(1, 0).Value
        Rows(i + 1).EntireRow.Delete
        endRng = endRng - 1
    Else
        i = i + 1
    End If
Loop

End Sub
子组合类()
endRng=范围(“D92000”)。结束(xlUp)。行
i=2
直到我结束为止
如果范围(“A”&i).Value=范围(“A”&i).Offset(1,0).Value,则
范围(“B”和i)。值=范围(“B”和i)。值+范围(“B”和i)。偏移量(1,0)。值
如果范围(“C”&i).值>范围(“C”&i).偏移量(1,0).值然后范围(“C”&i).值=范围(“C”&i).偏移量(1,0).值
如果范围(“D”和i)。值<范围(“D”和i)。偏移量(1,0)。值然后范围(“D”和i)。值=范围(“D”和i)。偏移量(1,0)。值
行(i+1).EntireRow.Delete
endRng=endRng-1
其他的
i=i+1
如果结束
环
端接头

如果列
A
已排序,请尝试以下代码:

Sub Test()

  Dim Rng As Range, dRng As Range
  Dim i As Long, LR As Long 'lastrow

    With Application
     .ScreenUpdating = False
     .EnableEvents = False
     .Calculation = xlCalculationManual
    End With

    LR = Range("A" & Rows.Count).End(xlUp).Row
    Set Rng = Range("A2:D2")

    For i = 3 To LR
     If Rng(1) = Cells(i, 1) Then          
      Set Rng = Range(Rng(1), Cells(i, 4))
     Else
      If Rng.Rows.Count > 1 Then GoSub mSub
      Set Rng = Range(Cells(i, 1), Cells(i, 4))
     End If
    Next

    If Rng.Rows.Count > 1 Then GoSub mSub
    If Not dRng Is Nothing Then dRng.EntireRow.Delete

    With Application
     .ScreenUpdating = True
     .EnableEvents = True
     .Calculation = xlCalculationAutomatic
    End With

  Exit Sub

mSub:

    With WorksheetFunction
     Rng(2) = .Sum(Rng.Columns(2))
     Rng(3) = .Min(Rng.Columns(3))
     Rng(4) = .Max(Rng.Columns(4))
    End With

    If dRng Is Nothing Then
     Set dRng = Range(Rng(2, 1), Rng(Rng.Count))
    Else
     Set dRng = Union(dRng, Range(Rng(2, 1), Rng(Rng.Count)))
    End If

  Return
End Sub

日期和时间是否总是这样有序?如果没有,您将需要一些If语句来查找放入这些单元格的最小和最大时间,您可以轻松地将相同单元格的分钟数相加。您需要遍历所有单元格并找到副本,然后将它们添加到一起。这还取决于你的信息在哪里。是否会先排序?@histerical是的,数据总是被排序的,开始和结束日期是排序顺序的一部分。该示例仅显示已排序的高亮显示区域。我只是把它拼凑起来作为参考。我将编辑我的问题以显示数据所在的整个范围。谢谢。这很有效。当然,一旦我实现了这一点,需求就发生了变化。我应该用新要求更新问题,还是创建一个新问题(引用此问题)并发布新信息?这还需要显示此问题示例的扩展版本。@IronMan,欢迎您,如果新要求很简单,也许我可以编辑此答案,但我认为如果此代码需要大量更改,则新问题更好。我将创建一个名为“合并行,求一列值的和,并保留最早开始时间和最晚结束时间-第2部分”,因为增加了确定要在哪些行上执行SUB的标准