【问题标题】:Recursive Function & Looping In ExcelExcel中的递归函数和循环
【发布时间】:2021-08-05 04:36:16
【问题描述】:

我正在寻找一些指导,以在不遇到循环引用错误的情况下在表格中循环 Excel 中的函数。我花了很长时间尝试 COUNTIF、MATCH,本质上,我需要为“Desired Date”列创建一个函数/公式,以便它从“Original Date”列中获取值并根据以下内容更改值参数:

  • 如果 Original Date 列中的日期不存在于 Desired Date 列的先前值中,它将列出确切的日期。我已经用 IF 和 COUNTIF 函数解决了这部分问题。

  • 如果 Original Date 列中的日期已经存在于“Desired Date”列的先前值中,它将增加 +1 天,直到 中的所有值Desired Date 列具有唯一的日期。

这是我希望该函数执行的操作:

第 1 行包含原始日期值 8/1,由于所需行列中不存在其他值,它将返回 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。

如果原始日期中的某个日期在任何给定时间发生变化,则所需日期中的值应相应更改,方法是添加可变天数,直到“所需日期”列中的所有值都是唯一的。

Row Original Dates Desired Dates
1 8/1/2021 8/1/2021
2 8/1/2021 8/2/2021
3 8/1/2021 8/3/2021
4 8/12/2021 8/12/2021
5 8/12/2021 8/13/2021
6 8/3/2021 8/4/2021
7 8/4/2021 8/5/2021
8 8/3/2021 8/6/2021
9 8/13/2021 8/14/2021

我已经在这个问题上花费了 9 多个小时,因此非常感谢您在这一点上提供的任何帮助。我不介意使用 VBA,但出于兼容性目的,最好使用函数。

谢谢!

【问题讨论】:

    标签: excel vba recursion circular-reference


    【解决方案1】:

    一种方法可能是从第一列中的日期开始生成日期,但忽略任何已使用的日期 (countif>0),然后选择其中最低的一个:

    =LET(maxdate,$D$2,
    startdate,B2,
    seq,SEQUENCE(maxdate-startdate,1,startdate),
    MIN(IF(COUNTIF(E$1:E1,seq),maxdate,seq)))
    

    或略短

    =LET(maxdate,$D$2,
    startdate,B2,
    seq,SEQUENCE(maxdate-startdate,1,startdate),
    MIN(IF(COUNTIF(E$1:E1,seq)=0,seq)))
    

    如果没有 Excel 365,可以使用 Row 代替 Sequence:

    =MIN(IF(COUNTIF(E$1:E1,ROW(INDEX(A:A,B2):INDEX(A:A,$D$2)))=0,ROW(INDEX(A:A,B2):INDEX(A:A,$D$2))))
    

    使用CtrlShiftEnter

    作为数组公式输入

    编辑

    如果您想按照评论中的方式进行连接,您将无法使用 Min(因为这些值不是数字),但您可以使用 index/match 来查找特定人员的第一个可用日期:

    =LET(maxdate,$D$2,
    startdate,A2,
    name,B2,
    seq,SEQUENCE(maxdate-startdate,1,startdate),
    seqName,seq&name,
    INDEX(seqName,MATCH(0,COUNTIF(H$1:H1,seqName),0)))
    

    如果您想让日期显示为日期而不是数字,您可以将它们包装在 Text 中:

    =LET(maxdate,$D$2,
    startdate,A2,
    name,B2,
    seq,SEQUENCE(maxdate-startdate,1,startdate),
    seqName,TEXT(seq,"mm/dd/yy")&name,
    INDEX(seqName,MATCH(0,COUNTIF(H$1:H1,seqName),0)))
    

    【讨论】:

    • 您好,非常感谢您的帮助!这对我帮助很大。感谢您花时间和精力来解决问题。我最初希望将带有日期的文本连接起来,并使用该函数来查看以前的连接值。但是,我找不到将 SEQUENCE 函数与 CONCAT 一起使用的方法。是否可以将文本连接到每个日期?
    • 在我最初的评论之后,我希望运行这样的东西:ibb.co/ftYg0XC 我希望为每个员工做的是,它会遍历连接列表并查看连接的列表是否记录存在,然后它将 +1 天添加到日期值并返回连接值。从那里我可以提取所需的日期值。任何建议将不胜感激!再次感谢您抽出宝贵时间回答我最初的问题。
    • 不客气!我认为这是可能的,也许使用 countifs 而不是 countif,但我将在接下来的 3 或 4 小时内外出,所以要等到以后才能正确查看它。
    • 嗨,汤姆,非常感谢您的帮助!这个公式非常有效!我不知道如何表达这对我来说意味着什么。再次感谢您抽出宝贵时间帮助 Excel 新手!
    猜你喜欢
    • 2014-01-17
    • 2011-05-07
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多