【问题标题】:Excel VBA change data souce based on reference valueExcel VBA根据参考值更改数据源
【发布时间】:2017-02-24 19:26:49
【问题描述】:

我无法弄清楚如何使用 VBA 更改数据透视表的数据源。

我在 Sheet1 中有数据源,在 Sheet 2 中有数据源

Sheets("Sheet1").Select 
LastRow = ActiveSheet.Range("A1").Offset(ActiveSheet.Rows.count - 1, 0).End(xlUp).Row
sNewSource = ActiveSheet.Name & "!" & Range("A19:X" & LastRow).Address(ReferenceStyle:=xlR1C1)

ActiveSheet.PivotTables("PivotTable1").ChangePivotCache _
  ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _
  SourceData:=sNewSource, Version:=xlPivotTableVersion14)

目前我收到一条错误消息:无法正确获取 Worksheet 类的数据透视表

我尝试查看其他解决方案,但我不知道它在哪里不起作用。

有什么想法吗?

【问题讨论】:

  • 根据您在以下答案之一中的评论,您是否因为动态数据而更改数据源?如果是,首先创建一个名称范围来处理动态数据,然后将其用于数据透视表。
  • 为什么 SourceData:=sNewSource 仍然无法正常工作?
  • 那么当您尝试答案中给出的两个选项时会发生什么...?

标签: vba excel pivot


【解决方案1】:

这不是对您问题的直接答案,而是一个解释如何才能做得更好的机会。

所有这些选项都涉及创建一个命名范围表名,您可以将其用作数据透视表的数据源

选项 1

为您的数据指定一个命名范围并让 VBA 更新该命名范围

With ThisWorkbook.Names.Item("myRange")
    .RefersTo = Range(.RefersToRange, .RefersToRange.End(xlDown))
End With

选项 2

为您的数据提供一个动态命名范围。源参考可能如下所示:

=OFFSET(A1,,,COUNTA(A:A),COUNTA(1:1))

注意,OFFSET 是一个 volatile 函数,会降低更大的工作簿的速度

选项 3

将您的数据放入数据表。当您将数据格式化为表格时,当您在下面添加新数据时,excel 会自动调整大小

【讨论】:

    【解决方案2】:

    使用SelectActiveSheet 时经常会出现问题。当 Sheet1 上可能没有数据透视表时,您尝试访问 Sheet1 上的数据透视表(正如您所说,您的数据透视表在 Sheet2 上)。

    这可以通过完全限定您的引用来解决 - 这意味着明确说明您希望使用哪个工作簿和哪个工作表。

    考虑到这一点,这行得通吗? (未经测试)

    With ThisWorkbook.Worksheets("Sheet1")
        LastRow = .Range("A1").Offset(.Rows.count - 1, 0).End(xlUp).Row
        sNewSource = .Name & "!" & .Range("A19:X" & LastRow).Address(ReferenceStyle:=xlR1C1)
    End With
    
    With ThisWorkbook.Worksheets("Sheet2")
        .PivotTables("PivotTable1").ChangePivotCache .PivotCaches.Create(SourceType:=xlDatabase, SourceData:=sNewSource, Version:=xlPivotTableVersion14)
    End With
    

    【讨论】:

    • .Range("A1").Offset(ActiveSheet.Rows.count - 1, 0).End(xlUp).Row更改为.Range("A1").Offset(.Rows.count - 1, 0).End(xlUp).Row
    • 我收到另一条错误消息:对象不支持此属性或方法
    • @CallumDA 我想他想在同一张表中拥有PivotTable,“Sheet1”,也许他没有“Sheet2”?
    • 我现在很困惑。读起来好像他在 Sheet2 中有他的 PT,在 Sheet1 中有数据(几乎是引用)。从他的代码来看,他想用最新数据更新数据透视表,因为它被添加到 Sheet1 中他的数据底部? @Selrac,你能澄清一下吗?
    • Sheet 1 中的数据有时会多一些,有时会少一些。我不是这种情况,因为数据将被添加到底部。我不确定它对代码有什么影响
    【解决方案3】:

    感谢所有建议。最后我设法使它与以下代码一起工作:

    Sheets("Sheet1").Select ' Data Source
    LastRow = ActiveSheet.Range("A1").Offset(ActiveSheet.Rows.Count - 1, 0).End(xlUp).Row
    sNewSource = ActiveSheet.Name & "!" & Range("A1:B" & LastRow).Address(ReferenceStyle:=xlR1C1)
    sNewSource = "C:\xxx\[test.xlsm]" & sNewSource
    
    Sheets("Sheet2").Select ' Pivot Table
    ActiveSheet.PivotTables("PivotTable1").ChangePivotCache ActiveWorkbook. _
            PivotCaches.Create(SourceType:=xlDatabase, SourceData:=sNewSource, Version:= _
            xlPivotTableVersion14)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 2014-03-06
      相关资源
      最近更新 更多