Listbox und Array Berechnungen in VB durchführen - Allgemeine Hilfestellung gesucht

  • VB.NET

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

    Listbox und Array Berechnungen in VB durchführen - Allgemeine Hilfestellung gesucht

    Hallo Ihr.
    Ich bin zwar nicht neu hier, weil mir lesen aber gerade nicht weiterhilft, bin ich jetzt doch neu hier. und zwar angemeldet.

    Ich komme eigentlich aus der Excel Ecke mit VBA, daher seid bitte nachsichtig, wenn ich nicht alles auf Anhieb richtig verstehe.

    Zur Sache:
    Ich habe in Form1 37 Buttons mit den Zahlen 0 bis 36. Mit jedem Button wird die entsprechende Zahl in eine Listbox übergeben.
    Diese Listbox wird von oben nach unten befüllt. Sprich die items (Zahlen) werden mir als String immer an Position 0 angefügt.
    Mit einem weiteren Button kann ich jeweils die letzte Eingabe rückgängig machen, falls man sich verklickt hat.
    Diese Liste kann ich über einen save file dialog als txt datei speichern und später auch wieder neu laden.
    So weit, so klar.

    Das Problem:
    Ich will jede zahl für sich zählen, wie oft sie in der Liste ist. damit befülle ich ein array. ich habe für jede zahl also ein array und zähle mit.
    Wenn ich mich jetzt aber verklickt habe und einen Schritt rückgängig mache (oder 2 oder 3), dann bleibt die zahl ja in dem array.
    Wie bekomme ich die entsprechend zu dem letzten Listbox eintrag aus ihrem zugehörigen array gelöscht? ich steh da echt auf dem schlauch.

    Problem 2:
    jetzt habe ich 37 arrays, befüllt mit unterschiedlicher anzahl an strings, bzw. integers, und möchte die gern in einer weiteren Listbox entsprechend
    ihrer jeweiligen Anzahl an strings absteigend ordnen. Am besten, dachte ich, mache ich das in 2 Spalten und lasse *Zahl* in der ersten Spalte und *Wert*
    kommt dann in die zweite Spalte.
    Über Tipps zur Umsetzung bin ich echt dankbar, denn in VBA hab ich excel einfach die Arbeit machen lassen und die UserForm einfach nur zur Ein- und Ausgabe benutzt.
    Ich schlauchstehe gerade besser als je zuvor. ?(

    Und falls ihr alle im Feiertagsmodus seid, dann wünsche ich einen guten Rutsch in 2018 (gehabt zu haben).
    Hallo

    Habe mal was gemacht. Bin aber nicht sicher ob es das ist, was Du willst. Zumindest als Denkanstoss sollte es aber genügen, hoffe ich.
    Klar könnte man die Buttons in einem Sub bearbeiten, und die vielen ElseIf durch Select Case ersetzen, aber ich wollte das ganze möglichst "einfach" halten.

    Quellcode

    1. Public Class Form1
    2. Dim OriginalListe As New List(Of Integer)
    3. Dim ZaehlListe(4, 1) As Integer
    4. Dim Anzeigeliste As New List(Of String)
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. OriginalListe.Insert(0, 1)
    7. ListBoxenNeuErstellen()
    8. End Sub
    9. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    10. OriginalListe.Insert(0, 2)
    11. ListBoxenNeuErstellen()
    12. End Sub
    13. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    14. OriginalListe.Insert(0, 3)
    15. ListBoxenNeuErstellen()
    16. End Sub
    17. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    18. OriginalListe.Insert(0, 4)
    19. ListBoxenNeuErstellen()
    20. End Sub
    21. Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
    22. OriginalListe.RemoveAt(0)
    23. ListBoxenNeuErstellen()
    24. End Sub
    25. Sub ListBoxenNeuErstellen()
    26. 'ListBox1
    27. ListBox1.Items.Clear()
    28. For eintraege As Integer = 0 To OriginalListe.Count - 1
    29. ListBox1.Items.Add(OriginalListe(eintraege))
    30. Next
    31. 'ListBox2
    32. 'Array leeren
    33. For i = 0 To 4
    34. ZaehlListe(i, 0) = 0
    35. Next i
    36. 'Array füllen
    37. For eintraege As Integer = 0 To OriginalListe.Count - 1
    38. If OriginalListe(eintraege) = 1 Then
    39. ZaehlListe(1, 0) = ZaehlListe(1, 0) + 1
    40. ElseIf OriginalListe(eintraege) = 2 Then
    41. ZaehlListe(2, 0) = ZaehlListe(2, 0) + 1
    42. ElseIf OriginalListe(eintraege) = 3 Then
    43. ZaehlListe(3, 0) = ZaehlListe(3, 0) + 1
    44. ElseIf OriginalListe(eintraege) = 4 Then
    45. ZaehlListe(4, 0) = ZaehlListe(4, 0) + 1
    46. End If
    47. Next
    48. 'Übergeben und sortieren
    49. Anzeigeliste.Clear()
    50. Anzeigeliste.Add(ZaehlListe(1, 0) & " Eins")
    51. Anzeigeliste.Add(ZaehlListe(2, 0) & " Zwei")
    52. Anzeigeliste.Add(ZaehlListe(3, 0) & " Drei")
    53. Anzeigeliste.Add(ZaehlListe(4, 0) & " Vier")
    54. Anzeigeliste.Sort()
    55. Anzeigeliste.Reverse()
    56. ListBox2.Items.Clear()
    57. For eintraege As Integer = 0 To Anzeigeliste.Count - 1
    58. ListBox2.Items.Add(Anzeigeliste(eintraege))
    59. Next
    60. End Sub
    61. End Class


    Gruss
    Murmeli81
    Vielen lieben Dank, das war wohl der Funke, der der mir gefehlt hat. Ich sollte mich wohl ausschweifender mit der List(Of…) beschäftigen.
    VBA war da irgendwie… naja, eigentlich nur das Aus- und Eingabemedium, den Rest hat ja excel gemacht.
    Also Danke nochmal und nen guten Rutsch gewünscht
    Jetzt taucht noch eine Frage auf @Murmeli81

    ich habe die Zeile für die 4 (nur als Beispiel) jetzt so abgewandelt um die Prozent zu erhalten.

    Quellcode

    1. Anzeigeliste.Add(Math.Round(ZaehlListe(4, 0) / ListBox1.Items.Count * 100, 2) & "%" & " 4")


    Allerdings wird die Sortierung jetzt (und auch vorher schon) durch zweistellige Werte zerrissen.
    Was ich genau damit meine ist, dass die 10,28% erst nach der 1% aufgelistet wird. irgendwie scheint da ein Kniff zu sein, den ich noch nicht verstehe.
    wie sortiert man diese Liste mit beachtung aller Ziffern und nicht nur mit der ersten Ziffer?

    MacPiet schrieb:

    durch zweistellige Werte zerrissen.
    Formatiere alle Werte gleich, teste beide Varianten:

    VB.NET-Quellcode

    1. Dim i = 5
    2. Label1.Text = String.Format("{0:p}", i)
    3. Label2.Text = String.Format("{0:0.00} %", i)
    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!

    Quellcode

    1. 'Übergeben und sortieren
    2. Anzeigeliste.Clear()
    3. Anzeigeliste.Add(String.Format("{0:00.00}% 1", (Math.Round(ZaehlListe(1, 0) / OriginalListe.Count * 100, 2))))
    4. Anzeigeliste.Add(String.Format("{0:00.00}% 2", (Math.Round(ZaehlListe(2, 0) / OriginalListe.Count * 100, 2))))
    5. Anzeigeliste.Add(String.Format("{0:00.00}% 3", (Math.Round(ZaehlListe(3, 0) / OriginalListe.Count * 100, 2))))
    6. Anzeigeliste.Add(String.Format("{0:00.00}% 4", (Math.Round(ZaehlListe(4, 0) / OriginalListe.Count * 100, 2))))
    7. Anzeigeliste.Sort()
    8. Anzeigeliste.Reverse()
    9. ListBox2.Items.Clear()
    10. For eintraege As Integer = 0 To Anzeigeliste.Count - 1
    11. ListBox2.Items.Add(Anzeigeliste(eintraege))
    12. Next