Excel-Tabelle ohne kenntnis des Datenblattsnamen einlesen (VB2008)

  • Excel

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von TimeTraveler.

    Excel-Tabelle ohne kenntnis des Datenblattsnamen einlesen (VB2008)

    Hallo und grüss Gott!
    mit diesem Programmteil lese ich Excel-Tabellen in ein Datagrid ein, was auch Problemlos funktioniert solange die Tabelle 'Tabelle1' heisst.
    An dieser Stelle komme ich aber nicht ganz zum Ziel, weil die Namen der Tabellen sich ständig ändern, und mir vor dem einlesen nicht bekannt sind, was Zwangsläufig zu einem Fehler führt.
    Meine Frage:
    gibt es eine Möglichkeit die Tabellen nicht über den Namen, sondern über eine Indexnummer anzuwählen? Wenn ja, wie würde in diesem Beispiel die Syntax lauten.
    Würde mich sehr freuen, wenn mir jemand weiter helfen könnte.

    Gruss
    Anfreas


    'Beispiel
    Dim cn As System.Data.OleDb.OleDbConnection
    Dim cmd As System.Data.OleDb.OleDbDataAdapter
    Dim ds As New System.Data.DataSet()

    cn = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;" & _
    "data source=" & quelle & ";Extended Properties=Excel 8.0;")

    cmd = New System.Data.OleDb.OleDbDataAdapter("select * from [tabelle1$]", cn)
    cn.Open()
    cmd.Fill(ds)
    cn.Close()

    Indem du direkt ein Excel-Objekt unter VB erstellst und auf das Sheets-Array per Index zugreifst:

    Visual Basic-Quellcode

    1. Dim excel_app As New Excel.Application
    2. Dim excel_workbook As Excel.Workbook = excel_app.Workbooks.Add()
    3. Dim excel_worksheet As Excel.Worksheet = excel_workbook.Sheets(1)...
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Guten Morgen Agent Smith,

    danke für den Hinweis. Ich kann jetzt zumindest (über Range) auf die einzelnen Cellen zugreifen. Leider habe ich es nicht geschafft das Aktive Worksheet an ein Datagrid zu binden. Für deine Hilfe danke ich schon im voraus

    Schönen Gruss
    Andreas
    Ich kenne mich mit dem Datagrid nicht aus. Aber wenn es nur darum geht in folgender Zeile den richtigen Tabellennamen anzugeben:

    Visual Basic-Quellcode

    1. cmd = New System.Data.OleDb.OleDbDataAdapter("select * from [tabelle1$]", cn)


    probier mal das aus:

    Visual Basic-Quellcode

    1. cmd = New System.Data.OleDb.OleDbDataAdapter("select * from [" & ActiveSheet.Name & "$]", cn)

    roddy schrieb:

    Ich kenne mich mit dem Datagrid nicht aus. Aber wenn es nur darum geht in folgender Zeile den richtigen Tabellennamen anzugeben:

    Visual Basic-Quellcode

    1. cmd = New System.Data.OleDb.OleDbDataAdapter("select * from [tabelle1$]", cn)


    probier mal das aus:

    Visual Basic-Quellcode

    1. cmd = New System.Data.OleDb.OleDbDataAdapter("select * from [" & ActiveSheet.Name & "$]", cn)
    Hallo, habe es versucht mit dem Ergebnis dieser FehlerMeldung:
    "Der Operator & ist für Zeichenfolge select * from [ und Typ Worksheet nicht definiert."

    Gruss
    Andreas
    Hast du auch wirklich ActiveSheet.Name hingeschrieben?

    Das ist nämlich ein String (nicht vom Typ Worksheet), wodurch die Verkettung mit & keine Probleme machen sollte.

    Der Fehlermeldung nach zu urteilen hast du das geschrieben:

    Visual Basic-Quellcode

    1. cmd = New System.Data.OleDb.OleDbDataAdapter("select * from [" & ActiveSheet & "$]", cn)



    Sollte ich mich geirrt haben, entschuldige ich mich.
    Hallo Roddy,
    bin mir zimmlich sicher, dass mit der Angabe des ActiveShett Namens das ganze funktionieren wird, aber zum Kuckuck noch mal, was mache ich hier falsch, dass ich den Namen nicht auswählen kann?
    Hier sind die Möglichkeiten die ich zum ActiveSheet angeboten bekomme, nicht mehr, nicht weniger:

    ActiveShett .Equals
    .GetHashCode
    .GetType
    .ReferenceEquals
    .ToString

    Gruss
    Andreas

    roddy schrieb:

    Hast du auch wirklich ActiveSheet.Name hingeschrieben?

    Das ist nämlich ein String (nicht vom Typ Worksheet), wodurch die Verkettung mit & keine Probleme machen sollte.

    Der Fehlermeldung nach zu urteilen hast du das geschrieben:

    Visual Basic-Quellcode

    1. cmd = New System.Data.OleDb.OleDbDataAdapter("select * from [" & ActiveSheet & "$]", cn)



    Sollte ich mich geirrt haben, entschuldige ich mich.
    Natürlich musst du vor "AcitveSheet" noch dein Excel-Objekt stellen, also z. B. "excel_app.ActiveSheet.Name" oder auch "excel_worksheet.Name", wenn man jetzt von Agents Beispiel ausgeht. Ich hatte bei meinen vorherigen Antworten irgendwie nicht mehr registriert, dass es ja um VB 2008 geht. Sorry. :(

    Falls das nicht hilft: Ich weiß nicht genau, wie das bei VB 2008 ist, aber bei VBA muss man Verweise setzten, wenn man auf andere Programme zugreifen will. Vielleicht liegt es daran. :?:

    roddy schrieb:

    Natürlich musst du vor "AcitveSheet" noch dein Excel-Objekt stellen, also z. B. "excel_app.ActiveSheet.Name" oder auch "excel_worksheet.Name", wenn man jetzt von Agents Beispiel ausgeht. Ich hatte bei meinen vorherigen Antworten irgendwie nicht mehr registriert, dass es ja um VB 2008 geht. Sorry. :(

    Falls das nicht hilft: Ich weiß nicht genau, wie das bei VB 2008 ist, aber bei VBA muss man Verweise setzten, wenn man auf andere Programme zugreifen will. Vielleicht liegt es daran. :?:
    Hallo Roddy,
    habe es natürlich so ausprobiert wie du es hier beschreibst, doch leider ohne Erfolg.
    Trotzdem vielen dank für deine Geduld und Mühe.
    Werde mich erstmal hier und in anderen Foren umsehen, vielleicht finde ich etwas was mir weiter hilft ;(
    Gruss
    Andreas
    Das ist schon merkwürdig:

    Ich habs jetzt nochmal ausprobiert: Wenn ich in Excel-VBA "ActiveSheet." hinschreibe, bekomme ich gar keine Vorschläge. Wenn ich jedoch ActiveSheet überwache, erscheinen im Überwachungsfenster zahlreiche Eigenschaften, darunter auch "Name".

    RE: Excel-Tabelle ohne kenntnis des Datenblattsnamen einlesen (VB2008)

    Rumcajs schrieb:

    Meine Frage:
    gibt es eine Möglichkeit die Tabellen nicht über den Namen, sondern über eine Indexnummer anzuwählen? Wenn ja, wie würde in diesem Beispiel die Syntax lauten.
    Würde mich sehr freuen, wenn mir jemand weiter helfen könnte.

    Hallo Andreas.
    Es ist zwar schon eine Weile her, vielleicht interessiert Dich das aber trotz dem noch.
    Ich habe ein wenig im Internetz rumgestöbert und habe auf einer Englischen Seite diesen Ansatz gefunden:

    Visual Basic-Quellcode

    1. Private Function GetExcelSheetNames(ByVal excelFile As String) As String()
    2. Dim objConn As OleDbConnection = Nothing
    3. Dim dt As System.Data.DataTable = Nothing
    4. Try
    5. ' Connection String. Change the excel file to the file you
    6. ' will search.
    7. Dim connString As String = ("Provider=Microsoft.Jet.OLEDB.4.0;" + ("Data Source=" _
    8. + (excelFile + ";Extended Properties=Excel 8.0;")))
    9. ' Create connection object by using the preceding connection string.
    10. objConn = New OleDbConnection(connString)
    11. ' Open connection with the database.
    12. objConn.Open()
    13. ' Get the data table containg the schema guid.
    14. dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)
    15. If (dt Is Nothing) Then
    16. Return Nothing
    17. End If
    18. Dim excelSheets(dt.Rows.Count()) As String
    19. Dim i As Integer = 0
    20. ' Add the sheet name to the string array.
    21. For Each row As DataRow In dt.Rows
    22. excelSheets(i) = row("TABLE_NAME").ToString
    23. i = (i + 1)
    24. Next
    25. ' Loop through all of the sheets if you want too...
    26. Dim j As Integer = 0
    27. Do While (j < excelSheets.Length)
    28. ' Query each excel sheet.
    29. j = (j + 1)
    30. Loop
    31. Return excelSheets
    32. Catch ex As Exception
    33. MsgBox(ex.Message, MsgBoxStyle.Critical)
    34. Return Nothing
    35. Finally
    36. ' Clean up.
    37. If (Not (objConn) Is Nothing) Then
    38. objConn.Close()
    39. objConn.Dispose()
    40. End If
    41. If (Not (dt) Is Nothing) Then
    42. dt.Dispose()
    43. End If
    44. End Try
    45. End Function


    Einfach die Funktion kopieren und schon hast Du ein Ansatz.
    Ich habe es bereits getestet und es hat auch wunderbar funktioniert.

    Gruß
    TimeTraveler