![Excel 宏反复将一周添加到 B 列的开始日期,直到在 A 列中找到新值。非 VBA 也可以工作](https://linux22.com/image/1609391/Excel%20%E5%AE%8F%E5%8F%8D%E5%A4%8D%E5%B0%86%E4%B8%80%E5%91%A8%E6%B7%BB%E5%8A%A0%E5%88%B0%20B%20%E5%88%97%E7%9A%84%E5%BC%80%E5%A7%8B%E6%97%A5%E6%9C%9F%EF%BC%8C%E7%9B%B4%E5%88%B0%E5%9C%A8%20A%20%E5%88%97%E4%B8%AD%E6%89%BE%E5%88%B0%E6%96%B0%E5%80%BC%E3%80%82%E9%9D%9E%20VBA%20%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%B7%A5%E4%BD%9C.png)
我有一张 Excel 表,其中 x 行的值为 980002。在 x 行之后,A 列中会出现一个新数字。在 B 列中,需要插入一个日期,该日期为 3 行中的同一日期,然后为接下来的 3 行添加一周,直到第一个值 980002 结束。然后对 A 列中的下一个值重复相同的过程。
(编辑):这是我的新代码集,但我无法让它只在 980002 旁边的单元格中写入日期,直到该值结束。相反,它会计算 980002 的行数并写入那么多日期,在每个单元格之间添加 3 行。例如,如果有 5 行值为 980002,那么它将写入 5 个日期,但从第 1 行到第 15 行。
Sub years()
Dim cmdate As Date
Dim i As Integer
Dim rng As Range
Dim cll As Range
i = 0
cmdate = DateSerial(Year(Date), 1, 1)
Set rng = Range("a1", Range("a1").End(xlDown))
For Each cll In rng
If cll.Value = "980002" Then
Do
Range("B1").Offset(i, 0) = cmdate
cmdate = cmdate + 7
i = i + 3
Loop Until Range("a1") <= "980002"
End If
Next cll
End Sub
答案1
为了按所需顺序获取一系列日期,我建议使用非 VBA 方法。
怎么运行的:
- 将初始日期放入单元格
AB1
(也可编辑)。 在单元格中输入此公式
AB2
并填写。=COUNTIF($AA$2:$AA2,$AA2)
单元格中的公式
AC2
。=IF(ISBLANK(AB2),"",IF(AND(AB2>=1,AB2<=3),$AB$1,IF(AND(AB2>=4,AB2<=6),$AB$1+7,IF(AND(AB2>=7,AB2<=9),$AB$1+14))))
为了以后整洁,您可以隐藏该AB
列。
编辑: 我之所以包含这部分,是因为 OP 对如果 ID 集发生变化,所显示的方法将如何工作感到困惑。
- 此示例包含一系列 6 个相似的 ID。
- 细胞内分子式
T2
:
=COUNTIF($S$2:$S2,$S2)
单元格中的公式
U2
:=IF(AND(T2>=1,T2<=3),$T$1,IF(AND(T2>=4,T2<=6),$T$1+7))
根据需要调整公式中的日期计算和单元格引用。