递归函数和循环 Excel
Recursive Function & Looping In Excel
我正在寻找一些指导,以在 table 中循环遍历 Excel 中的函数,而不会出现 运行 循环引用错误。我花了很多时间尝试 COUNTIF、MATCH,本质上,我需要为“期望日期”列创建一个 function/formula,以便它从“原始日期”列中获取值并根据以下值更改值以下参数:
如果原始日期列中的日期不存在于所需日期列的先前值中,它将列出确切的日期。我已经用 IF 和 COUNTIF 函数解决了这部分问题。
如果原始日期列中的日期已经在“期望日期”列的先前值内,它将增加 +1 天(s ) 直到 Desired Date 列中的所有值都具有唯一的日期。
这是我希望函数执行的操作:
第 1 行包含原始日期值 8/1,因为所需行列中不存在其他值,它将 return 8/1。
第 2 行包含原始日期值 8/1,但由于所需日期值的第 1 行已经包含值 8/1,因此它将添加 +1 天,因此它变成 8/2。
第 3 行包含原始日期值 8/1,但由于所需日期的第 1 行和第 2 行包含该值,它会增加 +2 天,因此变成 8/3。
第 6 行包含原始日期值 8/3,但由于所需日期的第 3 行包含该值,它会加上 +1 天,所以它变成 8/4。
如果原始日期中的任何给定日期发生变化,所需日期中的值应相应更改,方法是添加可变天数,直到所需日期列中的所有值都是唯一的。
行
原始日期
期望的日期
1
2021 年 8 月 1 日
2021 年 8 月 1 日
2
2021 年 8 月 1 日
2021 年 8 月 2 日
3
2021 年 8 月 1 日
2021 年 8 月 3 日
4
2021 年 8 月 12 日
2021 年 8 月 12 日
5
2021 年 8 月 12 日
2021 年 8 月 13 日
6
2021 年 8 月 3 日
2021 年 8 月 4 日
7
2021 年 8 月 4 日
2021 年 8 月 5 日
8
2021 年 8 月 3 日
2021 年 8 月 6 日
9
2021 年 8 月 13 日
2021 年 8 月 14 日
我已经在这个问题上花费了 9 个多小时,因此非常感谢此时的任何帮助。我不介意使用 VBA,但出于兼容性目的,最好使用函数。
谢谢!
一种方法可能是从第一列中的日期开始生成日期,但忽略任何已使用的日期 (countif>0),然后选择其中最低的日期:
=LET(maxdate,$D,
startdate,B2,
seq,SEQUENCE(maxdate-startdate,1,startdate),
MIN(IF(COUNTIF(E:E1,seq),maxdate,seq)))
或稍短
=LET(maxdate,$D,
startdate,B2,
seq,SEQUENCE(maxdate-startdate,1,startdate),
MIN(IF(COUNTIF(E:E1,seq)=0,seq)))
如果你没有Excel 365,你可以用Row代替Sequence:
=MIN(IF(COUNTIF(E:E1,ROW(INDEX(A:A,B2):INDEX(A:A,$D)))=0,ROW(INDEX(A:A,B2):INDEX(A:A,$D))))
使用 CtrlShiftEnter
作为数组公式输入
编辑
如果您想像评论中那样连接,您将无法使用 Min(因为值不是数字)但您可以使用 index/match 找到第一个可用日期一个特定的人:
=LET(maxdate,$D,
startdate,A2,
name,B2,
seq,SEQUENCE(maxdate-startdate,1,startdate),
seqName,seq&name,
INDEX(seqName,MATCH(0,COUNTIF(H:H1,seqName),0)))
如果您想让日期显示为日期而不是数字,您可以将它们包装在文本中:
=LET(maxdate,$D,
startdate,A2,
name,B2,
seq,SEQUENCE(maxdate-startdate,1,startdate),
seqName,TEXT(seq,"mm/dd/yy")&name,
INDEX(seqName,MATCH(0,COUNTIF(H:H1,seqName),0)))
我正在寻找一些指导,以在 table 中循环遍历 Excel 中的函数,而不会出现 运行 循环引用错误。我花了很多时间尝试 COUNTIF、MATCH,本质上,我需要为“期望日期”列创建一个 function/formula,以便它从“原始日期”列中获取值并根据以下值更改值以下参数:
如果原始日期列中的日期不存在于所需日期列的先前值中,它将列出确切的日期。我已经用 IF 和 COUNTIF 函数解决了这部分问题。
如果原始日期列中的日期已经在“期望日期”列的先前值内,它将增加 +1 天(s ) 直到 Desired Date 列中的所有值都具有唯一的日期。
这是我希望函数执行的操作:
第 1 行包含原始日期值 8/1,因为所需行列中不存在其他值,它将 return 8/1。
第 2 行包含原始日期值 8/1,但由于所需日期值的第 1 行已经包含值 8/1,因此它将添加 +1 天,因此它变成 8/2。
第 3 行包含原始日期值 8/1,但由于所需日期的第 1 行和第 2 行包含该值,它会增加 +2 天,因此变成 8/3。
第 6 行包含原始日期值 8/3,但由于所需日期的第 3 行包含该值,它会加上 +1 天,所以它变成 8/4。
如果原始日期中的任何给定日期发生变化,所需日期中的值应相应更改,方法是添加可变天数,直到所需日期列中的所有值都是唯一的。
行 | 原始日期 | 期望的日期 |
---|---|---|
1 | 2021 年 8 月 1 日 | 2021 年 8 月 1 日 |
2 | 2021 年 8 月 1 日 | 2021 年 8 月 2 日 |
3 | 2021 年 8 月 1 日 | 2021 年 8 月 3 日 |
4 | 2021 年 8 月 12 日 | 2021 年 8 月 12 日 |
5 | 2021 年 8 月 12 日 | 2021 年 8 月 13 日 |
6 | 2021 年 8 月 3 日 | 2021 年 8 月 4 日 |
7 | 2021 年 8 月 4 日 | 2021 年 8 月 5 日 |
8 | 2021 年 8 月 3 日 | 2021 年 8 月 6 日 |
9 | 2021 年 8 月 13 日 | 2021 年 8 月 14 日 |
我已经在这个问题上花费了 9 个多小时,因此非常感谢此时的任何帮助。我不介意使用 VBA,但出于兼容性目的,最好使用函数。
谢谢!
一种方法可能是从第一列中的日期开始生成日期,但忽略任何已使用的日期 (countif>0),然后选择其中最低的日期:
=LET(maxdate,$D,
startdate,B2,
seq,SEQUENCE(maxdate-startdate,1,startdate),
MIN(IF(COUNTIF(E:E1,seq),maxdate,seq)))
或稍短
=LET(maxdate,$D,
startdate,B2,
seq,SEQUENCE(maxdate-startdate,1,startdate),
MIN(IF(COUNTIF(E:E1,seq)=0,seq)))
如果你没有Excel 365,你可以用Row代替Sequence:
=MIN(IF(COUNTIF(E:E1,ROW(INDEX(A:A,B2):INDEX(A:A,$D)))=0,ROW(INDEX(A:A,B2):INDEX(A:A,$D))))
使用 CtrlShiftEnter
作为数组公式输入编辑
如果您想像评论中那样连接,您将无法使用 Min(因为值不是数字)但您可以使用 index/match 找到第一个可用日期一个特定的人:
=LET(maxdate,$D,
startdate,A2,
name,B2,
seq,SEQUENCE(maxdate-startdate,1,startdate),
seqName,seq&name,
INDEX(seqName,MATCH(0,COUNTIF(H:H1,seqName),0)))
如果您想让日期显示为日期而不是数字,您可以将它们包装在文本中:
=LET(maxdate,$D,
startdate,A2,
name,B2,
seq,SEQUENCE(maxdate-startdate,1,startdate),
seqName,TEXT(seq,"mm/dd/yy")&name,
INDEX(seqName,MATCH(0,COUNTIF(H:H1,seqName),0)))