本题的解题思路可分为三个层次(以当前给定数据为例)。 一、建立两个数组X1、Y1: X1={1,2,FALSE,4,FALSE,FALSE} Y1={1;2;3;4;5;FALSE;7;8;9;10;11;FALSE;FALSE;FALSE;15;16;17;18;FALSE;FALSE;21;22;23;24} 分别与数据Data中无空格的行列对应,数值代表行号和列号。 在朋友们的答案中,建立数组X1、Y1的方法,主要有:
1、MMULT()函数法: X1=IF(MMULT(COLUMN(INDIRECT("rc1:rc"&ROWS(data),))^0,0+IF(data="",COLUMN(data)))=0,COLUMN(INDIRECT("rc1:rc"&COLUMNS(data),))) Y1=IF(MMULT(0+IF(data="",COLUMN(data)),ROW(INDIRECT("1:"&COLUMNS(data)))^0)=0,ROW(INDIRECT("1:"&ROWS(data)))) 公式可简化为: X1=IF(MMULT(TRANSPOSE(ROW(data))^0,0+IF(data="",COLUMN(data)))=0,COLUMN(data)-2) Y1=IF(MMULT(0+IF(data="",COLUMN(data)),TRANSPOSE(COLUMN(data))^0)=0,ROW(data)-2) 2、MMULT()函数法: X1=IF(TRANSPOSE(MMULT(IF(TRANSPOSE(data)<>"",0,1),ROW(data)^0))=0,COLUMN(data)-2) Y1=IF(MMULT(IF(data<>"",0,1),ROW(题目!$C$3:$C$8)^0)=0,ROW(data)-2) 3、SUBTOTAL()函数法: X1=IF(SUBTOTAL(2,OFFSET(data,,COLUMN(data)-3,,1))=ROWS(data),COLUMN(data)-2) Y1=IF(SUBTOTAL(2,OFFSET(data,ROW(data)-3,,1))=COLUMNS(data),ROW(data)-2) 4、MATCH()函数法: X1=IF(ISNA(MATCH(COLUMN(data),SMALL(IF(data="",COLUMN(data)),COLUMN(INDIRECT("1:"&COUNTIF(data,"")))),0)),COLUMN(data)-2) Y1=IF(ISNA(MATCH(ROW(data),SMALL(IF(data="",ROW(data)),ROW(INDIRECT("1:"&COUNTIF(data,"")))),0)),ROW(data)-2) 5、FREQUENCY()函数法: X1=IF(TRANSPOSE(FREQUENCY(IF(data<>"",COLUMN(data)),COLUMN(data))=ROWS(data)),COLUMN(data)-2) Y1=IF(FREQUENCY(IF(data<>"",ROW(data)),ROW(data))=COLUMNS(data),ROW(data)-2) 二、根据X1、Y1,把行号和列号按从小到大顺序排列,生成数组X、Y: X={1,2,4,#NUM!,#NUM!,#NUM!} Y={1;2;3;4;5;7;8;9;10;11;15;16;17;18;21;22;23;24;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!;#NUM!} 方法大同小异: X=SMALL(X1,COLUMN(data)-2) Y=SMALL(Y,ROW(data)-2) 三、在目标区域用公式Index(Data,Y,X)返回原始数据表中相应单元格的值。 为了不显示错误值,一般可用ISERROR()函数处理: =IF(ISERROR(INDEX(data,Y,X)),"",INDEX(data,Y,X)) 在解题过程中,还有不少细微处的变化,从朋友们的答案中细细琢磨,另有一番情趣。 在审题过程中,得到 czzqb 兄的帮助,在此感谢。
[此贴子已经被作者于2006-8-30 17:53:06编辑过] |