Excel-VBA-verweisen zu QueryTable von Objekten durch name
Ich bin die Entwicklung einer MS-Excel-2013-tool mit VBA, die beinhaltet die Verwendung von Abfragetabellen. Man Unannehmlichkeiten, die ich erlebe, ist der Zugriff auf bestehenden von Abfragetabellen in einem Excel-Arbeitsblatt. Derzeit ist die einzige Methode, die ich finden kann, um den Zugriff auf eine Abfrage-Tabelle von integer Indizierung. Ich kam mit dem folgenden code für einen schnellen proof-of-concept
Sub RefreshDataQuery()
Dim querySheet As Worksheet
Dim interface As Worksheet
Set querySheet = Worksheets("QTable")
Set interface = Worksheets("Interface")
Dim sh As Worksheet
Dim QT As QueryTable
Dim startTime As Double
Dim endTime As Double
Set QT = querySheet.ListObjects.item(1).QueryTable
startTime = Timer
QT.Refresh
endTime = Timer - startTime
interface.Cells(1, 1).Value = "Elapsed time to run query"
interface.Cells(1, 2).Value = endTime
interface.Cells(1, 3).Value = "Seconds"
End Sub
Funktioniert es, aber ich wirklich nicht wollen, es zu tun auf diese Weise. Das Endprodukt tool haben bis zu fünf verschiedene Abfragetabellen. Was ich will, ist zu verweisen auf eine Abfragetabelle (QueryTable) in Ihrem Namen.
Was schön wäre ist, wenn ich könnte, übersetzen Sie den code unten
Set QT = querySheet.ListObjects.item(1).QueryTable
Etwas entlang der Linien
Set QT = querySheet.ListObjects.items.QueryTable("My Query Table")
Irgendwelche Vorschläge würde sehr geschätzt.
InformationsquelleAutor Paul Renton | 2013-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut in diesem MSDN-link für ListObject es gibt keine Sammlung von
QueryTables
als eine Eigenschaft vonListObjects
. Korrekte code ist:Was Sie möglicherweise brauchen, ist zu verweisen auf entsprechende
ListObject item
wie (nur Beispiel-code):Die andere alternative ist, siehe QT durch
WorkSheet property
auf diese Weise:Das habe ich geändert zu:
Set QT = querySheet.ListObjects.items(1).QueryTable
die ähnlich wie Ihre code.was meinst du damit, dass " Arbeitsblatt wurde bereits bestehenden?'... das liegt auf der Hand - ändern Sie den Namen von QT auf eine, die Sie wirklich haben. Sie können überprüfen Sie immer die Anzahl der QT-Bogen in dieser Weise:
Debug.Print Worksheets("QTable").QueryTables.Count
und die Namen der einzelnen QT in dieser Weise:ly have. You can always check number of QT in sheet in this way:
Debuggen.Drucken Worksheets("QTable").Abfragetabellen(1).Name` für die erste.Sorry wenn es nicht klar. Die Abfragetabelle (QueryTable) gebaut wurde, nicht über VBA. Es wurde von verschiedenen Benutzern durch die Daten-Verbindungs-Assistenten. Die Anzahl der für den code, den Sie geschrieben, was ich versuchte, früher, wird 0 angezeigt, obwohl ich Zugriff auf die Abfragetabelle durch ListObjects.item(1).QueryTable
So, ich denke, ListObject-Daten von externen Quelle. Deshalb, um die zu QT, die Sie finden müssen entsprechende ListObject und verwenden
ListObject.QueryTable
Referenz.InformationsquelleAutor Kazimierz Jawor
In Excel 2003 und vor, einen externen Daten-Verbindung schaffen würde, ein QueryTable-Objekt, dessen übergeordnetes Element wurde ein Arbeitsblatt. Sie Zugriff auf das QueryTable-Objekt, zum einen durch die Sammlung von Abfragetabellen-Objekt. Wie die meisten collection-Objekte können Sie eine Indexnummer oder den Namen des (Standard -) Item-Methode, um es zu bekommen.
Beim öffnen einer 2003-Arbeitsblatt in einer neuen version, es hat immer noch eine QueryTable-Objekt und kann auf die gleiche Weise zugegriffen werden. Selbst wenn Sie konvertieren Sie die Datei-format, die Abfragetabelle (QueryTable) besteht.
Im Jahr 2007 und späteren Versionen, es gibt nur drei Möglichkeiten, um eine Abfragetabelle erstellen, wird ein Mitglied des Arbeitsblatts.Abfragetabellen:
Alle anderen UI-externe Daten-verbindungen, die in diesen neuen Versionen werden das Ergebnis nicht in eine Abfragetabellen-Mitglied, aber in einem ListObject. Das ListObject wird ein und nur ein QueryTable-Objekt zugegriffen werden kann über das ListObject.QueryTable-Eigenschaft.
Hier ist die schlechte Nachricht. Die Abfragetabelle (QueryTable), deren Mutterunternehmen in einem ListObject nicht über eine Name-Eigenschaft. Gut, es ist da, aber Sie bekommen einen Laufzeitfehler 1004, wenn Sie versuchen, darauf zuzugreifen. Ich denke, MS entschieden, da es nur eine Abfragetabelle pro ListObject, es hat keinen Sinn, es sollte einen Namen haben.
Wenn Sie versuchen, zu konvertieren ein Arbeitsblatt.Abfragetabellen.Abfragetabelle (QueryTable) in einem ListObject, die externe Daten-Verbindung geht Weg und der neue ListObject nicht ein QueryTable.
Seit Ihr Abfragetabellen.Count ist die Rückgabe null, alle Ihre Abfragetabellen sind innerhalb ListObjects und haben keine Namen. Die ListObjects Namen haben. Sie können
Hier ist eine Funktion, der Sie einen Namen und ein Arbeitsblatt und gibt ein QueryTable -, dass entweder das Namen-oder ist das Kind ein ListObject, die diesen Namen hat.
Das war sehr hilfreich und anschaulich. Danke!
Kusleika Leider scheint es ListObjects nicht mehr hat, eine Eigenschaft name im Jahr 2013 oder ein QueryTable-Eigenschaft.
ListObjects ist ein collection-Objekt enthält alle ListObject-Objekte auf einem Arbeitsblatt. ListObject-Objekt hält eine einzige Instanz. Das collection-Objekt hatte nie einen Namen oder eine QueryTable-Eigenschaft, aber ListObject immer noch tut. Zumindest laut MSDN.
Ich sehe nicht ein ListObject-Objekt die Zugehörigkeit zu einem Arbeitsblatt. Sie kann entsorgt werden.
InformationsquelleAutor Dick Kusleika