一、多表拆分应用
例1按设备类别实现总表拆分到分表
如图1所示,展示了一份培训部门设备明细表,其中总表保护焊了所有类别的设备信息数据,同时还存在两个结构相同的工作表——服务器和微机,下面的公式将实现总表的数据按“设备类型”名称拆分到其他分表中。
为了保证数据动态更新,首先将总表“设备明细”创建为Excel
2010的表。
(1)总表数据将被定义为系统级名称:表1
=设备明细!$A$2:$H$14
名称公式中利用MATCH函数取得数据表有效区域的动态名称。
(2)取得当前工作表标签名的名称ShtName:
=MID(CELL(“FileName”,!A1),FIND(“]”,CELL(“FileName”,!A1))+1,255)
下面以名为“服务器”的工作表为例进行介绍,提取结果如图2所示。
在工作表“服务器”中A2单元格提取的数组公式如下:
{=IF(COUNTIF(设备明细!$B:$B,ShtName)<(Row()-1),””,INDEX(设备明细!$A$A,SMALL(IF(表1=ShtName,Row(表1)),ROW()-1)))}
公式中主要利用SMALL函数结合IF函数提取出满足设备类型为“服务器”的记录行号,再利用INDEX函数来提取具体的设备编号。
列出所有满足条件的设备编号后,在B2单元格提取出其他信息公式如下:
=IF($A2=””,””,VLOOKUP($A2,表1,COLUMN(),0))&””
由于总表中的单号不重复,因此,直接利用VLOOKUP函数返回其他信息。
另外,对于工作表签名为“微机”的数据表的提取方法完全相同,这里不再赘述。
二、分表合并总表应用
如在认识部门的工作中,如果希望将这个部门的员工列表汇总到总表,虽然如果直接复制粘贴也可以达到目的,但认识数据如果经常变动,那使用函数公式来生成动态的结果就不失是一种解决问题的实用方法。
表2将人员明细表汇总到总表
如图3所示,模拟了某企业的各部门的人员信息表,其中各部门由综合部、办公室、技术部和研发部组成,下面将仅通过函数公式将三表人员信息进行合并到总表。
首先,需要利用行序号取得各表的人员信息,就必须准确地定位到各表的第2行数据。本示例的多表汇总的一个技术要点即是利用数据重构技术来重新生成内存数组。
为便于读者理解,首先将公式中涉及到的要点定义为名称如下。
(1)工作表名称ShtName:
={“综合部”;”技术部”;”研发部”}
在实际应用中,如果各部门名称经常变动,则可以利用“宏表函数”来取得部门名称。
(2)各表记录数SData:
=COUNTIF(INDIRECT(ShtName&”!A1:A20”),”<>”)
利用三维引用取得各表的记录数,结果为:{3;2;5}。
(3)内存数组累加RecNum:
=MMULT(N(ROW(INDIRECT(“1:”&COUNT(SData)))>COLUMN(INDIRECT(“c1:c”&COUNT(SData),0))),SData)
该名称主要利用累加技术对内存数组进行逐值累加,结果为{0;3;5}。
通过前面的名称定义,再结合多个名称进行内存运算,就能得到各表的数据记录的各表的记录序号,再利用引用函数返回具体的人员信息。如A2单元格公式如下:
=IF(ROWC)>SUM(SData)+1,””,OFFSET(INDIRECT(LOOKUP(ROW(),RecNum+2,shtName)&”!A!”),ROW()-LOOKUP(ROW(A1),RecNum+1),COLUMN()-1))
(1)定位各表首个单元格A1公式段
INDIRECT(LOOKUP(ROW(),RecNum+2,shtName)&”!A!”)
利用LOOKUP函数查找当前行,并返回对应的数据表名,通过INDIRECT函数返回各表的A1单元格引用。
(2)多表定位明细数据行公式段
ROW()-LOOKUP(ROW(A1),RecNum+1)
该行通过行号1~12利用LOOKUP函数近似查找,返回第2列的累计数,再两列相减,即可返回各表的记录行序号。为便于读者理解,特将公式内部运算过程列出,如图4所示。
�M,�̶����