to pengqidong朋友: 看清帖规,少占楼层。已合并,呵呵。 1、看一下本帖首页,了解一些基本知识,并多看函数帮助。比如Row、Column这些基本函数的用法。 2、"常见用数组公式取得多条记录的开头都是=if(row(1:1)>XXX,""……表示当公式下拉复制超过一定行数(满足条件记录的个数)时,显示为空。" 比如,=if(Row(1:1)>Countif(A:A,"张三"),"",……此时,用A列包含多少个“张三”的记录来控制行数。假设A列有3个张三的记录,那么,公式第一行=if(Row(1:1)>3不成立,第2行=If(row(2:2)>3也不成立……到了第4行=if(Row(4:4)>3就成立了,返回""——空文本。 3、楼上的=IF(Column(A:A)>Counta……也属于这样的句型,公式横向拖动复制,第1列时Column(A:A)、第2列时变Column(B:B)…… 4、楼上的公式太繁杂了些,很多可以简化。 比如OFFSET($A$5:$A$11,,MIN(ROW(1:1)))——此处,第一行公式用Offset将A5:A11单元格偏移1列,第2行偏移2列,第3行偏移3列。 那么为何Offset第3参数要用MIN(Row(1:1))而不是直接用Row(1:1)——因为Row(1:1)得到的是{1},单元素数组,而不是单值,具有方向。套用MIN得到单值就没有方向了。事实上,这个公式并不能根据A16的姓名来选择偏移多少列,因为他与A16完全没有关系了。可以用OFFSET($A$5:$A$11,Match($A16,$B$4:$D$4,0))代替。 再者,此处用COUNTA来统计打钩也是不合适的,而应该用Countif(Offset,"√")否则,打叉也会算,只要不是空都会算。 Small(IF(Offset<>"",Row(……)),column(A:A))——如果Offset得到的区域不为空,则返回其对应的行号,这样得到所有不为空的行号,再用Small+Column(A:A)按从小到大一个个排出来。 INDEX($A$5:$A$11,Small)——用Small部分得到的满足条件并排序后的行号来从A5:A11中定位。 |