Visual Basic; System.NullReferenceException; For Each über Array-Elemente; If Abfrage;

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von FiLA85.

    Visual Basic; System.NullReferenceException; For Each über Array-Elemente; If Abfrage;

    Kann mir jemand sagen wieso der folgende Code immer einen Ausnahmefehler "System.NullReferenceException" liefert wenn ich mehrere Einträge (mit Leerzeichen getrennt) in txt_Allele eingebe. Wenn ich nur einen Wert eintrage funktioniert die Ausgabe.
    Der Fehler tritt in der If Abfrage in Zeile 11 auf.

    VB.NET-Quellcode

    1. Private Sub btn_search_Click(sender As Object, e As EventArgs) Handles btn_search.Click
    2. Dim allele() As String
    3. Dim i As Integer
    4. Dim Ende As Long
    5. Dim allel As String
    6. Dim space() As Char = {" "c}
    7. allele = txt_Allele.Text.Split(space)
    8. For i = 1 To 500
    9. For Each allel In allele
    10. If worksheet.Cells(i, 1).Value = allel Then
    11. ListBox1.Items.Add(worksheet.Cells(i, 11).Value)
    12. ListBox2.Items.Add(worksheet.Cells(i, 12).Value)
    13. End If
    14. Next
    15. Next
    16. End Sub
    @FiLA85 Willkommen im Forum. :thumbup:
    Das ist ein typischer Fehler, wo wir hier nicht so richtig helfen können, da wir keine Kenntnis von Deinen Objekten haben.
    Was Du machen kannst: Wenn es knallt, untersuche die Objekte, welche(s) davon Nothing ist.
    Dazu musst Du das tun, was hier jeder Programmierer macht: Debuggen, in Deinem Kämmerlein an Deinem Code.
    Gugst Du hier.
    Kandidaten wären zunächst Cells(i, 1). Warum fängt Deine Zählung bei 1 und nicht bei 0 an?
    Warum endet sie bei 500 und nicht bei der Anzahl der Objekte (-1)?

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du könntest uns mal mehr darüber erzählen was du genau vor hast. Da die NullReferenceException in Zeile 11 auftritt, ist Value oder allel null (Nothing) bzw. uninitialisiert.

    Vereinfachen könnte man den ganzen Code so:

    VB.NET-Quellcode

    1. For i As Integer = 1 To 500
    2. For Each allel in txt_Allele.Text.Split(" ")
    3. If worksheet.Cells(i, 1).Value = allel Then
    4. ListBox1.Items.Add(worksheet.Cells(i, 11).Value)
    5. ListBox2.Items.Add(worksheet.Cells(i, 12).Value)
    6. End If
    7. Next
    8. Next

    Ist letztenendes vom Sinn her das selbe was du da stehen hast. Ginge sogar noch schneller per Linq.
    Aber vielleicht hilfts dir ja.

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports Excel = Microsoft.Office.Interop.Excel
    3. Module Module1
    4. Dim APP As New Excel.Application
    5. Dim worksheet As Excel.Worksheet
    6. Dim workbook As Excel.Workbook
    7. Dim Allele() As String
    8. Dim wb As String, ws As String
    9. Dim Ende As Integer
    10. Sub Main()
    11. Console.WriteLine("Dateipfad:")
    12. wb = Console.ReadLine()
    13. workbook = APP.Workbooks.Open(wb)
    14. worksheet = workbook.ActiveSheet
    15. With worksheet
    16. Ende = .Range("A" & .Rows.Count).End(Excel.XlDirection.xlUp).Row
    17. End With
    18. Console.Write("Allele:")
    19. Allele = Console.ReadLine().Split(" ")
    20. Console.WriteLine()
    21. Console.WriteLine("--------------------------------------------------------")
    22. For i = 2 To Ende
    23. For Each allel In Allele
    24. If worksheet.Cells(i, 1).Value = allel Then
    25. If worksheet.Cells(i, 11).Value = [String].Empty Then
    26. Console.Write(allel & " " & " ")
    27. Else Console.Write(allel & " " & worksheet.Cells(i, 11).Value & " ")
    28. End If
    29. If worksheet.Cells(i, 12).Value = [String].Empty Then
    30. Console.WriteLine(" ")
    31. Else Console.WriteLine(worksheet.Cells(i, 12).Value)
    32. End If
    33. End If
    34. Next
    35. Next
    36. Console.ReadLine()
    37. workbook.Close()
    38. APP.Close()
    39. Marshal.ReleaseComObject(workbook)
    40. Marshal.ReleaseComObject(APP)
    41. End Sub
    42. End Module


    Hallo,
    das ist der Code. Musste alles noch etwas ändern, da eine Kommandozeilenausgabe gewünscht war. Funktioniert jetzt soweit. Allerdings macht APP.Close() Probleme. Bekomme da die Fehlermeldung "System.MissingMemberException". Wenn ich den Befehl weglasse, wird der Excel Prozess dann nicht geschlossen? Bzw. gibt ne andere/ bessere Möglichkeit um die Excel Prozesse zu killen?
    Danke im voraus!