Tabellenblattname von einer anderen Arbeitsmappe

Bild

Betrifft: Tabellenblattname von einer anderen Arbeitsmappe
von: anna
Geschrieben am: 11.08.2015 17:44:18

Guten Abend,
eine kurze Frage. Kann ich über folgenden Code auch den Tabellenblattnamen von Tabellenblätter aus einer anderen Arbeitsmappe ziehen oder beschränkt sich das nur auf Zellen.

Do
                k = k + 1
                wert = GetValue("E:\Dokumente", "test.xlsm", k + 1, "d6")
                  If IsError(wert) Then Exit Do
                    ActiveSheet.Cells(38 + k, 17) = wert
                     Loop
Im Code quasi das "d6" durch .name ersetzten, aber so klappt das natürlich nicht :)
Eine Idee?
Grüße
Anna

Bild

Betrifft: AW: Tabellenblattname von einer anderen Arbeitsmappe
von: Nepumuk
Geschrieben am: 11.08.2015 18:27:29
Hallo,
es ist möglich per ADO die Tabellennamen auszulesen.
Deine Methode Daten aus Mappen zu lesen ist für 2-3 Werte ok, aber sobald es mehr werden ist es schneller wenn die Mappe in Excel geöffnet ist. Es ist ja nicht so dass mit deiner Methode die Mappe nicht geöffnet wird, es geschieht nur für dich nicht sichtbar. Excel kratzt nämlich nicht direkt auf der Festplatte rum um Daten per DDE-Verbindung zu lesen. Ich hab's mal vor längerer Zeit getestet, 100 Werte auszulesen dauerte da rund 10 Sekunden. Die Mappe in Excel zu öffnen, die Daten in ein Array einzulesen und die Mappe wieder zu schließen dauerte knapp 2 Sekunden.
Beispiel für Tabellennamen auslesen:

Option Explicit

Public Sub Tabellennamen_auslesen()
    
    Dim objConnection As Object, objCatalog As Object
    Dim strConnection As String
    Dim strWorkbook As String, objTables As Object
    
    strWorkbook = "E:\Mappe1.xlsx"
    
    Set objConnection = CreateObject("ADODB.Connection")
    
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & strWorkbook & ";" & _
        "Extended Properties=""Excel 12.0;HDR=No;IMEX=0"""
    
    Call objConnection.Open(strConnection)
    
    Set objCatalog = CreateObject("ADOX.Catalog")
    Set objCatalog.ActiveConnection = objConnection
    
    For Each objTables In objCatalog.Tables
        With objTables
            Debug.Print Left$(.Name, Len(.Name) - 1)
        End With
    Next
    
    Set objCatalog = Nothing
    
    objConnection.Close
    
    Set objConnection = Nothing
    
End Sub

Gruß
Nepumuk

Bild

Betrifft: AW: Tabellenblattname von einer anderen Arbeitsmappe
von: anna
Geschrieben am: 12.08.2015 09:26:18
Guten Morgen Nepumuk,
danke für deine tolle Antwort.
Drei Fragen hab ich:
1. Wo gebe ich an, wo die Werte ausgegeben werden?
2. Kannst du mir auch noch einen Weg aufzeigen wie eine Zelle in dieser Form ausgelesen wird ? _ Wahrscheinlich auch hier oder? Aber wie :) ?


With objTables
            Debug.Print Left$(.Name, Len(.Name) - 1)
        End With

3. Und rein für mein Verständnis, wie gibst du hier an das alle Tabellenblätter durchsucht werden (Variable?)?
Danke jedenfalls schon mal für deine Hilfe.
Beste Grüße
Anna

Bild

Betrifft: AW: Tabellenblattname von einer anderen Arbeitsmappe
von: Rudi Maintaire
Geschrieben am: 12.08.2015 10:10:27
Hallo,
alle Tabellen werden damit durchlaufen:
For Each objTables In objCatalog.Tables
Der Name wird im Direktfenster ausgegeben:
Debug.Print Left$(.Name, Len(.Name) - 1)
Kannst du auch in eine Zelle schreiben.
z.B.
i = i + 1
Cells(i, 1) = Left$(.Name, Len(.Name) - 1)

Den Inhalt einer Zelle bekommst du vermutlich mit
Inhalt=objTables.Range("A1")
Gruß
Rudi

Bild

Betrifft: AW: Tabellenblattname von einer anderen Arbeitsmappe
von: anna
Geschrieben am: 12.08.2015 13:57:52
Hallo Rudi,
Danke soweit verstanden :)
Tabellenblattnamen-Import klappt. Bloß bringt es die Namen alle mit einem $-Zeichen rüber. Wieso ist das so und kann man(n) (Rudi/Nepumuk) das ändern ;)
Und zum Zelleninnhalt einfügen hab ich auch noch eine Frage:

With objTables
            q = q + 1
            Cells(q, 16) = objTables.Range("d6")
        End With

So meintest du das nicht oder? Weil so funktioniert es leider nicht. Oder hab ich es an der falschen Stelle eingefügt?
Grüße
Anna

Bild

Betrifft: AW: Tabellenblattname von einer anderen Arbeitsmappe
von: Rudi Maintaire
Geschrieben am: 12.08.2015 14:16:02
Hallo,
Bloß bringt es die Namen alle mit einem $-Zeichen rüber
Deshalb Left$(.Name, Len(.Name) - 1)
Das es mit objTables.Range("d6") hab ich auch schon gemerkt. Das muss man per RecordSet (SQL) abfragen. Ist nicht ganz trivial.
Ich würde die Mappe öffnen, auslesen und wieder schließen. Wie Nepumuk schon schrieb, ist das wahrscheinlich auch schneller.
Gruß
Rudi

Bild

Betrifft: AW: Tabellenblattname von einer anderen Arbeitsmappe
von: anna
Geschrieben am: 12.08.2015 17:44:54
Hallo Rudi,
gut das klappt jetzt. Hab aber jetzt festgestellt, dass es mir anfängt die Tabellenblattnamen zu sortieren was es nicht machen soll. Meine Tabellenblätter sind numeriert. Startend mit 1-10 ab 11 ordnet es wieder vorne ein, bei eins.
Kann man das abstellen?
Grüße
Anna

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Tabellenblattname von einer anderen Arbeitsmappe"