|
发表于 2007-5-30 21:15:41| 字数 2,420| - 中国–宁夏–银川 电信
|
显示全部楼层
注:为了处理方便,我将原始工作表标签从缺省的Sheet1修改为Data,以后公式中涉及“Data!...”的全部为对原始表的引用。
=================================================
关系数据库表结构分析:
唯一确定一对夫妻的条件,显然是“单位名称+妇女姓名+丈夫姓名”,此所谓Primary Key(主键),这样由多个字段组成主键,学名是复合主键(Compound Primary Key),这个主键,在形式上和内容上应当统一,所以需要把3个字段的内容相加得到。
然后,LZ还需要在结果表中将小孩按先后排序后输出,所以这里还需要一个次要关键字:孩次,当“单位名称+妇女姓名+丈夫姓名”唯一确定后,结果表中还需要“孩次”来确定数据所在的单元格位置,这个“孩次”就属于次键(Secondary Key)。
唯一确定夫妻的,是上面说的复合主键,唯一确定小孩的,是复合主键+次键,这两个内容就是我们要生成的附加列的内容(相当于给数据库表依照主键、主键+次键建两个索引)
=================================================
步骤:
1、首先,在原表格前后加上两个列,主键+次键放在第一列,主键放最后一列,如此设计纯为了后面公式计算方便。
其中,第一列每个单元格的公式是:- =INDEX(Data!$A:$I,ROW(),2)&INDEX(Data!$A:$I,ROW(),3)&INDEX(Data!$A:$I,ROW(),4)&INDEX(Data!$A:$I,ROW(),6)
复制代码 其中,&运算符是EXCEL中将&前后内容当作字符串进行合并的运算符,等同于CONCATENATE函数。INDEX函数返回指定范围内指定行列号位置处的单元格值。
最后一列每个单元格的公式是:- =INDEX(Data!$A:$I,ROW(),2)&INDEX(Data!$A:$I,ROW(),3)&INDEX(Data!$A:$I,ROW(),4)
复制代码 如图所示:
2、需要以主键+次键为索引对表格所有行进行排序,以便在目标表格中去除主键+次键都相同的重复行,得到目标表格的头一部分。其实对于EXCEL 2007来说,在第一步根据主键(3个字段)+次键(1个字段)进行排序也是可以的,我就是这么做,所以上图看出来已经排好序,但考虑到LZ不一定用的EXCEL 2007,那么以前版本不支持超过3个列作为关键字排序,所以先做第一步得到“关键字合并1”然后根据其来排序是通用的办法。
数据排序就简单了,Ctrl+A选中整个表,在主菜单中找到“数据”部分,然后选排序,把第一列作为关键字就行了。得到结果同上图。
3、建立目标表格:
在同一工作簿中新建一个工作表,把原表的“单位名称”、“妇女姓名”、“丈夫姓名”及“关键字合并2”全部按此顺序复制到新表,然后全选,用“删除重复项”功能将重复的行删除,结果如图所示:
然后把“孩子姓名”、“孩次”、“性别”、“孩子出生日期”依序复制到第一行后面部分,每对夫妻容许在表格中存在多少个孩子的最大数量,例如5,就复制5次,结果如图所示:
4、最重要的动作到来,把同一公式填入各个空白单元格:- =IF(ISNA(VLOOKUP(INDEX($D:$D,ROW(),1)&INT((COLUMN()-1)/4),Data!$A:$H,5+MOD(COLUMN()-1,4),FALSE)),"",VLOOKUP(INDEX($D:$D,ROW(),1)&INT((COLUMN()-1)/4),Data!$A:$H,5+MOD(COLUMN()-1,4),FALSE))
复制代码 最核心的公式是- VLOOKUP(INDEX($D:$D,ROW(),1)&INT((COLUMN()-1)/4),Data!$A:$H,5+MOD(COLUMN()-1,4),FALSE)
复制代码 VLOOKUP从一个给定范围中,比对其第一列中的值与给定值是否相符,如果相符,可以从给定范围中的指定列(用范围内的列顺序号表示)取出其单元格值,填入当前单元格。我们就是用“关键字合并2”中的值,接续上“孩次”号(公式:- INDEX($D:$D,ROW(),1)&INT((COLUMN()-1)/4)
复制代码 ),作为索引关键字,从第一个表中拿出相应孩子的对应单元格信息,填入当前单元格。
注意到以上完整公式在两处出现了相同的核心公式,目的是当某夫妻在没有后续孩子(例如第一对夫妻的第3个孩子不存在)时,得到的原始表查询结果是非法(如果显示出来,是#N/A),那么IF函数用于当结果非法时(用ISNA函数来判断),输出空值"",否则输出实际值。
注意:为了避免单元格公式复制中,EXCEL自动变化行列号的麻烦,所有引用全部是绝对引用,所有单元格行列号的变化全部用函数获取来实现,这就保证了所有后续单元格可以用完全相同的公式,一个字符也不差。
当第一行所有后续单元格用这同一公式填充后,就可以选中从第一个“孩子姓名”列开始,直到最后一个“孩子出生日期”结束,然后点中选择区域右下角的小黑块(学名填充柄)向下拖拉直到表格最后一行,所有结果将出现,如图所示:
收尾:在目标表中,把“关键字合并2”列隐藏掉(不可删除,删除了后续公式将无计算依托),即可。如果希望这结果表可以不依赖原始表单独使用,可以将结果表复制一份副本(在工作表标签上鼠标右键→移动或复制工作表→确保选中“建立副本”项),将副本内容全部清空,在目标表中全选,到副本表,在“编辑”菜单中选择“选择性粘贴”→”粘贴值“,即可,副本表中将无任何公式,只有结果值,这个副本表可以单独使用。
[ 本帖最后由 larryh 于 2007-6-2 19:00 编辑 ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|
X230 2324-B14, i7-3520M, 16GB, SAMSUNG 840 EVO mSATA 1TB SSD
MECHREVO Z3 Air-S i7-10875H, 16GB, RTX2060 6G, 镁光1100 SATA 2TB
Lenovo R9000X R7-5800H, 16GB, RTX3060 6G, WD SN750 2TB+PNY CS3040 2TB
|