1、假设你的数据工作表名为:sheet1,定义名称:按ctrl+f3,名称输入
data,值输入
=offset(sheet1!$a$1:$c$1,,,match(9.9e+307,sheet1!$c:$c))
确定。
2、数据--数据透视表和数据透视图---下一步,在出现的选定区域里输入
=data
,点击“完成”。
3、将你的“型号”、“日期”项拖进行字段,数量拖进数据项。点击“型号”项右下角的下拉三角形,把“空白”的勾去掉。
4、增加或删除了sheet1的数据后,右键点击“数据透视表”,点“刷新”就自动按型号统计了。
=====================================
match(9.9e+307,sheet1!$c:$c))
意思是找出有数据的最后一行的行号,因为你的c列是数量,是数字,而9.9e+307在excel中是个非常大的数(excel极限了),所以用match来找9.9e+307这个最大的数,当然在你的数量一列中是找不到这么大的数的,所以match就返回最后一个数据,也就是c列最后的数据的行号。结合offset使用就返回你的数据区域了,定义了名称后,这个区域就是动态变化的,通过这种方法做的透视表就是动态数据透视表,只需刷新下表格结果就根着变了,不用再做一次透视了!
======================================
sort=offset(a1,1,,counta(a:a)-1,)
先解释counta(a:a),这是求a列中非数字型单元格的个数,如果你a列是姓名之类的数据就可用counta,如果是日期或者其它数字就应用count()。定义的sort名称是求的数据区域,这个区域是以a2开始,行数为a列中文本型单元格个数-1。其实以你的情况,a列中有空单元格,这种方法根本不能求到a列的数据区域!!而应该用我给你的match(9.9e+307,$c:$c)函数!
index(sort,small(if(match(sort,sort,0)=row(sort)-1,row(sort)-1),row(1:1)))
这个公式本意是求不重复的数据,if(match(sort,sort,0)=row(sort)-1,row(sort)-1)如果,match找到的数据位置和行号-1相同就返回行号-1,small(if(match(sort,sort,0)=row(sort)-1,row(sort)-1),row(1:1))求不重复数据的行号的第一个最小值,公式下拉就是第二个,第三个最小值...最后用index来返回数据。不明白你可以抹黑公式,按f9查看中间结果。
假如我选中B1:B10,为这个区域定义一个名称,可是,如果我在B11以后增加记录,还用原来的名称,B11向后就不能纳入区域进行运算了,这时就需要定义动态名称
即函数每次都计算这个列的所有记录个数,根据这个个数来设定名称区域的高度
比如某个名称的定义公式 =offset($B$1,0,0,counta(B:B))
那么就意味着这个名称所引用的区域最左上的单元格为B1,区域高度为B列记录个数(注意,两个0表是引用区域左上角单元格是以B1为起点,向下和向右各移动0个单元格,也就是B1)