1

我在 Excel 文件中有一个数据透视表,我希望将其与记录集中的数据一起使用。到目前为止,这就是我所拥有的

Dim xlApp As Excel.Application
Dim xlWbook As Excel.Workbook
Dim xlWSheet As Excel.Worksheet
Dim xlptCache As Excel.PivotCache
Dim xlptTable As Excel.PivotTable
Dim pivotRecordSet As ADODB.Recordset
'Open Excel File and set data for pivotRecordSet

With xlWbook
    Set xlWSheet = .Worksheets("Sheet1")        
    Set xlptCache = .PivotCaches.Add(SourceType:=xlExternal)
    'Trying this gives me an Application-defined or object-defined error
    'Set .PivotCaches.item(0).Recordset = pivotRecordSet
End With
'I also tried this with the same error when setting the recordset
Set xlptTable = xlWSheet.PivotTables("PivotTable1")
Set xlptTable.PivotCache.Recordset = pivotRecordSet

我知道我可以用这个创建一个新的数据透视表

 Set xlptTable = 
 xlWSheet.PivotTables.Add(PivotCache:=xlptCache,   
 TableDestination:=xlWSheet.Range("D4"),tablename:="PT_Report")

有什么办法可以改变它以使用现有的数据透视表而不是创建一个新的?还是我在更改导致错误的记录集时做错了什么?

4

2 回答 2

0

要更正您评论的错误,请尝试以下操作:

Set xlptCache.Recordset = pivotRecordSet

而不是你所拥有的:

Set xlptTable = xlWSheet.PivotTables.Add(xlptCache, Range("D4"), "PT_Report")
于 2013-06-01T06:24:51.020 回答
0

我认为如果您发布更多代码,您将会有更多的运气。下面有一个适用于我的示例(基于具有相同结构数据的现有数据透视表)。

有很多事情会导致“应用程序定义的或对象定义的错误”。

我发现的两个是:

  • 不打开记录集
  • 找不到数据透视表 - 例如,在我下面的代码中,我通过 ActiveSheet 引用数据透视表 - 如果我在 Excel 中选择一个没有数据透视表的工作表,我会收到该错误。

查看您的代码,我发现有几件事值得怀疑,您可能需要查看:

  • Set xlptCache = .PivotCaches.Add(SourceType:=xlExternal)- 为什么要添加PivotCache?您需要更新属于现有数据透视表的数据透视缓存。
  • Set .PivotCaches.item(0).Recordset = pivotRecordSet- 我也不喜欢这样,因为您没有引用特定的 PivotCache - 只是工作表上的第一个。

我认为您应该PivotTable按名称引用,然后访问PivotCache属于该名称的(见下文)。

我建议你做的是启动你的调试器并逐步检查,并确保在找到它之前打开记录集,确保你实际上引用了正确的数据透视表,获取该 PivotCache 并检查正确的对象被卡在正确的位置。

以下代码适用于我的机器(使用 Excel 2010)。

请注意:我用ActiveWorkbook.ActiveSheet- 来说明获取错误的一种方法。您的使用机制.Worksheets("Sheet1")对于实际代码来说是一个更好的主意。

Sub changePivot()


  Dim cnnConn As ADODB.Connection
  Dim rstRecordset As ADODB.Recordset
  Dim cmdCommand As ADODB.Command

  ' Open the connection.
  Set cnnConn = New ADODB.Connection
  With cnnConn
    .ConnectionString = _
    "Provider=Microsoft.Jet.OLEDB.4.0"
    .Open "C:\Users\gregh\Documents\Database1.mdb"
  End With

  ' Set the command text.
  Set cmdCommand = New ADODB.Command
  Set cmdCommand.ActiveConnection = cnnConn
  With cmdCommand
   .CommandText = "Select Speed, Pressure, Time From DynoRun2"
   .CommandType = adCmdText
   .Execute
  End With

  ' Open the recordset.
  Set rstRecordset = New ADODB.Recordset
  Set rstRecordset.ActiveConnection = cnnConn

  ' if you don't do this, you get the error
  rstRecordset.Open cmdCommand


  Dim sh As Excel.Worksheet
  Dim pt As Excel.PivotTable
  Dim pc As Excel.PivotCache


  ' Get a hold on the pivot table then the cache

  ' I can trigger the error you mentioned if the ActiveSheet doesn't have the pivot table
  ' Your mechanism of referring to the sheet by name is a much better idea.
  Set sh = ActiveWorkbook.ActiveSheet

  Set pt = sh.PivotTables("Performance")
  Set pc = pt.PivotCache

  Set pc.Recordset = rstRecordset

  ' The PivotTable doesn't update until you call this 
  pc.Refresh


  ' Close the connections and clean up.
  cnnConn.Close
  Set cmdCommand = Nothing
  Set rstRecordset = Nothing
  Set cnnConn = Nothing

End Sub
于 2013-06-08T00:29:22.827 回答