2009-12-10 6 views
0

Dans Excel 2003, j'obtiens une erreur d'exécution 1004: "erreur définie par l'application ou définie par l'application" sur la dernière ligne de ce code (commandtext = abc)Excel VBA: "erreur définie par l'application ou définie par l'application"

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

ce n'est pas vraiment ce que je suis en train de faire, mais ne sachant pas ce qui est à l'origine d'une erreur dans quelque chose d'aussi simple que cela me rend un mur. La table Pivot à portée de main est une connexion ODBC. Le code suivant a été exécuté avant ce code et fonctionne correctement. Tout ce que je veux vraiment faire est de changer la requête dynamiquement en fonction de la plage de changement "WhereFilters". La requête ci-dessous fonctionne bien, mais je préfère ne pas avoir à afficher et à sélectionner la feuille et à passer par l'interface pivot si je peux juste changer le commandText directement (bien que basé sur les erreurs que je reçois peut-être pas ... Bien d'autres semblent penser ce qui précède est possible, donc je ne sais pas pourquoi il ne fonctionne pas pour moi):

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 

Merci

+0

Pouvez-vous commenter sur ce que la solution s'est avérée être? –

+0

La solution est le code long au bas de mon message avec des feuilles de défilement et de sélectionner des pivottables ... J'espérais le faire directement avec le Pivotcache, mais je n'ai toujours pas trouvé de solution. Votre réponse était un excellent candidat et ce que je pensais se passer au début, mais n'a pas résolu mon problème. Merci d'avoir pris le temps d'essayer de répondre à ma question. – Dan

+1

De rien ... mais vous ne devriez pas marquer ma réponse comme acceptée si cela ne résout pas le problème. Il est préférable d'afficher votre propre réponse et de la marquer comme acceptée. Personne n'a de points de rep, mais cela peut aider les personnes qui font des recherches sur un problème similaire. –

Répondre

1

Votre problème semble être l'exact décrit ici:

Limitation of PivotCache.CommandText property

Quelle est la longueur de la chaîne vous essayez de définir en tant que CommandText?

+0

J'ai essayé des chaînes plus courtes (requête de sélection simple <50 caractères) et toujours obtenir cette erreur. J'ai juste essayé la fonction SplitString, mais reçois toujours l'erreur. J'ai vérifié que CommandType = xlCmdSql (qui se trouve être 2). Donc, je suis vraiment à perte ... Vous pouvez voir pourquoi je suis frusté. – Dan

Questions connexes