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