来自VB6中记录集的数据透视表

时间:2013-05-31 23:36:12

标签: excel vb6

我在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")

有什么方法可以改变它来使用现有的数据透视表而不是创建一个新的数据透视表?或者我是否在更改导致错误的记录集时出错?

2 个答案:

答案 0 :(得分:0)

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

Set xlptCache.Recordset = pivotRecordSet

而不是你拥有它:

Set xlptTable = xlWSheet.PivotTables.Add(xlptCache, Range("D4"), "PT_Report")

答案 1 :(得分:0)

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

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

我找到的两个是:

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

查看您的代码有几件事我觉得有问题,您可能想要查看:

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

我认为你应该按名称引用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