这个疑问是看狗尾草版主贴子时遇到的,看贴前脑子还真是混乱,经整理清晰多了.
gouweicao78常见用数组公式取得多条记录的开头都是=if(row(1:1)>XXX,""……表示当公式下拉复制超过一定行数(满足条件记录的个数)时,显示为空。书写方式有row()-n、row(1:1)、rows($1:1),前2个得到的是一个{}1行1列的数组,后一个得到的是一个单值,此外,如果未知数据行数要形成“多单元格数组公式”,则必须使用row()-n的形式;如果已确定要得到记录的行数,则也可以用row(1:X)实现。比如:=IF(ROW(1:6)>COUNTIF(A1:A6,">0"),"",SMALL(IF(A1:A6>0,A1:A6),ROW(1:6)))——谢谢gvntw版主补充。
备注:n是公式所在第一行的上一行的行号。比如在A7输入第一个公式,则n=6。
一般的Row(1:1)由于是相对引用,在公式下拖复制时变成Row(2:2)、Row(3:3)分别返回{2}、{3}等,用以结合SMALL函数将数组从小到大输出。
column函数与row函数很相似,但由于工作表中最大行数是65536(4^8)而列数是256,所以在大多时候都用column(1:1),返回的是一个数组:{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256},这个数组一般应用中够用了.而如果在单个单元格输入的时候,只显示1.
Apolloh更是一语中的:min(),max(),large(x,1),small(x,1),可将row()产生的单值数组转换成常量。
Gdiyy的讨论使我对这个概念的理解更加深入:
1、Rows()其结果返回行数--单值,而Row()则返回行号--单值或多值,所以Rows()返回是单值常量,而Row()则返回常量数组。
2、并不是Row(1:1)不出错,只是你的例子看似比较特殊Rows(A1:A1),仅仅引用了一个单元格,当你删除1整行,Row(1:1)还是报错的。这也从侧面反映了--在Excel中,当参数引用范围全部丢失时,系统会自动识别为引用无效(#REF!)的。
3、对于运算速度,我觉得应该是Rows()快一些,这可能与Rows()本身的函数性质有关吧:)
Czzqb: 说说关于ROW(1:1)的看法,与楼主提的ROWS()无关
ROW(1:1)的最简单的用法如下:
A1:A10里存放了10个数字,要在A11:A20里把它从小到大排列出来,有以下几个写法(自定义名称DATA1=$A$1:$A$10):
1, SMALL(DATA1,ROW(A1)),下拉
2, SMALL(DATA1,ROW(1:1)),下拉
3, SMALL(DATA1,ROW(INDIRECT("A"&ROW()-10))),下拉
4, 多单元格数组公式:SMALL(DATA1,ROW(INDIRECT("1:10")))
5, 多单元格数组公式:SMALL(DATA1,ROW(DATA1))
哪个好用?
公式1和2,3的计算速度应该比4和5要慢,因为它有10个公式,要计算10次,而后两个公式只计算一次,就填入10个单元格;另外,更致命的是,一旦删除数据区的某一行,将造成显示结果错误。
公式4与5,删除数据区不会造成错误,速度块。
而公式4与5相比:公式4使用了易失函数,会引发大量的重算,速度也受到很大影响,而公式5则没有这个问题。
我的总结:多单元格数组公式:SMALL(DATA1,ROW(DATA1))在此例是最好的。其他的地方恐怕要受到限制,因为ROW()得到的只是DATA1区域的行数,要想得到更多的行数,还是要用第4个公式。要用多单元格数组公式时,=rows($1:1)和=row(1:1)都只能返回一系列的1,只有用=row()-公式上一行的行号
才能返回1、2、3……这个系列。(补充,还有已知行数x,用row(1:x)也可以。)
Rows(ref)/Columns(ref)函数传回的是ref所表示的单元格区域或数组所包含的行数或列数,为基本数据类型,比较简单,运算速度较快。
Row([ref])/Column([ref])函数传回的是ref所表示的单元格区域所包含的行号和列好的集合,为数字数组类型,适合数组应用;同时,因为Excel在非数组运算过程中会自动将数组名称替换为数组中的第一个数字使用,所以亦可以在省略部分数据的情况下作为基本数据类型使用。因为在产生数组的过程中的计算量和保存数组所消耗的内存量较大,所以运算速度较慢。
[ 本帖最后由 lrlxxqxa 于 2010-11-26 22:14 编辑 ] |