我有一个销售促销电子表格,其中必须有一列显示在相同日期和不同销售代表促销的同一产品的冲突行。
栏目:
E:零售名称 F:销售代表 L:产品 SKU 代码 I:促销开始日期 J:促销结束日期 M:销售通道(开、关、开+关)
=array_constrain((IF(and($E$4:$E<>"";$L$4:$L<>"";$I$4:$I<>"";$J$4:$J<>"";$M$4:$M<>"";$F$4:$F<>"");arrayformula(TEXTJOIN(", ";TRUE;IF(($F1102<>$F$4:$F)($I1102<=$J$4:$J)($J1102>=$I$4:$I)*($L1102=$L$4:$L);IF(ROW($I$4:$I)=ROW();"";"Row"&ROW($I$4:$I));"")));""));COUNTA($E$4:$E);1)
问题:
此公式显示错误“在 VLOOKUP 求值中未找到值 'a'”,一旦我在公式中没有 VLOOKUP,我就看不到该错误。一旦我删除了“($F1102<>$F$4:$F)”,它就可以正常工作了。
array_constrain 也不会自动将该列填充到 E 列中最后一个值的行。
根据我的研究,很难使用 ARRAYFORMULA 来解决您的问题。这是因为,您不能将 ARRAYFORMULA 与原始公式一起使用的主要原因是 ARRAYFORMULA 不直接处理像 JOIN 这样的串联函数,因为这些函数如何聚合数据。将问题分解为辅助列,然后组合结果是解决这些限制的常见方法。
如果我打算解决这个问题,我会从这个公式开始。
注意:这些公式可能无法 100% 完全适合您的用例,但您可以将此作为参考来获得问题的答案。
={SEQUENCE(ROWS(F2:F20)), F2:F20, BYROW(G2:I20, LAMBDA(row, CONCATENATE(row)))}
我使用这个公式创建了一个数字列表,我们可以使用它来识别哪些行存在冲突并连接每行中的值,因此,我可以更轻松地识别每行的相似性,然后合并这些结果与原来的范围。
然后我会在附近的单元格上使用第二个公式。
=IF(
REGEXMATCH(JOIN(",", FILTER($K$2:$K$20, $M$2:$M$20 = M2)), ","),
"Conflicting rows: " & JOIN(",", FILTER($K$2:$K$20, $M$2:$M$20 = M2)),
"")
我使用 FILTER 来检测多个促销可能重叠或存在问题的冲突,并使用 JOIN 将所有这些条目聚合到单个逗号分隔的字符串中。我还使用 REGEXMATCH 来验证连接的字符串是否包含多个条目。
这是我根据您的列要求创建的示例数据集,以及 K2 上的第一个公式和 N2 上的第二个公式:
参考资料: