Clever-Excel-Forum

Normale Version: Häufigkeit eines Zahlenwertes in einem Feld berechnen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
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.
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
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!
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!
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
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
@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
@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
50 leerzeilen löschen ?  1 Minute ?


Code:
Sub M_snb()
  columns(1).specialcells(4).entirerow.delete
End sub
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
Seiten: 1 2 3