Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1500to1504
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zahl aus Zelle extrahieren

Zahl aus Zelle extrahieren
27.06.2016 21:56:50
Tom
Hi zusammen,
schon oft habe ich hier in eurem Forum sehr viele hilfreiche Tipps finden können, die mir bisher immer erfolgreich weiter geholfen haben - dafür an dieser Stelle einmal einen Dank an die Community!
Nun habe ich ein Problem, wo ich ohne eure spezifische Hilfe nicht weiter komme. Ich habe ein Dokument, wo ich in einem Tabellenblatt in Spalte K pro Zelle einen Text in folgender Form stehen habe:
Zeile 1: Überschrift
Zeile 2: AMAZON RETURN 028-4916173-8099541 DE
Zeile 3: AMAZON DE (FBA) 304-2153309-8449909
Zeile 4: AMAZON DE 301-5699004-8126365
In Spalte A will ich nun den mittleren Teil, also "028-4916173-8099541" für Zeile 2 und "304-2153309-8449909" für Zeile 3 usw. aufgeführt haben.
Hierzu habe ich mir bereits eine Formel zusammengebastelt, die wunderbar funktioniert (eingebunden als Matrix-Formel mit geschweiften Klammern).
=TEIL(LINKS(K2;MAX(ISTZAHL(TEIL(K2;SPALTE(1:1);1)*1)*SPALTE(1:1)));VERGLEICH(1;ISTZAHL(TEIL(K2&0; SPALTE(1:1);1)*1)*1;0);LÄNGE(K2))
Mein Problem daran ist nun: Auch schon bei nur 500 Zeilen rödelt mein Rechner gefühlte Ewigkeiten (ca. 10 Sekunden) bis er die Berechnung durchgeführt hat. In der Zeit kann ich nix im Dokument machen.
Das nervt natürlich ziemlich und ich frage euch, ob ich das nicht irgendwie besser / performanter hinkriegen kann? Wenn nötig auch mit VBA - da hab ich aber leider keine Ahnung von :(
Könnt ihr mir sagen, wie ich das optimieren kann?
Vielen Dank schon einmal für eure Rückmeldung!
VG, Tom
P.S.: Ich arbeite mit Office 2016 für Mac - konnte man oben im Thread leider nicht auswählen.

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zahl aus Zelle extrahieren. Matrix verkleinern
27.06.2016 22:36:13
Daniel
Hi
wenn in der Matrixformel die Schleife mit Spalte(1:1) ausgelöst wird, dann ergibt das 16.384 Schleifenumläufe (soviele, wie eine Zeile Zellen hat) in jeder Formel
reduziere hier die Anzahl der der Schleifenumläufe und passe diese an die Maximale Länge der Texte an.
Wenn die Texte nicht länger als 50 Zeichen sind, reicht: Spalte(A1:AZ1)
Gruß Daniel

AW: Zahl aus Zelle extrahieren. Matrix verkleinern
27.06.2016 23:21:18
Tom
Hi Daniel,
danke für deine schnelle Rückmeldung! Das hat's auf jedenfall schonmal gebracht, jetzt bin ich runter auf ca. 3 Sekunden Berechnungszeit - das ist schonmal deutlich weniger, als vorher.
Siehst du denn noch weiteres Optimierungspotential - oder passt das sonst soweit und mehr ist nicht drin?
VG,
Tom

Anzeige
AW: Zahl aus Zelle extrahieren. Matrix verkleinern
27.06.2016 23:34:59
Daniel
Hi
vielleicht eine andere Methode.
um die Position der ersten Ziffer kannst du auch die Matrix-Teil-Formel verwenden:
Min(WennFehler(Finden(Zeichen(Zeile($A$48:$A$57));K2);999))
was immer nur 10 Schleifenumläufe braucht um die Postion zu finden.
ansonsten kann es ggf auch erstmal helfen, nicht alles in eine Formel packen zu wollen.
Sinnvolle Hilfsspalten können die Rechenlast reduzieren (und falls nicht, sind solche Lösungen oft übersichtlicher und leichter verständlich)
Gruß Daniel

AW: Zahl aus Zelle extrahieren. Matrix verkleinern
28.06.2016 02:24:58
Daniel
wenn man davon ausgehen kann, dass die gesuchte Zeichenfolge immer nach dem gleichen Schema aufgebaut ist (1. Block 3 Ziffern, 2. und 3. Block 7 Ziffern), dann auch relativ einfach und schnell:
=Teil(K2;finden("-";K2)-3;19)
Gruß Daniel

Anzeige
AW: Zahl aus Zelle extrahieren. Matrix verkleinern
30.06.2016 19:05:45
Tom
Hi Daniel,
danke für diese Formel - deutlich cooler weil deutlich kürzer :) einfacher zu überblicken. Zeitlich tut sich nicht viel zu deinem vorigen Vorschlag, ca. 3 Sekunden Berechnung, was in Ordnung für mich ist. Ich mach mir halt nur Sorgen, weil sich das Datenvolumen ver-20-fachen wird.

Das geht auch mit VBA-basierten UDFs ...
28.06.2016 02:16:59
Luc:-?
…in einer ZellFml, Tom:
=MaskOn(A2;"num";"-")
Da das Mac-Office aber mitunter Probleme mit UDFs hat, sicherheitshalber noch diese Variante:
=Splint(WECHSELN(A2;" (";"(");;3;3)
Die 1.Fml setzt voraus, dass nur der zu isolierende TextTeil Ziffern enthält, die 2., dass sich dieser Teil immer an 3.Position, also nach dem 2.LeerZeichen befindet, weshalb hier eine QuellText-Korrektur in der Fml erforderlich war/ist.
Beide UDFs sind im Archiv enthalten (MaskOn-ErsatzPublikation von 2014 verwenden!) → RECHERCHE.
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …

Anzeige
AW: Das geht auch mit VBA-basierten UDFs ...
30.06.2016 19:23:45
Tom
Danke für den Hinweis, schau ich mir mal an. Eine Quelltext Korrektur müsste ich sicherlich vornehmen, da die Zahlen entweder nach dem 2. oder nach dem 3. Leerzeichen beginnen.
Wie ist denn deine Einschätzung, was die Performance betrifft? Lohnt sich die Recherche? Die Lösungen von Michael und Daniel habe ich beide am Laufen - beide benötigen ca. 2-3 Sekunden für meine 600 Datensätze.
Kannst du abschätzen, ob und wenn ja inwieweit sich das in etwa durch die UDF verbessern könnte?

Normalerweise wird eine Subroutine, ...
30.06.2016 23:48:03
Luc:-?
…wenn sie gut gemacht ist und temporär BildErneuerung und automatische Berechnung ausschaltet, schneller sein, vor allem bei großen Datenmengen, Tom;
das kann sogar für 1malige Arbeiten nützlich sein, wenn das Pgm wenig Arbeitsaufwand verursacht. Verursacht es deutlich mehr, sollte das Pgm immer wieder mal, ggf mit kleinen Änderungen, einsetzbar sein, weshalb man alles, was sich voraussichtlich ändern könnte, am PgmAnfang in Konstanten (u/o Variablen) steckt. Das wird von Anfängern oft übersehen und hier macht sich auch nicht jeder AWer diese Arbeit, wodurch Erstere das dann auch nur aus eigener Erfahrung lernen.
Bei kleineren und 1maligen Sachen kann eine reine FmlLösung m/o UDFs aber schon sehr nützlich sein, so dass sich die Recherche gewiss lohnt, denn die genannten UDFs können schon so einiges mehr, weshalb sie XlStandardFktt durchaus vglbar sind…
Luc :-?

Anzeige
UDF-Geschwindigkeit
28.06.2016 12:04:39
Michael
Hi zusammen,
Luc:-? argumentiert natürlich zurecht oft dahingehend, daß es unnütz ist, immer wieder das Rad neu zu erfinden, wenn passende Funktionen bereits zur Verfügung stehen.
Aber wenn es denn zeitkritisch ist und mit ein paar Zeilen erledigt, so what?
Diese Dinger in ein *allgemeines* Modul (z.B. Modul1, das in VBA via Einfügen/Modul erzeugt wird):
Option Explicit
Public t0 As Single, t1 As Single
Sub reset()
Range("A2:B602").Clear
End Sub
Sub aw_write()
t0 = Timer
Range("A2:A602").FormulaLocal = "=allesweg(K2)"
t1 = Timer
Range("H3") = (t1 - t0)
End Sub
Sub aw2_write()
t0 = Timer
Range("A2:A602").FormulaLocal = "=allesweg2(K2)"
t1 = Timer
Range("H5") = (t1 - t0)
End Sub
Function allesweg(r As Range) As String
Dim w$, i&, t$
w = r.Value
If InStr(w, "-") > 0 Then
For i = 1 To Len(w)
t = Mid(w, i, 1)
If t = "-" Or (t >= "0" And t = "0" And t = "0" And t  Len(w)
pRe = i - 1
allesweg2 = Mid(w, pLi, pRe - pLi + 1)
End Function

Aufgerufen wird das dann im Blatt z.B. in A2 mit =allesweg(K2) bzw. allesweg2(K2)
Ich habe oben mal eine Geschwindigkeitsmessung eingebaut, aber es scheint keinen Unterschied zwischen beiden Varianten zu geben. Jedenfalls geht es bei Zeilen 2:602 ratz-fatz.
Als Datei: https://www.herber.de/bbs/user/106586.xlsm
Schöne Grüße,
Michael

Anzeige
AW: UDF-Geschwindigkeit
30.06.2016 19:21:13
Tom
Hey Michael,
wow, vielen vielen Dank, dass du dir die Mühe gemacht hast, mir so einen langen Code zu texten! Großes Lob, funktioniert prima!
Ich habs mal zeitlich verglichen mit der Lösung von Daniel: =Teil(K2;finden("-";K2)-3;19)
Ergebnis: Das Makro braucht ebenfalls ca. 2-3 Sekunden für die 600 Datensätze. Also scheinen da wohl die Möglichkeiten weitestgehend ausgeschöpft zu sein.
Was noch bliebe ist der Vorschlag von Luc:-?, das könnte ich mir auch nochmal genauer anschauen.

das deutet darauf hin,
30.06.2016 19:55:16
Michael
Tom,
daß im Blatt selbst (aber auch in einer x-beliebigen, anderen geöffneten Excel-Datei) sehr viele Formeln vorhanden sind, die die Berechnung verlangsamen.
Bei mir läuft das Ding, auch mit 500 Zeilen Testdaten (wie halt in der Datei) im Bereich von ein paar Millisekunden.
Insofern bietet es sich an, das gleich ganz anders zu machen:
Public t0 As Single, t1 As Single
Sub ganzanders()
Dim a, i&, z&, w$, t$
t0 = Timer
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
a = Range("K2:K602")
For z = 1 To 601
w = a(z, 1)
a(z, 1) = ""
If InStr(w, "-") > 0 Then
For i = 1 To Len(w)
t = Mid(w, i, 1)
If t = "-" Or (t >= "0" And t 
Das dauert auf meiner Maschine (also ohne jedwede Formeln usw.) exakt genauso lang wie die anderen Varianten, wirft aber keine oder kaum Neuberechnungen anderer Formeln an (nur einmal beim Zurückschreiben von a).
Das kann man noch garnieren mit calc+events=off, dann sollte es keine SEKUNDEN mehr benötigen.
Schöne Grüße,
Michael
Anzeige

322 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige