这个公式其实不怎么复杂,只是看起来有点长。前面一部分用于排错,当出现错误时,返回空值,可先把它去掉,留下公式的主体部分: K12=INDIRECT(TEXT(MIN(IF((MOD(ROW($2:$23),3)=2)*(COUNTIF(K$11:K11,B$2:I$23)=0),ROW($2:$23)*1000+COLUMN(B:I))),"r#c000"),) 按Ctrl+Shift+Enter结束,将公式下拉。 我们选择K18单元格的公式,看它是如何返回“台灯”的。 1、将文本特征转化为数字 选择K18单元格,在编辑栏中将如下部分的公式复制到剪贴板: =INDIRECT(TEXT(MIN(IF((MOD(ROW($2:$23),3)=2)*(COUNTIF(K$11:K17,B$2:I$23)=0),ROW($2:$23)*1000+COLUMN(B:I))),"r#c000"),) 在工作表中选择与B2:I23相同大小的区域:N2:U23,将上一步复制的公式粘贴到编辑栏中,并在前面加上等号: =IF((MOD(ROW($2:$23),3)=2)*(COUNTIF(K$11:K17,B$2:I$23)=0),ROW($2:$23)*1000+COLUMN(B:I)) 按Ctrl+Shift+Enter结束,结果显示为: 公式中有两个条件表达式: ⑴、MOD(ROW($2:$23),3)=2:行号除以3,余数为2,即我们要返回的是“名称”,将这个条件表达式换为如下也行: A$2:A$23="名称" ⑵COUNTIF(K$11:K17,B$2:I$23)=0:B2:I23的文本在K11:K17中不存在,这里达到不重复的目的。 如果符合两个条件,将返回一个数值,这个数值为 ROW($2:$23)*1000+COLUMN(B:I):后三位为文本所在的列号,从千位开始,前面的部分表示这个文本所在的行号。 如下图所示,左边黑色字体为K11:K17中还没有出现过的名称,右边对应位置上的数字表示这个名称所在的位置,如“台灯—2008”、“电脑—2009”、“音箱—5002”等等,数字表示“台灯”在2行8列、“音箱在5行2列”等等:
2、取出其中一个数字 上一步所取得的数字中,我们用同Min()取得其中的最小值,是2008。只有有规律,我们用其它函数也行,如按从大到小的顺序,用Max()等。 3、将行号与列与转化为单元格地址 选择K18单元格,在编辑栏按如下所示选择公式: =INDIRECT(TEXT(MIN(IF((MOD(ROW($2:$23),3)=2)*(COUNTIF(K$11:K17,B$2:I$23)=0),ROW($2:$23)*1000+COLUMN(B:I))),"r#c000"),) 按F9,显示为 =INDIRECT("r2c008",) 即是将上一步(Min)得到的结果2008加上行列地址标志“R”、“C”,这是为满足下一步使用Indirect()函数的需要。 4、从指定地址中返回单元格的值 INDIRECT()函数的作用是将单元格地址转为引用,即返回该单元格的值,INDIRECT(“R2C008",)将返回2行8列即H2单元格的值“台灯”。 讲解到这里就结束了,如果还想加深点印象,可继续选择K19、K20单元格的公式,再从第1步开始演练一遍。 参考: =INDIRECT("''"&$A2&"''!B2")这公式是什么意思?
[此贴子已经被作者于2008-8-19 18:01:35编辑过] |