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

もっと多くのコードを投稿すれば、もっと幸運になると思います。以下に、私にとってうまくいく例があります(同じ構造データを持つ既存のピボットテーブルに基づいています)。

「アプリケーション定義またはオブジェクト定義のエラー」の原因となるものはたくさんあります。

私が見つけた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
于 2013-06-08T00:29:22.827 に答える