Schnellste Methode zum auslesen !

Hallo

Ich möchte nach bestimmten Werten in meinem Tabellenblatt („A1:smiley:D500“)
suchen und die Anzahl der gefundenen Werte anzeigen lassen.

Bachten muss ich, dass in gewissen Zellen der Wert und noch ein anderer Wert enthalten ist.
Bsp.: habe eine Zelle in der ABC-DEF steht. Suche aber den Wert ABC, dann soll es diese Zelle mit einberechnen. Das wird wohl mit .Value = „ABC“ & * oder so etwas machbar sein.

Nun kommt die eigentliche Frage:
Wie kann ich aus so einer grosse Datenmenge schnellstmöglich die Daten raussuchen. Mit einer For i Schleife habe ich das sicher nicht das Optimum. Denn die Schleife wird jede Zelle durchrattern.

Weiss da jemand Rat ?

Danke
Flexo

Grüezi Flexo

Ich möchte nach bestimmten Werten in meinem Tabellenblatt
(„A1:smiley:D500“)
suchen und die Anzahl der gefundenen Werte anzeigen lassen.

Bachten muss ich, dass in gewissen Zellen der Wert und noch
ein anderer Wert enthalten ist.
Bsp.: habe eine Zelle in der ABC-DEF steht. Suche aber den
Wert ABC, dann soll es diese Zelle mit einberechnen. Das wird
wohl mit .Value = „ABC“ & * oder so etwas machbar sein.

Na, ganz einfach mit der folgenden Formel:

=ZÄHLENWENN(A1:smiley:D500;"*ABC*")

Wie kann ich aus so einer grosse Datenmenge schnellstmöglich
die Daten raussuchen. Mit einer For i Schleife habe ich das
sicher nicht das Optimum. Denn die Schleife wird jede Zelle
durchrattern.

Weiss da jemand Rat ?

…oh, oder muss es VBA sein - dann so:

MsgBox WorksheetFunction.CountIf(Range(„A1:smiley:D500“), „*ABC*“)

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Genau, danke Thomas

Kann mir jemand auch erklären wieso diese Funktion schneller ist als eine Schleife. Mich würde interessieren wie Funktion arbeitet.

Danke Flexo

Kann mir jemand auch erklären wieso diese Funktion schneller
ist als eine Schleife. Mich würde interessieren wie Funktion
arbeitet.

Hallo Flexo,

die Funktion Zählenwenn wird wohl auch eine For Schleife eingebaut haben *glaub*
Aber die ist schon in Maschinencode oder sehr nah an Maschinencode kompiliert worden.

Genaue Zahlen habe ich nicht, kann durchaus auch drauf ankommen um welche Excel-Funktionalität es geht aber Aussagen von anderen zufolge sind eingebaute Excelfunktionen 1.000 bis 10.000 mal schneller als Vba.

Das liegt daran daß Vba den Code zur Laufzeit übersetzt, interpretiert. Wird ein Vba-Code gestartet so wird nur ganz wenig kompiliert, es werden die Variablen und Platz für sie angelegt und noch wenige Dinge getan, der große Restcode wird interprtiert.
Und das übersetzen hält halt auf.

In Zählenwenn ist der Code schon interpretiert.
Naja, ich bin in Theorie noch schlechter als in der Vba-Praxis.

Lese mal da nach

http://de.wikipedia.org/wiki/Visual_Basic_for_Applic…
und auch bei dem Link der dort unter „interpretierte“ versteckt ist.

Gruß
Reinhard

Danke für die super Erklärung… wow 1000x mal schneller :smile:

Gruss
Flexo

Danke für die super Erklärung… wow 1000x mal schneller :smile:

Hallo Flexo,

das ist das was ich schon gelegentlich in Antworten gelesen habe.
Ich habe auch gelesen daß z.B. eine For-Schleife 10 mal schneller sein soll als eine Do-Schleife.

Zum selbst Testen von sowas kannst du ja grundsätzlich z.B. so vorgehen:

Dim T as Single
T=Timer
'Hier deine For-Schleife
msgbox Timer-T
T=Timer
'Hier die Countif-Zeile von Thomas
msgbox Timer-T

Mit so einem Grundvorgehen kannst du auch mal selbst testen was z.B. bei anderen Codes Application.Screenupdating=False/True in der Realität so „bringt“.

Und wenn du das wie ich für dich selbst wissen/austesten willst,
bau um das ganze eine For-Schleife , werfe die Msgbox raus und laß dir die Zeiten in die Exceltabelle eintragen und lasse es so 100, 200 mal laufen.

Denn ich als Laie weiß nicht was exakt genau grad in dem Moment des Codelaufs Windows so treibt.
Vielleicht läuft grad in einer anderen Mappe das Addin „Automatisches Speichern“, irgendein anderes Programm wird grad heimlich aus dem Internet upgedatet oder sonst was.
Das kann bedeuten daß zur laufzeit des Codes für Excel grad wenig Ressourcen zur Verfügung stehen.

Wie auch immer, ich habe derart schon oft etwas getestet, verglichen was schneller ist, ich muß dir sagen da gibt es verblüfende Ergebnisse. Bis hin zur Uneinheitlichung welche Variante schneller ist, sprich, manchmal war auch die vermeintlich langsamere schneller oder gleichschnell.

Und, die Ergebniszeiten sind sehr oft die „gleichen“
Also nicht so Zeiten
3,12456
3,27645
2,9787
2,87642

sondern
3,12456
3,12456
2,87642
2,87642

Verstanden habe ich das bislang noch nicht. Scheinbar liegt es an den „Zeitsprüngen“ von/im Timer. Denn dies erinnert mich sehr stark an die Zellhöhen in Excel.
Dort kannst du/ich schon in einer For schleife angefangen von A1 nach unten den Zellen unterschiedliche Zellhöhen „verpassen“.
Auch da kristallisieren sich bestimmte Zahlenwerte heraus, alle anderen kann Excel nicht darstellen.

Nach einer geheimnisvollen Rundungslogik rundet Excel also alle Werte ab oder ggfs auch auf.
Bei Zellhöhen verstehe ich es ja leicht daß wenn ich sage
.Rowheight=2.2345678
daraus dann
.Rowheight=2.235
gemacht hat weil es „kleiner“, also die x-te Nachkommastelle, nicht umsetzen kann.
Wenn dies also beim Timer genauso ist, was ich glaube, so ist einiges geklärt aber nicht alles :frowning:

Naja, spiel, teste selbst dann verstehst du was ich meine.

Gruß
Reinhard

Vielen lieben Dank.

Krass was man alles so machen kann.

Grüsse
Flexo

1 Like