Das Clever-Excel-Forum.de - Treffen
... 14.-16. September 2018 im Allgäu ...

Häufigkeit eines Zahlenwertes in einem Feld berechnen
#1
Hallo VBA Gemeinde,

mich würde interessieren wie man aus einem gegebenem Feld- oder Rangeobjekt, welches ganzzahlige Zahlenwerte enthält, per VBA Code die Häufigkeit des jeweiligen Zahlenwertes in diesem Feld per VBA Code berechnen kann.
to top
#2
Moin!
Ich nehme an Du willst die Häufigkeit der jeweiligen Ziffern in einer Ganzzahl ermitteln?
Dann z.B. so:
Sub ZiffernRPP()
Dim Ziffer(9) As Long, cnt As Long, Nbr As Byte
Dim Meldung As String
  For cnt = 1 To Len(ActiveCell)
     Nbr = Mid(ActiveCell, cnt, 1) + 0
     Ziffer(Nbr) = Ziffer(Nbr) + 1
  Next
  For cnt = 0 To 9
     Meldung = Meldung & cnt & ": " & Ziffer(cnt) & vbLf
  Next
  MsgBox Left(Meldung, Len(Meldung) - 1)
End Sub

1525052712 ergibt dann:



Nachtrag:
Wenn es für einen Bereich (eine Markierung) gelten soll, dann so:

Sub ZiffernRPP()
Dim Ziffer(9) As Long, cnt As Long, Nbr As Byte, Zelle As Range
Dim Meldung As String
   For Each Zelle In Selection
      For cnt = 1 To Len(Zelle)
         Nbr = Mid(Zelle, cnt, 1) + 0
         Ziffer(Nbr) = Ziffer(Nbr) + 1
      Next
   Next
   For cnt = 0 To 9
      Meldung = Meldung & cnt & ": " & Ziffer(cnt) & vbLf
   Next
   MsgBox Left(Meldung, Len(Meldung) - 1)
End Sub

Gruß Ralf
to top
#3
Hallo Ralf,

zunächst einmal vielen herzlichen Dank für deine Arbeit und Mühe. Deinen Code kann ich gut gebrauchen! Ich habe mir das Ganze aber doch etwas anders vorgestellt.
In der Tabelle siehst du einiges an Zahlen. Berechnet werden soll hier die z.B. die Häufigkeit der Zahl 9.  Das Ergebnis wäre 7 Vorkommnisse der Zahl 9, gelb markiert.
Wichtig Zahlen wie 999, 499, 19 usw. sind nicht mitzuzählen.

?mage
to top
#4
Moin,

ich grätsche ungern in bestehende und von einem Kollegen kompetent teilbeantwotete Threads hinein, aber mit dem Verweis, dass ralf mit absoluter Sicherheit eine gelichartige und gleichwertige (oder bessere) Lösung gefunden hätte (du aber gewiss wartest) hier mal meine Lösung:


Code:
Function ZahlZaehlen(rng As Range, Zahl As Integer)
  ZahlZaehlen = WorksheetFunction.CountIf(rng, Zahl)
End Function

Sub ZahlZaehlen2()
  Range("E1") = WorksheetFunction.CountIf(Selection, 9)
End Sub


Da sind zwar keine großen Sicherheitsabfragen drin, aber für diesen kleinen Zweck sollte es reichen. Bei der Funktion kannst du den Bereich per Hand eingeben, bei der Sub wird die (1 !) Markierung ausgewertet.
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
to top
#5
Hallo Günther,

danke für den Code. Funktioniert.
to top
#6
Hallo Eiscreme!  Wink
Wenn Du den Screenshot aus #3 in Deine Threaderöffnung gesetzt hättest, wäre meine Antwort folgende gewesen:

1. Warum VBA? Schließlich gibt es dafür die Funktion =ZÄHLENWENN() (die Günther Dir ja auch in den Code gepackt hat).
2. Wenn es unbedingt VBA sein soll, sollte man sie auch im Code anwenden, insofern volle Zustimmung an Günther.
3. Wenn Du das Rad aber unbedingt (zu Übungszwecken) neu erfunden haben willst, kann man sie auch per Code abbilden. Dann aber nicht als Sub, sondern als UDF (User defined function), die wie eine normale Funktion im Tabellenblatt angewendet wird, aber natürlich auch per Sub berechnet werden kann.

Zunächst die UDF:

Function CountIfRPP(rng As Range, vSearch As Variant) As Long
Dim rZelle As Range
For Each rZelle In rng
  If rZelle = vSearch Then CountIfRPP = CountIfRPP + 1
Next
End Function

Ergibt:

AB
190
2115
39
49
519
629
79
839
99
Formeln der Tabelle
ZelleFormel
B1=CountIfRPP(A1:A9;"a")
B2=CountIfRPP(A1:A9;9)

Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8

Wie ich oben schon schrieb, kann man die UDF auch per Sub rechnen lassen.
Dazu müssen die Argumente der Funktion in der Sub übergeben werden:

Sub AufrufUDF()
MsgBox CountIfRPP(Tabelle1.Range("A1:A9"), 9)
End Sub

(gibt eine MsgBox mit dem Ergebnis 5 aus)

Gruß Ralf
to top
#7
Hallo Ralf,

es gibt hier für mich kein richtig oder falsch. Ich habe mich beim Forum angemeldet um zu lernen. Alternative Lösungsmöglichkeiten sind mir (wie wohl  auch einigen anderen Teilnehmern in diesem Forum) ausdrücklich willkommen. Klar für den den Büroeinsatz nimmt man wohl CountIf wie ich jetzt bei euch gelernt habe. Alternativer Code und andere Lösungsmöglichkeiten erhöhen aber die eigene Flexibilität bei der Arbeit mit Excel und VBA.

Deshalb Dir nochmal herzlichen Dank. Und alle die noch etwas in diesem Thread schreiben wollen: Nur zu Leute!!
to top
#8
Hi!
Wir sind ja auf einer Linie.  19
Es sehe es ebenfalls als ausgesprochene Stärke dieses Forums, dass Alternativen "straflos" 05 von den Antwortenden akzeptiert werden.

In Deinem speziellen Fall kann man die UDF durch eine winzige Änderung noch so modifizieren, dass sie ZÄHLENWENN() überlegen ist.
Wenn man statt: If rZelle = vSearch
If rZelle Like vSearch nimmt,
akzeptiert die UDF auch Asteriske (Platzhalter *).

Dann kann man alle Zellen zählen, die irgendwo die Ziffer 9 beinhalten.

AB
191
2115
397
490
591
6a
79
839
99
Formeln der Tabelle
ZelleFormel
B1=CountIfRPP(A1:A9;"a")
B2=CountIfRPP(A1:A9;9)
B3=CountIfRPP(A1:A9;"*9*")
B4=ZÄHLENWENN(A1:A9;"*9*")

Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8

Gruß Ralf
to top
#9
Code:
Function CountIfCode(rng As Range, crit As String)

cnt = 0

For Each cl In rng

If cl = crit Then

cnt = cnt + 1

End If

Next

CountIfCode = cnt

End Function

Sub CountIF_Auruf()
Debug.Print CountIfCode(Range("A1:C24"), 9)
End Sub
to top
#10
Hi Julia!
Wo genau ist denn jetzt der Unterschied zu meinem Code von 9:11?
(Natürlich bis auf die Tatsache, dass Du die Variablen nicht deklarierst und zusätzlich die hier überflüssige Variable cnt einführst)

Fragt sich mit einem freundlichen Gruß

Ralf
to top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste