为什么Excel.Range.Group的Periods参数采用数组?

时间:2013-09-25 17:49:41

标签: arrays excel-vba grouping pivot-table vba

最近我学习了如何使用VBA在Excel中自动创建数据透视表,而Excel.Range.Group()方法的实现让我觉得奇怪。第四个参数Periods采用7个元素的布尔值数组来指示分组是按秒,分钟,小时,天,月,季度还是年。通常,您会看到使用Enum类型完成此类操作,其成员可以Or一起表示已打开一个或多个选项 - {{3那个。

例如,我原本期望使用更像这样......

MyPivotTable.DataRange.Cells(1).Group Periods:=vbGroupPeriods.Days Or _
    vbGroupPeriods.Months

而不是......

MyPivotTable.DataRange.Cells(1).Group Periods:=Array(False, False, False, _
    True, True, False, False)

我环顾四周试图理解为什么用Array来完成,但迄今为止空手而归。所以,我的问题是为什么这样做?我有没有看到一些限制?这是个人的个人选择吗?还是只是一个谜?不要试图抱怨,只是想了解。

2 个答案:

答案 0 :(得分:2)

  

Q1。为什么这样做?

也许是因为它为您提供了更大的灵活性?对我来说,输入True 7次

更容易
Array(True, True, True, True, True, True, True)

而不是说

vbGroupPeriods.Seconds Or _
vbGroupPeriods.Minutes Or _
vbGroupPeriods.Hours Or _
vbGroupPeriods.Days Or _
vbGroupPeriods.Months Or _
vbGroupPeriods.Quarters Or _
vbGroupPeriods.Years 

阵列中的序列也不是很难记住......

秒 - >分钟 - >小时 - >天 - >月 - >季度 - >年

  

Q2。我有没有看到一些限制?

否没有这样的限制。

  

Q3。这是个人的个人选择吗?还是只是一个谜?

没有:)没有神秘感。这绝不是某人的个人选择。有一个专门针对Microsoft Excel开发的团队,负责决定和灌输特定的功能。

答案 1 :(得分:0)

在Siddharth Rout的答案中,这是我发现的地方和发现:

[http://www.globaliconnect.com/excel/index.php?option=com_content&view=article&id=153:excel-pivot-tables-grouping-group-items-group-data-and-group-date-values-using-vba&catid=79&Itemid=475][1]

使用分组方法将数字项目或日期值分组。语法:RangeObjectVariable.Group(开始,结束,依据,句点)。 “开始”,“结束”,“按时间段”和“句点”的所有4个参数都是可选的,并在下面说明。

开始-分组从该值开始,如果省略或为True,则表示该字段中的第一个值。

结束-分组以该值结束,如果省略或为True,则表示字段中的最后一个值。

依据-指定数字字段的组大小;对于日期字段,它指示在Periods参数中将数组元素4(天)设置为True并将所有其他元素设置为False的天数,否则将忽略此参数并为组选择默认大小。

期间-由7个布尔值组成的数组:

  • 元素1表示秒数
  • 元素2是分钟
  • 元素3是小时
  • 元素4是天
  • 元素5是月份
  • 元素6是四分之一
  • 元素7是Years。

Bollean值为True的元素表示创建组的时间段。此Periods参数仅对Date字段有效。

可能会注意到RangeObject只能是单个单元格,否则该方法将失败而不会显示任何错误。

Sub PivotTableGroupData1()


Dim PvtTbl As PivotTable
Dim rngGroup As Range
Set PvtTbl = Worksheets("Sheet6").PivotTables("PivotTable1")

'set range of dates to be grouped
Set rngGroup = PvtTbl.PivotFields("Dates").DataRange

'rngGroup.Cells(1) indicates the first cell in the range of rngGroup - remember    that the RangeObject in the Group Method should only be a single cell otherwise the method will fail.
rngGroup.Cells(1).Group Periods:=Array(False, False, False, True, True, True, False)

'to ungroup:
'rngGroup.Cells(1).Ungroup


End Sub

我想补充一点,我花了几个月的时间才能找到“期间”的确切定义。以为我会分享...