2013-05-31 67 views
1

我有一個數據透視表在Excel文件,我正在尋找與記錄集中的數據一起使用。到目前爲止,這是我從VB6記錄集樞軸表

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

有沒有什麼辦法可以改變,要使用現有的數據透視表,而不是創建一個新的?或者我做錯了更改導致錯誤的記錄集?

+0

我看不到數據被拉入記錄集的代碼。記錄集從哪裏填充實際數據? – shahkalpesh

+0

我使用來自SQL Server數據庫的數據填充它。我通過一個ADODB.Recordset循環到pivotRecordSet中。如果我可以通過數據透視表來查看這些數據,那麼這部分將變得更加複雜,因爲我必須操作數據,但現在它已經非常標準。 – gdawgrancid

回答

0

要糾正你有評論試試這個錯誤:

Set xlptCache.Recordset = pivotRecordSet 

,比你有它:

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

當我嘗試使用無效過程調用或參數錯誤時 – gdawgrancid

0

我認爲,如果你發佈更多的代碼,你將有更多的運氣。下面有一個適用於我的示例(基於具有相同結構數據的現有數據透視表)。

有很多很多事情會導致「應用程序定義或對象定義的錯誤」。

兩個我發現是:

  • 未打開記錄
  • 沒有找到數據透視表 - 例如在我下面的代碼中,我通過ActiveSheet引用了數據透視表 - 如果我在Excel中選擇了一個沒有數據透視表的工作表,那麼會出現該錯誤。在你的代碼

尋找有一對夫婦的事情,我覺得有問題,你可能需要查看:

  • Set xlptCache = .PivotCaches.Add(SourceType:=xlExternal) - 你爲什麼添加一個PivotCache?您需要更新屬於現有數據透視表的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