VBA CountIfs Zahlen in Klassen sortieren

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    VBA CountIfs Zahlen in Klassen sortieren

    Hallo zusammen,

    hab jetzt schon gefühlt alle Foren durchschaut, aber leider nichts gefunden. Habe folgendes Problem:
    Ich habe in Spalte A beliebige Dezimalwerte zu stehen. Diese sollen in Klassen geordnet werden. Aus der Spalte B lese ich folgendes ein: einen Minimumwert (Startwert) , einen Maximumwert (Endwert) und die gewünschte Klassenbreite. Die Ausgabe der Klassen und der Anzahl der Werte im jeweiligen Klassenbereich sollen in den Spalten C und d angezeigt werden. Hierfür nutze ich die CountIfs Funktion. Für ganzzahlige Start und Endwerte klappt das auch super (z.B. Start 0, Ende 6, Breite 1), aber nicht für einen Startwert von 0,5 einen Endwert von 5,6 und eine Klassenbreite von 0,1 will. Kann mir hier Jemand bitte weiterhelfen? ?( Meine Vermutung ist das die CountIf bzw CountIfs Funktion nur mit ganzzahligen Kriterien arbeitet.
    Hab mal die Excel mit Bespielwerten in den Anhang gepackt ^^
    Der Code mit Kommentaren:

    Visual Basic-Quellcode

    1. Sub Klassenordnen()
    2. ' Dim MinValue As Double 'Deklaration notwendig?! funktioniert mit ganzen zahlen auch ohne
    3. ' Dim MaxValue As Double
    4. ' Dim Breite As Double
    5. ' Dim MaxValueKlasse As Double
    6. ' Dim MinValueKlasse As Double
    7. ' Dim KlassenZahl As Double
    8. 'Variablenwerte einlesen
    9. MinValue = Worksheets("Daten").Range("B1").Value
    10. MaxValue = Worksheets("Daten").Range("B2").Value
    11. Breite = Worksheets("Daten").Range("B3").Value
    12. KlassenZahl = (MaxValue - MinValue) / Breite
    13. 'Letzte Reihe finden
    14. LastRow = Worksheets("Daten").Range("A" & Rows.Count).End(xlUp).Row
    15. Dim DataRange As Range
    16. Set DataRange = Worksheets("Daten").Range("A2:A" & LastRow)
    17. 'Schleife für Klassengrenzen + Sortieren der Werte
    18. For B = 1 To KlassenZahl
    19. MaxValueKlasse = MinValue + Breite
    20. Worksheets("Daten").Range("C" & 1 + B).Value = MaxValueKlasse
    21. ergebnis = _
    22. Application.WorksheetFunction.CountIfs(Worksheets("Daten").Range("A2:A" & LastRow), "<=" & MaxValueKlasse, Worksheets("Daten").Range("A2:A" & LastRow), ">=" & MinValue)
    23. Worksheets("Daten").Range("D" & 1 + B).Value = ergebnis
    24. MinValue = MaxValueKlasse
    25. Next
    26. End Sub


    CodeTags gesetzt ~VaporiZed
    Dateien
    • Mappe1.xlsx

      (8,29 kB, 130 mal heruntergeladen, zuletzt: )

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

    piniata schrieb:

    nicht für einen Startwert von 0,5 einen Endwert von 5,6 und eine Klassenbreite von 0,1
    Ist das auch, wenn du Dezimalpunkt statt Komma verwendest (oder umgekehrt)?
    Es ist immer schwierig, eine Mischung aus WorksheetFunction und VBA-Funktion in regional unterschiedlichen Umgebungen allgemeingültig zu implementieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Entscheidend ist hier die Komma-Schreibweise der Zahl 3,23
    Wenn diese Formel in Excel funktioniert, dann musst du wohl den Punkt in deiner Zahl durch Komma ersetzen.

    Visual Basic-Quellcode

    1. Zahl = 3.23
    2. VergleichsOperator = "<=" & Replace(Zahl,".",",")
    3. 'oder universeller
    4. VergleichsOperator = "<=" & Replace(Zahl,".",Application.DecimalSeparator)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --