もっと多くのコードを投稿すれば、もっと幸運になると思います。以下に、私にとってうまくいく例があります(同じ構造データを持つ既存のピボットテーブルに基づいています)。
「アプリケーション定義またはオブジェクト定義のエラー」の原因となるものはたくさんあります。
私が見つけた2つは次のとおりです。
- レコードセットを開かない
- ピボット テーブルが見つからない - たとえば、以下のコードでは、ActiveSheet を介してピボットテーブルを参照しています。Excel でピボット テーブルのないワークシートを選択すると、そのエラーが発生します。
あなたのコードを見ると、私が疑わしいと思うことがいくつかあります。
Set xlptCache = .PivotCaches.Add(SourceType:=xlExternal)
- なぜPivotCacheを追加するのですか? 既存のピボットテーブルに属する PivotCache を更新する必要があります。
Set .PivotCaches.item(0).Recordset = pivotRecordSet
-特定の PivotCache を参照しているのではなく、シートの最初のものだけを参照しているため、これも好きではありません。
PivotTable
を名前で参照してから、それに属する にアクセスする必要があると思いますPivotCache
(以下を参照)。
私がお勧めするのは、デバッガーを起動してステップスルーし、レコードセットが見つかる前に開いていることを確認し、実際に適切なピボットテーブルを参照していることを確認し、そのピボットキャッシュを取得して確認することです適切なオブジェクトが適切な場所に詰まっています。
以下のコードは、私のマシン (Excel 2010) で動作します。
注意:ActiveWorkbook.ActiveSheet
エラーを取得する方法の 1 つを説明するために - を使用しました。使用のメカニズムは.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