求助!当所要提取的数据项不完全相同时,如何提取对应数据? C7=OFFSET(表2!C$6:F$6,MATCH(10,MMULT(--ISNUMBER(FIND(MID($B7,COLUMN(A:J),1),表2!$B$7:$B$154)),ROW($1:$10)*0+1),0),0) 本公式难理解的是MMULT函数部分,从里向外看看公式的运算。 一、绿色区部分--ISNUMBER(FIND(MID($B7,COLUMN(A:J),1),表2!$B$7:$B$154)) 1、从里向外看,最里面的函数是COLUMN(A:J),得到了{1,2,3,4,5,6,7,8,9,10}这一个10元素横向数组。 2、通过MID($B7,{1,2....,9,10},1}把要匹配的B7字串"枝江酒业股份有限公司"分解为{"枝","江",...,"公","司"},如果要匹配的字串不够10个则后面均以空字符来补充,如"江峡船舶柴油机厂"分解为{"江","峡",...,"机","厂","",""},注意""也是一个字符。 3、公式变为FIND({"枝","江",...,"公","司"},表2!$B$7:$B$154),它的作用是用所得的10个字符与匹配区 表2!$B$7:$B$154 一一比较,结果是一个 154行X10列 的二维数组,为了好理解,下面所述均把匹配区看为只有两个单元格,即只与 表2!$B$7:$B$8 作比较,结果是{3,4,5,6,7,8,9,10,11,12 ; #VALUE!,#VALUE!,#VALUE!,#VALUE!,7,8,9,10,11,12},以红色分号往左和往右,分别得到两组10个元素的横向数组,从结果可以看到,分解后的字串如果在匹配单元格中能找到,结果得到它所处的字串位置数,如果找不到的字符就为得到错误值#VALUE!,这样我们的匹配条件就很明确了,就是能得到10个数值的单元格就是最终想要匹配的单元格了。注意""这个空字符在任意字串的单元格中都能找到,结果都是1。 4、下面的问题就是怎么才能把FIND函数的154行X10列二维数组结果能转化为一个 154行X1列的 列向数组呢?由此可想到用函数MMULT(数组1,数组2)来转换,它的转换要求是数组1的列数要与数组2的行数一样,从而要构建一个10行1列的数组2,所以用到了黄色部分来构建,等一下再谈数组2的构建问题,先说说数组1的问题,由于它里面有错误值#VALUE!存在,而MMULT函数对参与运算的两个数组要求均为数值,把以要先把数组1处理一下,使用的函数就是ISNUMBER函数了,如果它的参数是数值,就为TURE(T),反之为FALSE(F)。通过用ISNUMBER({3,4,5,6,7,8,9,10,11,12 ; #VALUE!,#VALUE!,#VALUE!,#VALUE!,7,8,9,10,11,12})后得到结果{T,T,T,T,T,T,T,T,T,T ;F,F,F,F,T,T,T,T,T,T},但它还不是数值数组,所以要通过--ISNUMBER(...) 的减减运算把逻辑值转为{1,1,1,1,1,1,1,1,1,1 ;0,0,0,0,1,1,1,1,1,1}这样的数值数组。至此绿色部分解释完毕。 二、黄色部分ROW($1:$10)*0+1 前面说到要构建MMULT的数组2,它是一个10行1列的数组,由于数组1的结果是{1,1,1,1,1,1,1,1,1,1;0,0,0,0,1,1,1,1,1,1},要分别得到左边和右边1的个数,就要求数组2是{1;1;1;1;1;1;1;1;1;1}这样的数组,所以先用ROW($1:$10)得到{1;2;3;4;5;6;7;8;9;10},再 *0+1 就得到了要的数组2,从而通过MMULT来运算就得到了{10;6}的结果数组。 三、得到结果数组后,后面思路就容易想到了 通过用函数MATCH(10,{10;6},0),可以精确找到结果数组中为10的元素位置也就是1,注意附件中的公式省略了蓝色的0,再用OFFSET或INDEX函数来引用相应的匹配区中的单元格就行了,这里是用了OFFSET(表2!C$6,1,0)的方法来得到匹配单元格为 表2!C$6 ,附件中的公式在这里也省略了蓝色的0。另外由于附件中使用的是横向多单元格数组公式,所以用OFFSET(表2!C$6:F$6,1,0)来得到一个匹配区域,即为 表2!C$6:F$6 。 [em08][em08] ~~呼,终于写完了,解释的时间比想这个问题的时间还要多得多。
[此贴子已经被作者于2007-4-7 19:14:54编辑过] |