我认为如果您发布更多代码,您将会有更多的运气。下面有一个适用于我的示例(基于具有相同结构数据的现有数据透视表)。
有很多事情会导致“应用程序定义的或对象定义的错误”。
我发现的两个是:
- 不打开记录集
- 找不到数据透视表 - 例如,在我下面的代码中,我通过 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