Auslesen von Zeilen in Excel anhand der Werte in einer Spalte

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von vrtz.

    Auslesen von Zeilen in Excel anhand der Werte in einer Spalte

    Hallo,

    Für eine kleine Excel-Automatisierung von Timesheets möchte ich folgendes haben:

    Ich habe ein Excel-Sheet, welches eine ID-Spalte enthält. Diese Spalte ist nur in manchen Zeilen gefüllt.

    Ich möchte nun eine Funktion haben, welche diese Spalte durchläuft und mit der Liste aller validen IDs vergleicht und mir dann alle Reihen in der eine ID steht in eine list of excel.listrow packt.

    Diese möchte ich dann weiterverarbeiten.

    Bislang sieht mein Ansatz so aus:

    VB.NET-Quellcode

    1. Private Function getIdRows(ByRef sheet As Excel.Worksheet, ByVal idList As List(Of String)) As List(Of Excel.ListRow) Dim rowList As New List(Of Excel.ListRow)
    2. Dim xlRange As Excel.Range
    3. xlRange = sheet.UsedRange(My.Settings.sourceIdSpalte)
    4. For Each element In xlRange.Value
    5. For Each id In listID
    6. If element.value.ToString.Replace(" ", "") = id Then
    7. rowList.Add(element)
    8. End If
    9. Next
    10. Next
    11. Return rowList End Function



    Leider sind die ganzen Objects der Excel-Rückgaben für mich auf den ersten Blick nicht so von Nutzen. Ich hatte gedacht, dass ich einfach die ganze Range der Spalte einlese, danach nur gucken muss ob in einer Zelle eine ID steht und ich dann anhand des Objekts dieser Zelle einfach sagen kann
    xlRange = sheet.Range(cell.row) , also anhand der Zeile in der sich die ID befindet eine weitere range bilden, die ich dann der rowList hinzufügen kann.
    Leider hat das element Range keine richtigen Propertys.

    Gruß
    Fortschritt:

    Da die ganzen eingebauten Excel-Typen zum kotzen sind, benutze ich jetzt eine for-zählschleife und geh so durch die zeilen und packe mir dann die Informtionen aus den anderen Spalten der Reihe in eine Stringlist.

    Siehe:

    VB.NET-Quellcode

    1. Private Function getIdRows(ByRef sheet As Excel.Worksheet, ByVal idList As List(Of String)) As List(Of String)
    2. Dim xlRange As Excel.Range
    3. xlRange = sheet.Range(My.Settings.sourceIdSpalte + 1.ToString, My.Settings.sourceIdSpalte + (My.Settings.sourceIdAbZeile + 30).ToString)
    4. Dim returningStringList As New List(Of String)
    5. For i As Integer = My.Settings.sourceIdAbZeile To xlRange.Rows.Count
    6. For Each id In listID
    7. If sheet.Range(My.Settings.sourceIdSpalte + i.ToString).Value = vbNullString Then Exit For
    8. If sheet.Range(My.Settings.sourceIdSpalte + i.ToString).Value = id Then
    9. Dim listRow As New List(Of String)
    10. listRow.Add(iKw) ' KW adden
    11. listRow.Add(sName) ' Name adden
    12. listRow.Add(sheet.Range(My.Settings.sourceProjNummerSpalte + i.ToString).Value) ' Projektnummer adden
    13. listRow.Add(sheet.Range(My.Settings.sourceIdSpalte + i.ToString).Value) ' ID adden
    14. listRow.Add(sheet.Range(My.Settings.sourceAzSpalte + i.ToString).Value) ' AZ adden
    15. Dim stringForList As String = ""
    16. For Each item In listRow
    17. stringForList = stringForList + "," + item
    18. Next
    19. returningStringList.Add(stringForList)
    20. End If
    21. Next
    22. Next
    23. Return returningStringList End Function/



    Problem ist, dass die Rückgabe der Arbeitszeit einen falschen Wert liefert. In der Excel Tabelle handelt es sich um Stunden:Minuten angaben, also zB: 1:00 oder 8:30 , ergo 8:60 = 9:00 , diese werden mir im Programm aber falsch zurückgegeben. Bspw gibt 1:00 folgenden Wert zurück:
    0,0416666666666667


    Wie erhalte ich den richtigen Wert?



    EDIT:

    Problem gelöst. Folgender Befehl konvertiert den Double-Wert aus Excel in den Original-Zeit-Wert:
    date.FromOADate

    Also in der Praxis:
    Date.FromOADate(CDbl(sheet.Range(My.Settings.sourceAzSpalte + i.ToString).Value))



    Nun funktioniert alles wie oben von mir beschrieben auf den ersten Blick.


    Peace out

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „vrtz“ ()