本帖最后由 hwc2ycy 于 2014-1-19 08:09 编辑
Subtotal 方法 创建指定区域或当前区域(如果该区域为单个单元格时)的分类汇总。
语法: Subtotal(GroupBy, Function, TotalList,Replace, _ PageBreaks, SummaryBelowData)
GroupBy 必选,要作为分组依据的字段,为基于 1 的整数偏移量。 对应上图中的分类字段。 Function 必选,XlConsolidationFunction类型,对应上图中的汇总方式。 可取值如下: xlAverage 平均。 xlCount 计数。 xlCountNums 只计数数值。 xlMax 最大值。 xlMin 最小值。 xlProduct 乘。 xlStDev 基于样本的标准偏差。 xlStDevP 基于全体数据的标准偏差。 xlSum 求和 xlUnknown 未指定任何分类汇总函数。 xlVar 基于样本的方差。 xlVarP 基于全体数据的方差。 TotalList 必选,基于 1 的字段偏移量数组,它指明将被分类汇总的字段。 对应上图中的分类汇总项 Replace 可选,对应上图中的替换当前分类汇总,默认值为 True。 PageBreaks 可选,对应上图中的每组数据分页,默认值为False。 SummaryBelowData 可选,代表汇总行在大纲中相对于明细数据行的位置 。 xlSummaryAbove 0 汇总行在大纲中位于明细数据行的上方。 xlSummaryBelow 1 汇总行在大纲中位于明细数据行的下方,默认值。 这两个取值,可以当成逻辑来看待,True就是在下方,False就是在上方。 对应于上图中的汇总结果果显示在数据下方
返回值:Variant 很多方法的返回值大家在调试代码的时候可以观察下,看看到底返回了什么。
源数据:
示例1: 以库别汇总库汇总库存数量(求和) With Range("a1").CurrentRegion .Sort key1:=.Cells(1, 1), Header:=xlYes '源数据无序,汇总前先排序 '标题行明确指定 .Subtotal groupby:=1, Function:=xlSum, totallist:=6
'以库别字段(第1个)汇总,汇总项为库存数量,汇总方式为求和 '其余参数均以缺省值 .EntireColumn.AutoFit '自动调整列完 End With 效果图(只截取部分):
示例2: 先按库别汇总库数量,再按类别汇总库存金额,汇总方式为求和。 With Range("a1") Application.DisplayAlerts = False '如果针对已经做分类汇总的区域排序,会有确认删除当前分类汇总的提示 .CurrentRegion.Sort key1:=.Cells(1, 1), Header:=xlYes, key2:=.Cells(1, 3),Header:=xlYes Application.DisplayAlerts = True .CurrentRegion.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=6
.CurrentRegion.Subtotal GroupBy:=3, Function:=xlSum, TotalList:=7,Replace:=False '第二次汇总时,Replace为False '其余参数均以缺省值 .CurrentRegion.EntireColumn.AutoFit '自动调整列完 End With
上述代码直接在例1 的生成的汇总中直接使用。
效果图:
RemoveSubtotal 方法 删除列表中的分类汇总。 应在包含分类汇总的数据清单上调用该方法。 如果在不包含分类汇总的区域上调用该方法,会产生如下错误:
示例: Range("a1").CurrentRegion.RemoveSubtotal
问题1:
示例2中的代码为什么一开不用with range(“a1”).CurrentRegion,
而在后面的代码中使用subTotal方法前加上.CurrentRegion限定符
With Range("a1").CurrentRegion
.Subtotal
End With
With Range("a1")
.CurrentRegion.Subtotal
End With
琢磨不透的话建议多代码折腾下,就能发现两者的区别了。
问题2:
如何检测指定的单元格所在的区域中是否有分类汇总?
|