【发布时间】:2021-04-17 00:09:47
【问题描述】:
我有一个大型电子表格,其标题(180k+ 行)在 A 中具有唯一 ID,在 B 中具有唯一 ID,在 C 中具有结束日期。每个 ID 有多个行,并且开始日期和结束日期重叠。
我需要找出每个 ID 的日期范围内的任何空白。我编写了一些不同的公式和宏,尝试并调整了我发现的 VBA 脚本。我尝试过电源查询和电源支点,但如果 Excel 没有崩溃,我就不会得到可用的输出。
示例数据:
| ID | start | end |
|---|---|---|
| 100 | 1/1/2015 | 3/1/2015 |
| 100 | 3/1/2015 | 1/1/2300 |
| 100 | 1/1/2018 | 1/1/2019 |
| 096 | 7/1/2020 | 1/1/2021 |
| 182 | 9/17/2017 | 1/1/2018 |
| 182 | 1/1/2018 | 1/1/2019 |
| 607 | 1/1/2015 | 9/1/2015 |
| 607 | 9/1/2015 | 1/1/2017 |
| 607 | 1/1/2018 | 1/1/2020 |
| 607 | 1/1/2021 | 1/1/2300 |
我想合并或合并这些以删除在日期范围内没有任何间隔的 ID 的额外行,但会为有间隔的 ID 留下额外的行:
| ID | start | end |
|---|---|---|
| 100 | 1/1/2015 | 1/1/2300 |
| 096 | 7/1/2020 | 1/1/2021 |
| 182 | 9/17/2017 | 1/1/2019 |
| 607 | 1/1/2015 | 1/1/2017 |
| 607 | 1/1/2018 | 1/1/2020 |
| 607 | 1/1/2021 | 1/1/2300 |
我不需要 把它结合起来;不过,为了演示,它会很好。另外,我会选择能够告诉我哪些 ID 在范围内有间隙的东西,即使它没有合并日期或删除额外的行。
我确实从另一个站点找到了一个几乎可以完成这项工作的脚本,但是由于日期范围不能全部按正确的顺序排序,例如示例中的 ID 100,它会在不应该的情况下创建一个额外的行。
Sub Consolidate_Dates()
Dim cell As Range
Dim Nextrow As Long
Dim Startdate As Date
Nextrow = Range("A" & Rows.Count).End(xlUp).Row + 2
Startdate = Range("B2").Value
Application.ScreenUpdating = False
For Each cell In Range("A2", Range("A2").End(xlDown))
If cell.Value <> cell.Offset(1).Value Or _
cell.Offset(0, 2).Value < cell.Offset(1, 1).Value - 1 Then
Range("A" & Nextrow).Resize(1, 3).Value = cell.Resize(1, 3).Value
Range("B" & Nextrow).Value = Startdate
Nextrow = Nextrow + 1
Startdate = cell.Offset(1, 1).Value
End If
Next cell
Application.ScreenUpdating = True
End sub
【问题讨论】:
-
我不明白你想做什么。你能展示一些想要的输出数据并进一步解释吗?
-
您是否要合并两行,其中一行的开头紧跟另一行的结尾,例如 1/1/2021 到 31/1/2021 和 1/2/2021 到 28/2/ 2021 年 1/1/2021 至 28/2/2021
标签: excel vba excel-formula date-range