Registriert seit: 16.08.2014
Version(en): 2013
19.08.2014, 16:20
(Dieser Beitrag wurde zuletzt bearbeitet: 19.08.2014, 16:56 von Rabe.)
Hallo liebe Experten, ich möchte gerne die Tabellenblattnamen aus einer geschlossenen Excel-Datei auslesen. Dazu habe ich mir ein kleines Programm geschrieben, das diese Namen ausgehend von der aktiven Zelle in meinem geöffneten Excel-Arbeitsblatt untereinander wiedergibt. Der Code funktioniert. Leider sind meine Programmierkenntnisse bescheiden. Wie könnte man das Programm eleganter schreiben? Code: Option Explicit
Sub Blattnamenauslesen() 'Programm zum Auslesen der Tabellenblattnamen 'aus der geschlossenen Datei Datei.xls im Verzeichnis C:\Test Dim sFile As String Dim wb As Workbook Dim vbFeld(1 To 100) As Variant Dim i As Variant Dim ws As Worksheet Dim a As Integer sFile = "C:\Test\Datei.xls" i = 1 Set wb = Workbooks.Open(sFile) For Each ws In wb.Worksheets vbFeld(i) = ws.Name i = i + 1 Next ws wb.Close a = 0 For Each i In vbFeld ActiveCell.Offset(a, 0).Value = i a = a + 1 Next i End Sub
Code strukturiert dargestellt durch 3. Button von rechts im Beitragsformular: # Moderator [Bild: smilie.php?smile_ID=1810]
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
Hallo, vielleicht genügt dies Deiner Vorstellung an Eleganz? Code: Sub Blattnamenauslesen() 'Programm zum Auslesen der Tabellenblattnamen 'aus der geschlossenen Datei Datei.xls im Verzeichnis C:\Test Dim i As Long Dim rngStart As Range Dim sFile As String Dim wb As Workbook Set rngStart = ActiveCell Set wb = Workbooks.Open("C:\Test\Datei.xls") For i = 1 To wb.Worksheets.Count rngStart.Offset(i - 1, 0).Value = wb.Worksheets(i).Name Next i wb.Close
End Sub
Gruß Uwe
Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:1 Nutzer sagt Danke an Kuwer für diesen Beitrag 28
• ratrad
Registriert seit: 16.08.2014
Version(en): 2013
Hallo leider funktioniert dein Code noch nicht.
Klemmt bei ws
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
Hallo,
ja stimmt, da muss jetzt i stehen.
Gruß Uwe
Registriert seit: 16.08.2014
Version(en): 2013
Hallo Uwe,
danke für Deine Hilfe! Falls andere Leute aber noch andere Vorschläge haben, nur zu.
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallo ratrad, aus einer geschlossenen Mappe stimmt ja nun nicht, Du öffnest sie ja zum Auslesen. Es geht aber auch wirklich ohne Öffnen. Geschlossen braucht einen etwas umfangreicheren code und geht so: Code: Option Explicit 'benoetigt Verweis auf Microsoft ActiveX DataObjects '2.x oder hoeher (getestet mit 2.8 und 6.1)
Private Function ListExcelTablesADOX(ByVal varFile As String, _ ListExcelTables As Collection) As Long Dim objConnection As Object ' ADODB.Connection Dim objAdoCat As Object ' ADOX.Catalog Dim tbl As Object ' ADOX.Table 'ADODB Connection Objekt setzen - Late Binding Set objConnection = CreateObject("adodb.connection") 'ADODB Catalog Objekt setzen - Late Binding Set objAdoCat = CreateObject("adox.catalog") 'ADODB Connection Verbindung oeffnen Set objConnection = OpenExcelConnection(varFile) 'Bei Fehler Gehe zu Fehlerbehandlung On Error GoTo errorhandler 'Katalog aus ADODB Connection zuweisen objAdoCat.ActiveConnection = objConnection 'Schleife ueber alle Tables 'Hinweis: '1. Druckbereiche ets. werden ebenfalls als Table zurueckgegeben, '2. Punkte in Tabellennamen werden in Tables durch hash ersetzt! For Each tbl In objAdoCat.Tables 'wenn Tabellenname mit $ oder $' endet und 'nicht mit # oder '# beginnt, dann If (Right(tbl.Name, 2) = "$'" Or Right(tbl.Name, 1) = "$") And _ (Left(tbl.Name, 1) <> "#" And Left(tbl.Name, 2) <> "'#") Then 'Tabellenname zur Collection hinzufuegen ListExcelTables.Add tbl.Name 'Ende wenn Tabellenname mit $ oder $' endet und 'nicht mit # oder '# beginnt, dann End If 'naechste Schleife ueber alle Tables Next tbl 'Fehlerbehandlung errorhandler: 'ADODB Catalog zuruecksetzen Set objAdoCat = Nothing 'ADODB Connection schliessen objConnection.Close 'ADODB Connection zuruecksetzen Set objConnection = Nothing 'Wenn Fehler, dann Fehlernumer als Rueckgabewert If Err Then ListExcelTablesADOX = Err.Number End Function
Private Function OpenExcelConnection( _ ByVal Path As String, _ Optional ByVal Headers As Boolean = True) As Connection Const adUseClient As Long = 3 ' noetig bei Late Binding Dim strConn As String ' Connection - String, Versionsabhaengig Dim objConn As ADODB.Connection ' Connection-Objekt 'Connection-Objekt initialisieren Set objConn = New ADODB.Connection 'Wenn excel-Version >= 12, dann If Val(Application.Version) >= 12 Then 'Connection-String mit ACE bilden strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & Path & ";" & _ "Extended Properties=""Excel 12.0;HDR=" & _ IIf(Headers, "Yes", "No") & """;" 'Oder nicht Wenn excel-Version >= 12, dann Else 'Connection-String mit Jet bilden strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & Path & ";" & _ "Extended Properties=""Excel 8.0;HDR=" & _ IIf(Headers, "Yes", "No") & """" 'Ende Wenn excel-Version >= 12, dann End If 'mit dem Connection Objekt With objConn 'Cursor setzen .CursorLocation = adUseClient 'Verbindung oeffnen .Open strConn 'Ende mit dem Connection Objekt End With 'Connection zurueckgeben Set OpenExcelConnection = objConn End Function
Public Sub BlattNamenHolen() 'Programm holt Blattnamen aus einer geschlossenen Mappe 'und trägt diese auf Tabelle1 ein. 'Variablendeklarationen 'Integer Dim iCnt1% 'Long Dim lo_Error&, loLetzte& 'string Dim strPath$ 'Collection Dim ListExcelTables As New Collection 'Collection mit Blattnamen 'pfadvariable mit Pfad und Dateiname bilden strPath = "D:\Test\x1.xlsx" 'Liste der Tabellenblaetter der Datei bilden, Rueckgabe Fehlerwert lo_Error = (ListExcelTablesADOX(strPath, ListExcelTables)) 'Mit dem Blatt Suche With ThisWorkbook.Sheets("Tabelle1") 'Schleife bis zum Ende der Collection For iCnt1 = 1 To ListExcelTables.Count 'erste freie Zelle anhand Spalte A ermitteln loLetzte = .Cells(Rows.Count, 1).End(xlUp).Row + 1 .Cells(loLetzte, 1) = ListExcelTables(iCnt1) 'Naechste Schleife bis zum Ende der Collection Next 'Ende Mit dem Blatt Suche End With 'Blattliste zuruecksetzen Set ListExcelTables = Nothing End Sub
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 16.08.2014
Version(en): 2013
Hallo Andre,
danke für den Code, aber leider läuft er nicht. Habe eine X64 Version. Natürlich hast du recht. Die Datei bleibt nicht geschlossen und es wird ein bißchen dabei geschummelt.
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallo ratrad, Habe nur das 32er Office und kann daher nur raten, was die Ursache sein kann. Was kommt denn für eine Fehlermeldung?
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
Hallöchen, beim Auslesen von Tabellennamen weicht das Ergebnis etwas ab. Es wird in der Regel ein $ an den Tabellennamen angehängt: Tabelle1$ Tabelle2$ Enthalten die Tabellennamen Punkte, werden diese durch Hash ersetzt: Tabelle#1$ Tabelle#2$ Tabelle#3$ Bei bestimmten Zeichen werden zusätzlich die Hochkomma am Anfang und Ende ausgegeben, analog z.B. zur Formeleingabe: 'Tabelle#3$' 'Tabelle,3$' Allerdings ist bei den Ersatzzeichen kein eindeutiger Rückschluss auf die ersetzten Zeichen zu erwarten: Tabelle!"§$%&()=`'_; wird zu 'Tabelle_"§$%&()=_''_;$' Hier sieht man noch den Sonderfall, dass ein Hochkomme im Namen ein zweites davor gesetzt bekommt. Je nachdem, ob man mit Wildwuchs bei der Zeichenvergabe rechnen muss oder eine Systematik bei der Namensvergabe einhält, kann man reagieren oder auch nicht. Sind z.B. nur die Indizees der Tabellenblätter durch einen Punkt vom Namen getrennt und es gibt keine weiteren "Besonderheiten", kann man den # durch einen Punkt ersetzen und nimmt den $ vom Ende weg. Statt Code: 'Tabellenname zur Collection hinzufuegen ListExcelTables.Add tbl.Name
kann man dann so reagieren: Code: 'Tabellenname zur Collection hinzufuegen ListExcelTables.Add Replace(Replace(tbl.Name,"#","."),"$","")
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
31.05.2016, 05:01
(Dieser Beitrag wurde zuletzt bearbeitet: 31.05.2016, 05:01 von schauan.)
Hallöchen,
noch ein Hinweis. Sollte bei den Tabellennamen mit den Hochkommas am Anfang und Ende selbiges am Ende stören, kann man das beim Zelleintrag durch eine zusätzliche Codezeile entfernen: nach dieser Zeile: .Cells(loLetzte, 1) = ListExcelTables(iCnt1) diese einfügen: If Right(.Cells(loLetzte, 1), 1) = "" Then .Cells(loLetzte, 1) = Left(.Cells(loLetzte, 1), Len(.Cells(loLetzte, 1)) - 1)
Ein einfaches Replace des Hochkomma beim Auslesen würde nicht funktionieren. Dabei würde auch das Hochkomma am Anfang ersetzt und das ergibt beim Eintrag in die Zelle eine Zahl mit Dezimalstellen.
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
|