【求助】50nb奖金,怎样在excel中合并相同项等,说得不清楚,请大家看举例。
就是把图1变成图2的样子,谢谢大侠帮助!图2不清楚可以点开放大来看。
[ 本帖最后由 abenzhu 于 2007-5-29 15:38 编辑 ] 楼主是管计划生育的?? 我会用excel公式把前三项的重复项去除,然后把全部内容复制成文本形式,用文本编辑器替换特定的换行符和制表符,再复制回去 如图:
第一步到第二步:用如图公式把重复的项目替换成空白
第二步到第三步:选中第二步表格中的内容,复制,到文本编辑器中粘贴,然后选择替换(文本编辑器要支持转义字符功能,如EmEditor),将“\n\t”全部替换为“\t”(即相当于把换行后第一格为空白的换行符去掉),然后全选,粘贴回excel即可 这表格中的有些数据是不协调的. 以上两种做法,基本思路都是去掉重复的前一部分,然后将有用部分的换行取消,但都不能满足LZ的目标表格中,第一个孩子在第一部分,第二个在第二部分的排序要求。
而且如何自动判断哪些是重复的项应当留白呢?如果不能自动判断,如果这个表很长(应当是这样,夫妻对数可想而知),全靠人工?
试验出来一种方法,公式很复杂,还需要加入两个用于关键字整合的列,不过需要LZ做的操作倒不算难,主要难的是公式。出门干活,回来再说。列出最主要的一个单元格公式:=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))
[ 本帖最后由 larryh 于 2007-5-31 09:41 编辑 ] 注:为了处理方便,我将原始工作表标签从缺省的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 编辑 ] LZ呢?有没有奖金无所谓,LZ没看到我就白做了 LS的实在是高 如果楼主熟悉SQL语言,建议你导入SQLServer用语句简单的多。 筛选不行吗 高手,我来帮楼主送花。
页:
[1]