Database EXCELVBA:“;应用程序定义或对象定义错误“;

Database EXCELVBA:“;应用程序定义或对象定义错误“;,database,excel,vba,runtime,pivot,Database,Excel,Vba,Runtime,Pivot,在Excel2003中,我在代码的最后一行(commandtext=abc)出现运行时错误1004:“应用程序定义或对象定义错误” 这并不是我真正想做的,但我不知道是什么原因导致了一些简单的错误,就像这让我感到很不舒服一样。手头的数据透视表是一个ODBC连接。以下代码在此代码之前运行,运行正常。我真正想做的就是根据不断变化的范围“WhereFilters”动态地更改查询。下面的查询可以正常工作,但如果我可以直接更改commandText,我不希望必须取消隐藏并选择工作表并执行数据透视向导(尽管根

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

这并不是我真正想做的,但我不知道是什么原因导致了一些简单的错误,就像这让我感到很不舒服一样。手头的数据透视表是一个ODBC连接。以下代码在此代码之前运行,运行正常。我真正想做的就是根据不断变化的范围“WhereFilters”动态地更改查询。下面的查询可以正常工作,但如果我可以直接更改commandText,我不希望必须取消隐藏并选择工作表并执行数据透视向导(尽管根据我收到的错误,可能不会…尽管其他人似乎认为上述操作是可能的,所以我不知道为什么它对我不起作用):


谢谢

您的问题似乎正是这里描述的问题:


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

我尝试了较短的字符串(简单的选择查询你能评论一下解决方案是什么吗?解决方案是我文章底部的长代码,其中包括取消隐藏工作表和选择数据透视表……我本来希望直接使用数据透视缓存来实现这一点,但仍然没有找到一种方法。你的答案是一个很好的候选者,我一开始认为是这样的,但没有解决我的问题。谢谢你花时间尝试回答我的问题。不客气……但如果我的答案没有解决问题,你真的不应该将其标记为已接受。最好发布你自己的答案并将其标记为已接受。没有人通过这种方式获得任何代表点,但它可以帮助正在研究类似问题的人。
Sub SCommandTxt()
Dim abc as string
abc = Sheets("Totals").PivotTables("PivotTable2").PivotCache.CommandText 
Sheets("Totals").PivotTables("PivotTable2").PivotCache.CommandText = abc
End Sub
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