【问题标题】:Pivotcache problem using ado recordset into excel使用ado记录集到excel中的数据透视缓存问题
【发布时间】:2011-02-15 18:46:35
【问题描述】:

我在最后一行遇到运行时错误 1004 的问题。我将访问查询引入 excel 2007。我知道记录集没问题,因为我可以看到字段和数据。我不确定 picotcache 是在 set ptCache 行中创建的。我看到应用程序,但索引为 0。代码如下...

Private Sub cmdPivotTables_Click()

    Dim rs As ADODB.Recordset
    Dim i As Integer
    Dim appExcel As Excel.Application
    Dim wkbTo As Excel.Workbook
    Dim wksTo As Excel.Worksheet
    Dim str As String
    Dim strSQL As String
    Dim rng As Excel.Range
    Dim rs As DAO.Recordset
    Dim db As DAO.Database
    Dim ptCache As Excel.PivotCache

    Set db = CurrentDb()

    'to handle case where excel is not open
    On Error GoTo errhandler:
    Set appExcel = GetObject(, "Excel.Application")
    'returns to default excel error handling
    On Error GoTo 0
    appExcel.Visible = True
    str = FilePathReports & "Reports SCU\SCCUExcelReports.xlsx"
    'tests if the workbook is open (using workbookopen functiion)
    If WorkbookIsOpen("SCCUExcelReports.xlsx", appExcel) Then
        Set wkbTo = appExcel.Workbooks("SCCUExcelReports.xlsx")
        wkbTo.Save
        'To ensure correct Ratios&Charts is used
        wkbTo.Close
    End If
    Set wkbTo = GetObject(str)
    wkbTo.Application.Visible = True
    wkbTo.Parent.Windows("SCCUExcelReports.xlsx").Visible = True

    Set rs = New ADODB.Recordset
    strSQL = "SELECT viewBalanceSheetType.AccountTypeCode AS Type, viewBalanceSheetType.AccountGroupName AS AccountGroup, " _
                & "viewBalanceSheetType.AccountSubGroupName As SubGroup, qryAmountIncludingAdjustment.BranchCode AS Branch, " _
                & "viewBalanceSheetType.AccountNumber, viewBalanceSheetType.AccountName, " _
                & "qryAmountIncludingAdjustment.Amount, qryAmountIncludingAdjustment.MonthEndDate " _
            & "FROM viewBalanceSheetType INNER JOIN qryAmountIncludingAdjustment ON " _
                & "viewBalanceSheetType.AccountID = qryAmountIncludingAdjustment.AccountID " _
            & "WHERE (qryAmountIncludingAdjustment.MonthEndDate = GetCurrent()) " _
            & "ORDER BY viewBalanceSheetType.AccountTypeSortOrder, viewBalanceSheetType.AccountGroupSortOrder, " _
                & "viewBalanceSheetType.AccountNumber;"
    rs.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic

'    Set rs = db.OpenRecordset("qryExcelReportsTrialBalancePT", dbOpenForwardOnly)

**'**********problem here
    Set ptCache = wkbTo.PivotCaches.Create(SourceType:=XlPivotTableSourceType.xlExternal)
    Set wkbTo.PivotCaches("ptCache").Recordset = rs**

【问题讨论】:

    标签: excel ms-access vba pivot-table


    【解决方案1】:

    您的 Pivot Cache 不是名称“ptCache”,它可能是“PivotCache1”或其他名称。这两种方法都可以,首选前者。

    Set ptCache.Recordset = rs
    
    Set wkbTo.PivotCaches(1).Recordset = rs
    

    【讨论】:

    • 嗨,迪克,不幸的是,这不起作用。以前的版本给了我同样的错误,使用 wkbTo.PivotCaches(1) 给了我错误下标超出范围。这表明创建 ptCache 的前一行不起作用?
    • 似乎是这样,但它应该在该行给你一个错误。我手边没有 2007,但在 2003 年,没有用于 PivotCaches 的 Create 方法,只有 Add 方法。如果在 2007 年仍然如此,并且您在这条线上压制错误,那么这将是罪魁祸首。无论如何,我会尽快在 2007 年检查一下。
    • 嗨,迪克 这是我发现的一件事。在 excel 2007 中没有添加方法,但有一个看起来相同的创建方法。我起初添加并得到错误438(我认为)。另外,我没有压制错误。自从我的最后一条消息以来,我已经将 rs 转储到电子表格上没有问题,并从该工作表创建了数据透视缓存和数据透视表。但仍然很想知道如何创建数据透视表 ado 记录集。感谢您的帮助。
    • 它适用于 Excel,但不适用于 Access。我不知道为什么。您能解释一下您要完成的工作吗?也许我们可以找到不同的方法。
    【解决方案2】:

    我知道这是旧的,但只是一个想法。我注意到您在同一个子例程中声明了两个rs 变量(一个使用ADODB,一个使用DAO)。坦率地说,我很惊讶编译器没有为你捕捉到这一点,但我建议尝试其中一个,但不要同时尝试两者(因为你将 rs 初始化为 ADODB.RecordSet,你应该评论一下出rs = DAO.RecordSet)。

    【讨论】:

      【解决方案3】:

      我认为这个错误上升是因为你的“strSQL”太长了;使用更简单的 strSQL 运行您的代码,但我不知道如何解决 long strSQL。

      【讨论】:

        【解决方案4】:

        MHosseinput 可能已经在那里做了什么。多年前我在 excel 中完成了此操作,我注意到我将 sql 拆分为块并将一个或多个数组传递给枢轴对象。当然,没有评论解释我为什么这样做,我不记得了,但它确实有效。

        Set oPivCache = oWb.PivotCaches.Add(SourceType:=xlExternal) 
        oPivCache.Connection = "OLEDB;" & sConnStr
        oPivCache.CommandType = xlCmdSql oPivCache.CommandText = Array( _
            Array(LEFT(sqry, 200)), _
            Array(Mid(sqry, 201, 200)), _
            Array(Mid(sqry, 401, 200)), _
            Array(Mid(sqry, 601, 200)), _
            Array(Mid(sqry, 801, 200)), _
            Array(Mid(sqry, 1001, 200))) 
        oPivCache.CreatePivotTable TableDestination:=oPVSht.Range("A1"), TableName:=sPvName
        

        【讨论】:

          猜你喜欢
          • 2018-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多