excel函数读取某非空行的A列单元格内容
INDEX(Sheet1!B:B,SMALL(IF(Sheet1!$B$1:$B$999<>"",ROW($1:$999),4^8),ROW(B1)))
现在我想取B列非空单元格的A列内容怎么做?
话说上面那条也是知道里面回答的答案.
顺便问下那公式的讲解.(有加分喔~) 展开
题目要求是:“现在我想取B列非空单元格的A列内容怎么做” 所以应该是要先判断B列不为空的情况下再取A列的数据,因为B列不为空,A列为空时,取A列的内容也是没意义的,所以就是判断A和B列同时不为空的情况下,再取A列的值。
公式应该改为这样:
=INDEX(Sheet1!A:A,SMALL(IF((Sheet1!$A$1:$A$999<>"")*(Sheet1!$B$1:$B$999<>""),ROW($1:$999),4^8),ROW(A1)))&""
如果坚持只要B列为不空,不理会A列时否为空,就取A列内容,公式改为这样:
=INDEX(Sheet1!A:A,SMALL(IF(Sheet1!$B$1:$B$999<>"",ROW($1:$999),4^8),ROW(A1)))&""
公式的意思就是:
IF(Sheet1!$B$1:$B$999<>"",ROW($1:$999),4^8)
用IF函数判断sheet1!B1:B999这个区域是不是空值,如果不是就返回当前的行号,如果是就返回最后一行4^8=65536(这是EXCEL 2003支持最大的行数)。
SMALL(IF(....),ROW(A1))
然后在外面套个SMALL从小到大排序的函数。把以上IF函数得到的结果按顺序排序出来。如本例子中因为B列第1、3、5、9共四行不为空白,返回的结果则就是1、3、5、9,余下的就是返回65536。
INDEX(Sheet1!B:B,SMALL(....))
最后在外面套个INDEX函数,就是要根据前面SMALL函数返回的1、3、5、9依次读取Sheet1!B:B中的1、3、5、9行内容并且返回该行的内容。公式中最后的 &"" 作用是当读到那行本身也为空白时,如65536一般都是用不到的,这时公式也返回空白值(这样比较好看点),如果不加 &"" ,则返回0值。所以题目中列出来的公式不知是本身就没有&"",还是楼主你抄少了? ^_^
最后来说,为什么要用到4^8,4的8次方就是65536,这是EXCEL 2003支持最大的行数,所以写公式时也是为了考虑提问的朋友可能用的是EXCEL 2003才这样写的,如果这个数大于65536,在EXCEL 2003上运行,公式是会出错的。
我把文件传上来,请点击这回答右下角绿色的“点击下载”按钮,下载文件看看效果。
INDEX(Sheet1!A:A,SMALL(IF(Sheet1!$B$1:$B$999<>"",ROW($1:$999),4^8),ROW(B1)))
下面是解释
INDEX(Sheet1!A:A,数字)是返回A列中第 “数字” 行的单元格
如INDEX(Sheet1!A:A,10)的意思就是返回A列中第10行,即A10
IF(Sheet1!$B$1:$B$999<>"",ROW($1:$999),4^8) 在这里是创建一个数组(不知道你有没有听过数组)
small(数组或区域,数字),返回 数字 指定的的按从小到大排序的数组区域 的值
如small({10,30,40,20},2),就是会返回20,因为20 在数组{10,30,40,20}中排倒数第二,
small({10,30,40,20},3)便回30
等等
SMALL(IF(Sheet1!$B$1:$B$999<>"",ROW($1:$999),4^8),ROW(B1)))这句下拉后,在单元格便组成一个新的数组,这个数组是从小到大排序其中的4^8是对应B列的空单元格,其它数字则是B列中单元格不为空的对应的行序号
综合上面,便可以返回出B列非空的对应任意其它列的数据