in Excel-Datei bestimmte Spalten nach Namen suchen und löschen

  • VB.NET
  • .NET 5–6

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    hier die Variante mit Kopieren, finde ich besser

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    2. 'deine Liste
    3. Dim myList As New List(Of String) From {"Ziffer", "#Num_IT", "Produkt A", "Kunde 1", "col2", "col14"}
    4. Dim FileName As String = "E:\A9.xlsx"
    5. Dim xlApp As New Microsoft.Office.Interop.Excel.Application()
    6. Dim xlWb As Microsoft.Office.Interop.Excel.Workbook
    7. xlWb = xlApp.Workbooks.Open(FileName)
    8. 'kopiere von Tabelle2
    9. Dim xlSt As Microsoft.Office.Interop.Excel.Worksheet = CType(xlWb.Worksheets("Tabelle2"), Worksheet)
    10. 'nach Tabelle4
    11. Dim WorkSheet2 As Microsoft.Office.Interop.Excel.Worksheet = CType(xlWb.Worksheets("Tabelle4"), Worksheet)
    12. 'suche in A1 bis P1
    13. Dim rngSearchValue As Range = xlSt.Range("A1:P1")
    14. With xlSt
    15. For i As Integer = 0 To myList.Count - 1
    16. Dim s As String = myList(i)
    17. Dim c As Excel.Range
    18. Dim firstAddress As String = String.Empty
    19. c = rngSearchValue.Find(s, LookIn:=XlFindLookIn.xlValues, _
    20. LookAt:=XlLookAt.xlWhole, _
    21. MatchCase:=True)
    22. Do
    23. If Not c Is Nothing Then
    24. If String.IsNullOrEmpty(firstAddress) Then firstAddress = c.Address
    25. c = rngSearchValue.FindNext(c)
    26. If s.Equals("Ziffer") Then
    27. c.Interior.Color = Color.Tomato
    28. c.EntireColumn.Copy(WorkSheet2.Range("F1")) '<-reihenfolge in Tabelle4 festlegen, Ziffer als letzte spalte
    29. ElseIf s.Equals("#Num_IT") Then
    30. c.Interior.Color = Color.Chartreuse
    31. c.EntireColumn.Copy(WorkSheet2.Range("B1"))
    32. ElseIf s.Equals("Produkt A") Then
    33. c.Interior.Color = Color.IndianRed
    34. c.EntireColumn.Copy(WorkSheet2.Range("C1"))
    35. ElseIf s.Equals("Kunde 1") Then
    36. c.Interior.Color = Color.HotPink
    37. c.EntireColumn.Copy(WorkSheet2.Range("D1"))
    38. ElseIf s.Equals("col2") Then
    39. c.Interior.Color = Color.GreenYellow
    40. c.EntireColumn.Copy(WorkSheet2.Range("E1"))
    41. ElseIf s.Equals("col14") Then
    42. c.Interior.Color = Color.BurlyWood
    43. c.EntireColumn.Copy(WorkSheet2.Range("A1"))
    44. End If
    45. Else
    46. Exit Do
    47. End If
    48. Loop While c.Address <> firstAddress
    49. Next
    50. End With
    51. xlWb.Save()
    52. xlApp.Quit()
    53. xlApp = Nothing
    54. End Sub
    Danke, aber mich würde es trotzdem interessieren, warum dieser "Option Strict on lässt spätes Binden nicht zu" kommt oder besser, wie man ihn an dieser Stelle beheben kann?

    Die Fehlermeldung "Option Strict On lässt spätes binden nicht zu" erhalte ich in Zeile 12 und 18. Also bei

    VB.NET-Quellcode

    1. columnHeading = xlSt.UsedRange.Cells(1, currentColumn).Value

    und

    VB.NET-Quellcode

    1. xlSt.Columns(currentColumn).Delete()


    Ich hatte es jetzt schon einmal versucht zu ändern von :

    VB.NET-Quellcode

    1. ​columnHeading = xlSt.UsedRange.Cells(1, currentColumn).Value

    zu:

    VB.NET-Quellcode

    1. ​columnHeading = CType(xlSt.UsedRange.Cells(1, currentColumn), Excel.Range).Value.ToString

    Jedoch bekomme ich dann beim ausführen die Fehlermeldung genau für diese geänderter Zeile :

    System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
    Microsoft.Office.Interop.Excel.Range.Value[object].get hat Nothing zurückgegeben.

    ich habe es schon versucht es umzuändern mit CType( davor, aber das funktioniert dann auch nicht. Dieses "Option Strict On"-Problem ist mir irgendwie noch nicht so richtig klar, wie man das beheben soll/kann.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Neuling“ ()

    hier nochmal Hilfe mit Option Strict On, du solltest aber wirklich OLEDB in betracht ziehen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Office.Interop.Excel
    3. Imports Microsoft.Office.Interop
    4. Public Class Form2
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. Try
    7. Dim xlApp As New Microsoft.Office.Interop.Excel.Application()
    8. Dim xlWb As Microsoft.Office.Interop.Excel.Workbook
    9. xlWb = xlApp.Workbooks.Open("E:\a9.xlsx")
    10. Dim xlSt As Microsoft.Office.Interop.Excel.Worksheet = CType(xlWb.Worksheets("Tabelle2"), Worksheet)
    11. For Each cell In xlSt.Range("A1:P1")
    12. For currentColumn = xlSt.UsedRange.Columns.Count To 1 Step -1
    13. Dim columnHeading As Excel.Range = CType(xlSt.Cells(1, currentColumn), Excel.Range)
    14. Select Case columnHeading.Value2.ToString
    15. 'spalten behalten
    16. Case "Kunde 1", "Ziffer", "#Num_IT", "col2", "Product A", "col14"
    17. Case Else
    18. 'den rest löschen
    19. CType(xlSt.UsedRange.Columns(currentColumn), Excel.Range).Delete()
    20. End Select
    21. Next
    22. Next
    23. xlWb.Save()
    24. xlApp.Quit()
    25. xlApp = Nothing
    26. Catch g As Exception
    27. MessageBox.Show(g.ToString)
    28. End Try
    29. End Sub
    30. End Class


    viel Erfolg