【问题标题】:Pivot, dynamic data sourcePivot,动态数据源
【发布时间】:2019-01-24 07:39:41
【问题描述】:

我有一个数据透视图,当前的数据源引用了我的表格。

每周我运行我的代码,都会在我的表格底部附加一行新数据。

数据透视表每周都会获取这些新数据,因为它引用了表格,但是,我想每周少花一个星期,所以我有一年的数据。所以我想包括行。

是否可以将我的表格调整为仅包含年份的行?

这是我的示例数据:

+----------+------------------+-----------------+
|   week   |      stack       |    overflow     |
+----------+------------------+-----------------+
| 12/20/17 | -142,335,432.00  | -41,641,109.88  |
| 12/27/17 | -105,428,220.20  | -47,448,990.63  |
| 1/3/18   |  -88,520,154.56  | -24,858,774.97  |
| 1/10/18  |  -42,033,431.10  |  14,573,779.35  |
| 1/17/18  |  -66,101,748.16  |  -8,670,735.22  |
| 1/24/18  |  -75,871,649.12  | -18,000,154.21  |
| 1/31/18  |  -77,027,686.63  | -11,784,198.64  |
| 2/7/18   |  -96,720,126.71  | -52,219,288.98  |
| 2/14/18  | -119,118,554.60  | -34,743,350.28  |
| 2/21/18  | -116,529,554.70  | -20,774,072.93  |
| 2/28/18  |  -86,871,998.53  | -25,993,521.20  |
| 3/7/18   |  -90,351,387.27  | -21,259,727.05  |
| 3/14/18  |  -77,968,076.28  | -51,609,924.29  |
| 3/21/18  | -120,805,352.60  | -40,338,490.97  |
| 3/28/18  |  -92,247,583.62  | -14,525,648.04  |
| 4/4/18   |  -70,821,451.36  | -35,866,864.46  |
| 4/11/18  |  -82,694,486.66  | -59,009,729.82  |
| 4/18/18  |  -79,034,094.39  | -64,231,312.42  |
| 4/25/18  |  -63,415,815.16  | -28,612,265.37  |
| 5/2/18   |  -80,372,191.96  | -53,375,611.61  |
| 5/9/18   |  -72,619,415.73  | -50,642,469.19  |
| 5/16/18  | -109,654,240.70  | -45,762,784.43  |
| 5/23/18  | -100,407,366.50  | -39,577,966.11  |
| 5/30/18  | -105,794,095.80  | -65,071,199.59  |
| 6/6/18   |  -83,630,201.98  | -60,981,969.88  |
| 6/13/18  | -104,644,821.50  | -63,754,760.71  |
| 6/20/18  |  -75,229,424.33  | -55,803,681.24  |
| 6/27/18  |  -65,237,135.62  | -54,693,832.65  |
| 7/4/18   |  -60,025,672.33  | -44,367,918.60  |
| 7/11/18  |  -30,172,175.09  | -28,392,163.28  |
| 7/18/18  |  -20,687,864.39  |  24,300,285.63  |
| 7/25/18  |  -40,476,447.03  |   4,850,881.09  |
| 8/1/18   |  -31,211,625.05  | -67,887,918.30  |
| 8/8/18   |  -29,736,938.87  | -32,905,703.80  |
| 8/15/18  |  -74,934,647.91  | -65,611,884.73  |
| 8/22/18  |  -25,220,747.20  |  -7,019,746.86  |
| 8/29/18  |  -24,608,552.13  |  -8,065,633.97  |
| 9/5/18   |  -30,119,599.95  | -26,225,633.08  |
| 9/12/18  |  -29,836,379.12  | -10,045,560.95  |
| 9/19/18  |  -61,281,567.61  | -58,427,878.27  |
| 9/26/18  |  -47,418,209.59  | -33,451,409.22  |
| 10/3/18  |  -41,321,336.46  | -25,112,764.44  |
| 10/10/18 |   -1,241,932.51  |  21,814,274.35  |
| 10/17/18 |  -19,791,273.66  | -12,199,449.75  |
| 10/24/18 |  -20,501,406.84  |   1,225,387.11  |
| 10/31/18 |  -64,116,464.30  |  -5,308,628.21  |
| 11/7/18  |  -83,657,672.02  | -19,922,992.91  |
| 11/14/18 | -112,704,007.53  | -32,939,535.69  |
| 11/21/18 |  -71,969,954.54  | -51,335,709.79  |
| 11/28/18 |  -79,668,484.56  | -67,887,918.30  |
| 12/5/18  |  -44,134,343.99  | -32,905,703.80  |
| 12/12/18 |  -71,700,079.84  | -65,611,884.73  |
| 12/19/18 |  -82,238,011.30  | -74,725,620.20  |
| 12/26/18 |  -59,385,932.41  | -54,947,256.94  |
| 1/2/19   |  -42,717,830.26  | -31,110,199.14  |
| 1/9/19   |  -11,029,444.63  |   7,309,440.90  |
+----------+------------------+-----------------+

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    更改数据透视表的源范围会很棘手,因为 Excel 不允许在数据透视表中使用不连续的单元格。相反,您可以通过选择整个列来创建数据透视,以考虑所有未来的条目。 然后可以操纵枢轴以显示变化的范围,如下面的代码所示。 希望对你有用。

    编辑

    下面的代码更新为从底部开始包含 50 个(可以更改)。

    Sub MovingPivot()
        Dim ws As Worksheet
        Dim dtTop As Date
        Dim i As Integer, n As Long
    
        Const NumWeeks = 50 'Change this to set weeks range
    
    
        Set ws = ActiveSheet 'Set reference to your worksheet here
    
        'reset the pivot filters
        ws.PivotTables("Table1").PivotFields("Date").ClearAllFilters
        'remove blank values
        ws.PivotTables("Table1").PivotFields("Date").PivotItems("(blank)").Visible = False
    
    
        'find the date entry in 50 places from bottom.
        i = 0
        For n = ws.PivotTables("Table1").RowRange.Count To 1 Step -1
            If i = NumWeeks Then
                dtTop = ws.PivotTables("Table1").RowRange.Cells(n).Value
                Exit For
            End If
            i = i + 1
        Next n
    
        ws.PivotTables("Table1").PivotFields("Date").PivotFilters.Add2 Type:=xlAfterOrEqualTo, Value1:=Format(dtTop, "dd-mmm-yyyy")
    End Sub
    

    【讨论】:

    • 好的,我喜欢这个主意,所以我的数据源应该是所有列,在本例中为 X:AH 。在这段代码中我可以在哪里修改它以从最后一行获取 50 行?
    • 是的,数据源应该是整个列(假设您的标题行位于第 1 行)。请参阅上面的更新代码以设置从底部开始的 50 周。
    • 尝试第二次,这次数据源不在一个表中,实际上是另一个表。我在For n = ActiveSheet.PivotTables("scencount").RowRange.Count To 1 Step -1 在线收到unable to get the rowrange property of the PivotTable class
    • Hansraj 你在吗?
    • 我已经更新了代码。 Activesheet 仅适用于当前活动的工作表。如果您的数据透视表在另一张表中,请使用该表参考。在 set ws = Activesheet 行中,替换为 set ws = thisworkbook.worksheets("nameof yoursheet")
    【解决方案2】:

    如果您想继续使用数据透视图,可以使用时间线切片器来包含/排除数据。数据刷新后,您需要手动调整时间线或过滤器。或者编写VBA来设置过滤器。

    不需要切片器的非 vba 版本也可以使用标准图表(不是数据透视图)来实现。使用仅获取您感兴趣的数据行的偏移函数创建命名范围,然后将这些范围名称插入标准图表。当新数据添加到表中时,标准图表的命名范围也将更新。

    如果你需要一步一步,看看https://peltiertech.com/Excel/Charts/DynamicLast12.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-15
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 2014-06-12
      • 2015-02-27
      • 2021-02-21
      相关资源
      最近更新 更多