Leerzeichen zählen
#11
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)
Top
#12
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.
Top
#13
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)
Top
#14
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
Top
#15
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)
Top
#16
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'
 ABCDEFGHI
1Bin 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 SekundenQuatsch-Ergebnis ist: 23976 in 1,195 SekundenTest-Ergebnis ist: 24000 in 0,063 Sekunden  17214824

ZelleFormel
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!



.xlsb   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.
Top
#17
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
Top
#18
Code:
Sub M_snb()
   MsgBox UBound(Split(Join([transpose(A1:A1000)], "")))
End Sub
Top
#19
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.
Top
#20
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.
Top


Gehe zu:


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