Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Häufigkeit eines Zahlenwertes in einem Feld berechnen
#11
Insbesondere weil hier der "Auslöser" der Frage der Lernwille in einer Einstiegsphase ist scheint mir wichtig zu erwähnen:

Schleifen sind durchaus eine Möglichkeit, Zelle für Zelle zu prüfen.
ABER: In der Regel sind sie erheblich langsamer als durch Excel bereitgestellte Prüf-Routinen wie ZÄHLENWENN (Countif) oder andere Vergleichsmöglichkeiten. - Bei dieses 9 Datensätzen ist das nicht merkbar, aber bei 90.000 oder mehr ist die Zeit-Differenz durchaus spürbar.

Wichtig ist aber gerade zu Beginn, viele Wege kennen zu lernen und dann von Fall zu Fall eine Entscheidung zu treffen.
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!
[-] Folgende(r) 1 Nutzer sagt Danke an GMG-CC für diesen Beitrag:
  • Stracciatella
Antworten Top
#12
Hallo mal wieder!
Um Günthers Aussage zu bekräftigen, hier mal ein paar Zahlen:

Ausgangsposition
2.600.000 Zellen (A1:Z100000) werden mit =ZUFALLSZAHL(100;999) gefüttert,
danach wurden die Formeln gegen deren Werte ausgetauscht.

CountIfRPP("A1:Z100000"; 200)
Ergebnis: 2883, Laufzeit: 32,1 sek.

CountIfRPP2("A1:Z100000"; 200)
Die Bremse in der ersten Funktion sind die einzelnen Zellzugriffe.
Deshalb das Ganze mal mit einem großen Array:

Function CountIfRPP2(rng As Range, vSearch As Variant) As Long
Dim rZelle As Range, arrRng()
Dim lZeile As Long, iSpalte As Integer
arrRng = rng
For lZeile = 1 To 100000
  For iSpalte = 1 To 26
     If arrRng(lZeile, iSpalte) = vSearch Then CountIfRPP2 = CountIfRPP2 + 1
  Next
Next
End Function
Ergebnis: 2883, Laufzeit: 2,3 sek
(man könnte sich entspannt zurücklehnen, aber!)

WorksheetFunction.CountIf(Tabelle1.Range("A1:Z100000"), 200)
Ergebnis: 2883, Laufzeit: 0,4 sek

Q.e.d.!
Wenn ein VBA-Künstler schneller wäre als die MS-Entwickler, die hardwarenah programmieren können, wäre irgendetwas faul im Staate Dänemark …

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • Stracciatella
Antworten Top
#13
Liebe Leute,

Danke für eure Unterstützung. Zum Forum: Ich glaube besonders wenn es um Formel und einzubauende Formeln geht, wird mein erster Weg jetzt immer zu euch führen. Hiervon gibt es leider mehr als reichlich
in VBA. Für alle, die sich nicht unendliche Stunden mit VBA und diesen eingebauten Funktionen beschäftigen wollen und können ist diese Menge schlicht unüberschaubar. Ralf hatte es ja mit seinem Algorithmus vorgemacht. Eingebaute Funktionen sind aufgrund ihrer Programmierung bezüglich der Geschwindikeit nicht zu schlagen. Aber auch diese Schleifen und der damit Alternativcode ist wichtig, um zumindestens ein grundsätzliches Verständnis
der VBA Programmierung zu gewinnen. Leider kann man, oder zumindest ich, nur an der VBA Oberfläche kratzen.

In diesem Sinne, sage ich: Bis die Tage!
Antworten Top
#14
Hi,

(15.02.2016, 14:14)Stracciatella schrieb: Leider kann man, oder zumindest ich, nur an der VBA Oberfläche kratzen.

im Laufe der Zeit kratzt Du immer tiefer! Steter Tropfen höhlt den Stein!
Antworten Top
#15
Auch wenn diese kleine Makro hier vielleicht nicht ganz hingehört, es veranschaulicht doch in idealtypischer Art und Weise den Einsatz von countIf und zeigt dessen Möglichkeiten. Es ist sozusagen ein VBA-Idiom.
 
Das Löschen von doppelten Einträgen in einem Excel-Tabellenblatt.
Code:
Sub DoppelteEinträgeLöschen()
Dim letztezeilennummer As Long
Dim zeilennummer As Long

letztezeilennummer = Cells(Rows.Count, 1).End(xlUp).Row

For zeilennummer = letztezeilennummer To 1 Step -1
If WorksheetFunction.CountIf(Range("A1:A" & zeilennummer), Cells(zeilennummer, 1)) > 1 Then
Cells(zeilennummer, 1).EntireRow.Delete
End If
Next

End Sub
Antworten Top
#16
Moin!
Sehr schönes Beispiel, wie man ein Rennpferd entschleunigen kann.  :19:
So ein Gaul ohne Beine kann halt nur kriechen ...
(ich hoffe mal, dass Du im positiven Sinn provozieren wolltest)

Mach mich schlau,
grüßt
Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#17
@radrat
Hello,

Darf ich eine Frage zu deinem Code mit worksheetfunction.countif stellen?


Als Autodidakt hätte ich die Kombination von Sheet-Formeln für Zählenwenn und die Lösch-Funktion in vba gewählt, ohne aber eine Idee von den Vor- und Nachteilen zu haben. I h schreibe eben codes, die mir am einfachsten erscheinen.

Ich hoffe, dass die Frage, wann ist es besser Formeln im sheet, wann vba zu nutzen von allgemeinem Interesse ist.

Mfg
Antworten Top
#18
@Fennek:
Falls ratrad dies wirklich ernst gemeint haben sollte:
Gewöhne Dir nie an, zeilenweise zu löschen!
Es gibt keine langsamere Methode.

Ungeprüft schätze ich mal, dass das Entfernen von 50 Datensätzen aus einer Liste von 1.000 Daten fast eine Minute benötigt.
Nimmst Du statt dessen Range.RemoveDuplicates, dürfte dies in ~0,1 Sekunden erledigt sein.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#19
50 leerzeilen löschen ?  1 Minute ?


Code:
Sub M_snb()
  columns(1).specialcells(4).entirerow.delete
End sub
Antworten Top
#20
Hi snb!  :19:
Du musst schon lesen, in welchem Zusammenhang ich den Satz geschrieben habe.
Ich bezog mich auf die Schleife von ratrad.
Dort ging es übrigens um Duplikate, nicht um leere Zellen xlCellTypeBlanks

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top


Gehe zu:


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