【问题标题】:Excel VBA: "application-defined or object-defined error"Excel VBA:“应用程序定义或对象定义错误”
【发布时间】:2009-12-10 19:39:54
【问题描述】:

在 Excel 2003 中,我收到运行时错误 1004:此代码的最后一行出现“应用程序定义或对象定义错误”(commandtext = abc)

Sub SCommandTxt()
Dim abc as string
abc = Sheets("Totals").PivotTables("PivotTable2").PivotCache.CommandText 
Sheets("Totals").PivotTables("PivotTable2").PivotCache.CommandText = abc
End Sub

这并不是我真正想要做的,但不知道是什么导致了如此简单的错误,这让我陷入了困境。手头的数据透视表是一个 ODBC 连接。以下代码在此代码之前运行并且工作正常。我真正想做的就是根据变化范围“WhereFilters”动态更改查询。下面的查询可以正常工作,但是如果我可以直接更改 commandText ,我宁愿不必取消隐藏并选择工作表并通过 pivotwizard (尽管基于我得到的错误可能不是......虽然其他人似乎认为上述是可能的,所以我不知道为什么它对我不起作用):

Sub UpdatePvt()
Dim DBDir As String, DBName As String, SortType As String, Size As String
Dim QueryArry1(0 To 100) As String, rng As Range, x As Integer

DBDir = "C:\Documents and Settings\jt\"
DBName = "DatabaseExample.mdb"

If Range("ComboResult1") = 1 Then
    SortType = "TDollars"
    Sheets("Totals").PivotTables("PivotTable1").PivotFields("DIV_ID").AutoSort _
        xlDescending, "Sum of Dollars"
    Sheets("Totals").PivotTables("PivotTable2").PivotFields("DIV_ID").AutoSort _
        xlDescending, "Sum of Dollars"
Else
    SortType = "TCounts"
    Sheets("Totals").PivotTables("PivotTable1").PivotFields("DIV_ID").AutoSort _
        xlDescending, "Sum of Counts"
    Sheets("Totals").PivotTables("PivotTable2").PivotFields("DIV_ID").AutoSort _
        xlDescending, "Sum of Counts"
End If

If Range("ComboResult2") = 1 Then
    Size = "Total"
ElseIf Range("ComboParOUT") = 2 Then
    Size = "Small"
Else
    Size = "Large"
End If

QueryArry1(0) = "SELECT Top 500 C.* "
QueryArry1(1) = "FROM Final03 C "
x = 2
If Not (Range("NoFilters")) Then
    QueryArry1(x) = "INNER JOIN (Select DIV_ID FROM FullLookup WHERE "
    x = x + 1

    For Each rng In Range("WhereFilters")
        QueryArry1(x) = rng.Value
        x = x + 1
    Next rng

    QueryArry1(x) = "GROUP BY DIV_ID) E ON C.DIV_ID = E.DIV_ID "
    x = x + 1
End If
QueryArry1(x) = "WHERE C.EntitySize = '" & Size & "' "
QueryArry1(x + 1) = "ORDER BY C." & SortType & " DESC "

'Example Query Results:
'SELECT Top 500 C.* FROM Final03 C INNER JOIN (Select DIV_ID FROM FullLookup WHERE Year = 2008 and State = 'MN' and Type = 'RST44' GROUP BY DIV_ID) E ON C.DIV_ID = E.DIV_ID WHERE C.EntitySize = 'Large' ORDER BY C.TCounts DESC 

Sheets("Totals").Visible = xlSheetVisible

Sheets("Totals").Select
Sheets("Totals").PivotTables("PivotTable1").DataBodyRange.Select
Sheets("Totals").PivotTableWizard SourceType:=xlExternal, _
    SourceData:=QueryArry1, _
    Connection:=Array( _
        Array("ODBC;DSN=MS Access Database;DBQ=" & DBDir & "\" & DBName & ";"), _
        Array("DefaultDir=" & DBDir & ";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;") _
    )

Sheets("Totals").PivotTables("PivotTable2").DataBodyRange.Select
Sheets("Totals").PivotTableWizard _
    SourceType:=xlPivotTable, _
    SourceData:="PivotTable1"

Sheets("Totals").Visible = xlSheetHidden
End Sub

谢谢

【问题讨论】:

  • 你能评论一下解决方案是什么吗?
  • 解决方案是我帖子底部的长代码,其中包含取消隐藏工作表和选择数据透视表...我希望直接使用 Pivotcache 来完成,但还没有找到方法。你的回答是一个很好的候选人,我最初认为是这样,但并没有解决我的问题。感谢您抽出宝贵时间尝试回答我的问题。
  • 不客气……但如果我的答案不能解决问题,你真的不应该将我的答案标记为已接受。最好发布您自己的答案并将其标记为已接受。没有人可以通过这种方式获得任何代表点数,但它可以帮助正在研究类似问题的人。

标签: database excel vba runtime pivot


【解决方案1】:

您的问题似乎与此处描述的完全相同:

Limitation of PivotCache.CommandText property

您要设置为 CommandText 的字符串有多长?

【讨论】:

  • 我尝试了较短的字符串(简单的选择查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
相关资源
最近更新 更多