【发布时间】: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