Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
03.01.2017, 18:34
(Dieser Beitrag wurde zuletzt bearbeitet: 03.01.2017, 18:35 von RPP63.)
Ist natürlich nicht "schlimm", atilla! :angel: Aber: Die Build-Ins sind idR pfeilschnell! Beispiel: A1:A10000: =WIEDERHOLEN("a"&ZEICHEN(32);ZUFALLSBEREICH(0;9))&"b" Kopiert und als Wert eingefügt. Sub Quatsch() Dim Start As Double, Ergebnis As Long Start = Timer Ergebnis = Evaluate("=SUMPRODUCT(LEN(A1:A10000)-LEN(SUBSTITUTE(A1:A10000,"" "","""")))") MsgBox "Ergebnis ist: " & Ergebnis & " in " & Format(Timer - Start, "0.000") & " Sekunden" End Sub 45.053 Leerstellen gefunden in 0,06 Sekunden (alte Möhre) (und gleich versuche ich dies mit Deiner Variante) 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)
Registriert seit: 01.08.2016
Version(en): 2007
Hallo, ich habs jetzt mal so gemacht: Code: Sub Leerzeichen_Zählen() Dim vArray As Variant, i%, zähle%
vArray = Range("A1:A100") For i = 1 To UBound(vArray) zähle = zähle + InStr(vArray(i, 1), " ") Next
Debug.Print "Leerzeichen: " & zähle
End Sub
Bin mal auf den Geschwindigkeits-Test mit deiner Lösung gespannt Ralf. Aber ich glaub du bist hier dann doch der Speedy Gonzales. Insofern schon mal meinen herzlichsten Dank.
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
03.01.2017, 18:56
(Dieser Beitrag wurde zuletzt bearbeitet: 03.01.2017, 18:56 von RPP63.)
Yepp! Sub atilla()
Dim i As Long, lngAnzahl As Long
Dim Start As Double
Start = Timer
For i = 1 To 10000
If Cells(i, 1) <> "" Then lngAnzahl = lngAnzahl + Ubound(Split(Cells(i, 1)))
Next i
MsgBox "Ergebnis ist: " & lngAnzahl & " in " & Format(Timer - Start, "0.000") & " Sekunden"
End Sub Dauer: 0,5 Sekunden ca. 9mal langsamer! ¡Ándale! ¡Ándale! (frei nach Speedy) ;) 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)
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo Ralf, das war doch nur eine Möglichkeit. Ein wenig modifiziert kann ich auch den Turbo einschalten. Teste mal: Code: Option Explicit
Sub schreib() Range("a1:a10000") = "Bin mal auf den Geschwindigkeits-Test mit deiner Lösung gespannt Ralf." _ & "Aber ich glaub du bist hier dann doch der Speedy Gonzales." _ & "Insofern schon mal meinen herzlichsten Dank." End Sub
Sub leerzeichen() Dim i As Long, lngAnzahl As Long, f Dim Start As Double, Ergebnis As Long Start = Timer f = Range("a1:a10000") For i = 1 To 10000 lngAnzahl = lngAnzahl + UBound(Split(f(i, 1))) Next i MsgBox "Ergebnis ist: " & lngAnzahl & " in " & Format(Timer - Start, "0.000") & " Sekunden" End Sub
Sub Quatsch() Dim Start As Double, Ergebnis As Long Start = Timer Ergebnis = Evaluate("=SUMPRODUCT(LEN(A1:A10000)-LEN(SUBSTITUTE(A1:A10000,"" "","""")))") MsgBox "Ergebnis ist: " & Ergebnis & " in " & Format(Timer - Start, "0.000") & " Sekunden" End Sub
Mit obiger Testanordnung bin ich minimal schneller als Du :21: Grundsätzlich kann man sagen, meine Variante ist bei größeren Datensätzen schneller. @Lupy Bist Du sicher, dass Du mit Deiner Variante richtige Ergebnisse erhälst?
Gruß Atilla
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
Zitat:Mit obiger Testanordnung bin ich minimal schneller als Du [img] Dateiupload bitte im Forum! So geht es: Klick mich! ] Yepp, die Variable heißt ja auch f wie fast (it's an english word)! ;) (Although it's an evil Variant) Denkbar, dass ein String noch ein paar Tausendstel herauskitzelt, aber ich gebe mich geschlagen! :19: 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)
Registriert seit: 13.04.2014
Version(en): 365
Hallo ihr Speedys, es macht euch doch hoffentlich nichts aus, wenn ich sage, dass eure Codes zwar schnell, aber fehlerhaft sind! Der von Atilla ganz besonders. Arbeitsblatt mit dem Namen 'Tabelle1' | | A | B | C | D | E | F | G | H | I | 1 | Bin mal auf den Geschwindigkeits-Test mit deiner Lösung gespannt Ralf.Aber ich glaub du bist hier dann doch der Speedy Gonzales.Insofern schon mal meinen herzlichsten Dank. | Leer-Ergebnis ist: 23000 in 0,016 Sekunden | Quatsch-Ergebnis ist: 23976 in 1,195 Sekunden | Test-Ergebnis ist: 24000 in 0,063 Sekunden | | | 172 | 148 | 24 |
Zelle | Formel | G1 | =LÄNGE(A1) | H1 | =LÄNGE(WECHSELN(A1;" ";"")) | I1 | =G1-H1 |
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg |
1000Zeilen Text aus A1, 1000Leerzeilen, 1000Zeilen 1Wort! Bei Detlef fehlt immer eine Zeile. Am schnellsten ist aber immer noch die Formel!
Leerzeichen.xlsb (Größe: 21,12 KB / Downloads: 3)
Gruß
Edgar
Meine Antworten sind freiwillig und ohne Gewähr! Über Rückmeldungen würde ich mich freuen.
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo Edgar, erwischt. :@ Um auf jeden Fall schneller zu sein hatte ich beim letzten Code etwas getrickst. Die Variante gibt nur richtige Ergebnisse aus, wenn alle Zellen einen Text enthalten. Um auf alle Fälle richtige Ergebnisse zu erhalten hatte ich vorher eine IF Abfrage drin. Ralf konnte ich damit hinters Licht führen. War dumm von mir das im Nachhinein nicht doch noch korigiert zu haben. Aber auch mit der If Abfrage bin ich bei mir schneller. Folgende Testumgebung: Const Menge = 10000 Text wie bei Dir in der Tabelle bis Zeile 1000 Mein Code mit der If Abfrage: Code: Sub Bleerzeichen() Dim i As Long, lngAnzahl As Long, f Dim Start As Double, Ergebnis As Long Start = Timer f = Range("a1:a" & Menge) For i = 1 To Menge If f(i, 1) <> "" Then lngAnzahl = lngAnzahl + UBound(Split(f(i, 1))) Next i Cells(1, 2) = "Leer-Ergebnis ist: " & lngAnzahl & " in " & Format(Timer - Start, "0.000") & " Sekunden" End Sub
Ralfs Code: Code: Sub CQuatsch() Dim Start As Double, Ergebnis As Long Start = Timer Ergebnis = Evaluate("=SUMPRODUCT(LEN(A1:A" & Menge & ")-LEN(SUBSTITUTE(A1:A" & Menge & ","" "","""")))") Cells(2, 2) = "Quatsch-Ergebnis ist: " & Ergebnis & " in " & Format(Timer - Start, "0.000") & " Sekunden" End Sub
Testergebnisse: Leer-Ergebnis ist: 24000 in 0,008 Sekunden Quatsch-Ergebnis ist: 24000 in 0,023 Sekunden Leer-Ergebnis ist: 24000 in 0,008 Sekunden Quatsch-Ergebnis ist: 24000 in 0,008 Sekunden Es treten immer die obigen Ergebnisse auf. Du hast in Deiner Mappe bei den Codes nicht immer die gleichen Voraussetzungen. Bei meinem z.B. Menge als Konstante mit 3000 und bei Ralf einen festen Bereich von A2:A1000000
Gruß Atilla
Registriert seit: 29.09.2015
Version(en): 2030,5
04.01.2017, 00:47
(Dieser Beitrag wurde zuletzt bearbeitet: 04.01.2017, 00:47 von snb.)
Code: Sub M_snb() MsgBox UBound(Split(Join([transpose(A1:A1000)], ""))) End Sub
Registriert seit: 01.08.2016
Version(en): 2007
04.01.2017, 14:32
(Dieser Beitrag wurde zuletzt bearbeitet: 04.01.2017, 14:45 von Lupy.)
Hallo liebe Leute, zunächst mal vielen Dank für eure Bemühungen und zahlreichen Antworten. Und - ihr ahnt es schon - jetzt habe ich mal wieder ein Problem. SNB formuliert mit seiner Super Formel so: Code: Debug.Print UBound(Split(Join([transpose(A1:A1000)], "")))
So weit, so schön. Nur wie lautet diese Formel, wenn ich nicht bis A1000 rechnen möchte, sondern bis zur letzten beschriebenen Zelle in der Spalte A. Die Reihe der letzten Zelle bekomme ich ja so raus: Code: Dim z% z = Cells(Rows.Count, 1).End(xlUp).Row
A1:A1000 ist in der Formel von snb aber kein String. Und ich weiß einfach nicht wie ich dies jetzt umsetzen könnte.
Registriert seit: 13.04.2014
Version(en): 365
04.01.2017, 15:34
(Dieser Beitrag wurde zuletzt bearbeitet: 04.01.2017, 15:34 von BoskoBiati.)
Hallo, bei der Geschwindigkeit geht auch das: Code: Debug.Print UBound(Split(Join([transpose(A1:A1000000)], "")))
braucht ca. 0,1s
Gruß
Edgar
Meine Antworten sind freiwillig und ohne Gewähr! Über Rückmeldungen würde ich mich freuen.
|