假设使用 Excel 2010 或更高版本:
=IF(COLUMNS($A:A)>COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*"),"",IFERROR(HYPERLINK(CONCATENATE(sku_url,INDEX(Sheet2!$F:$F,AGGREGATE(15,6,ROW(Sheet2!$F$1:$F$1000)/(LEFT(Sheet2!$F$1:$F$1000,LEN($A2))=$A2),COLUMNS($A:A))))),"imagenotfound"))
作为解释,最初的IF 子句,即:
IF(COLUMNS($A:A)>COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*"),""
很简单:
COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*")
只计算符合条件的总行数,因为:
COLUMNS($A:A)
等于1,向右复制时依次变为:
COLUMNS($A:B)
(等于2)
COLUMNS($A:C)
(等于 3)
等等,等等,这个子句将等价于,在连续的列中:
IF(1>COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*"),""
IF(2>COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*"),""
IF(3>COUNTIF(Sheet2!$F$1:$F$1000,$A2&"*"),""
等等等等,因此在初始子句为TRUE的单元格中将返回一个空白。
唯一需要注意的其他子句是在满足此条件时生成连续行号数组的子句。不幸的是,由于技术原因,上面的COUNTIF 声明不能在我们的AGGREGATE 结构中使用。
幸运的是,我们可以使用 LEFT 的另一个设置来重现 COUNTIF 语句的结果。
暂时将有问题的范围从 F1:F1000 减少到 F1:F10 以帮助解释,这部分:
LEFT(Sheet2!$F$1:$F$10,LEN($A2))=$A2
将简单地为 F1:F10 中的每个条目生成一个布尔数组 TRUE/FALSE 返回该语句的结果。例如,我们可能有:
{FALSE;TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;FALSE;TRUE;FALSE}
当我们用这个布尔数组对每个条目的等效行号进行交互时,即执行:
ROW(Sheet2!$F$1:$F$10)/(LEFT(Sheet2!$F$1:$F$10,LEN($A2))=$A2)
我们有:
{1;2;3;4;5;6;7;8;9;10}/{FALSE;TRUE;FALSE;TRUE;TRUE;FALSE;TRUE;FALSE;TRUE;FALSE}
因为,当被任何合适的数学运算(除法为一)强制转换时,布尔值TRUE/FALSE 会被强制转换为它们的数值等价物(TRUE=1,FALSE=0),以上变为:
{#DIV/0!;2;#DIV/0!;4;5;#DIV/0!;7;#DIV/0!;9;#DIV/0!}
由于AGGREGATE,第一个参数为 15 被指示查找数组中的最小值,第二个参数为 6 被指示忽略该数组中的任何错误值,剩下的就是设置该函数中的第四个参数,k,用于确定是否应返回第一个最小、第二个最小等值。
再次,通过使用:
COLUMNS($A:A)
对于这个参数,我们知道它会生成一系列连续的整数(1、2、3 等)并复制到右侧,因此我们保证将所需的行号返回给每个版本的公式.
问候