Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1536to1540
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

VBA - nach erster Buchstabengruppe Leerzeichen

VBA - nach erster Buchstabengruppe Leerzeichen
19.01.2017 10:27:26
bassi2008

Guten Morgen liebe Exceler,
Ich (glaube ich) hab nun alles greifbare duchgeackert, aber keine der gefundenen Funktionen und lässt sich duch mein Wissen so brauchbar anpassen :-(
Ich möchte aus einer Liste mit ca 10.000 Zellen in einer festlegbaren Spalte den Inhalt der Zelle umstellen.
Die Zellen haben Inhalte aus Buchstaben- und Zahlenkombinationen.
Es fängt immer mit einer Buchstabenkombination verschiedener Länge an.
Gefolgt von Zahlen und Sonderzeichen und eventuell wieder Buchstaben.
Ziel ist es - die erste Buchstabenfolge zu erkennen, ein Leerzeichen zu setzen und den Rest der Zeile so zu belassen wie er ist.
Bsp:
HDU2541-HDA 485-5 soll ergeben: HDU 2541-HDA 485-5
FU4-18-e soll ergeben: FU 4-18-e
AX4-05A soll ergeben: AX 4-05A
POE90 - 52A soll ergeben: POE 90 - 52A
Könnte man das über VBA per Button auslösen?
Viele Grüße
bassi

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - nach erster Buchstabengruppe Leerzeichen
19.01.2017 10:57:27
Daniel
Hi
das geht prinzipell auch mit Formeln.
wenn die Texte in Spalte A stehen, gehe so vor:
1. schreibe in die Spalte B diese Formel. Sie ermittelt die Postion der ersten Zahl.
diese Formel ist eine Matrixformel, dh du musst die Eingabe IMMER mit STRG+SHIFT+ENTER abschließen.
=MIN(WENNFEHLER(FINDEN(ZEILE($A$1:$A$10)-1;A1);""))
2. in die Spalte C kommt dann diese Formel:
=LINKS(A1;B1-1)&" "&TEIL(A1;B1;9999)

beide Formeln dann bis zum Datenende runterziehen.
3. die Formel in Spalte C kopieren und als Wert einfügen (du kannst spalte A überschreiben)
4. die Hilfsspalten in B und C löschen
Gruß Daniel
Anzeige
Mit der heißen Nadel …
19.01.2017 11:00:03
RPP63
Sub RPP()
Dim arr, cnt&, Letter&
arr = Range(Cells(1), Cells(1).End(xlDown))
For cnt = 1 To Ubound(arr)
   For Letter = 1 To 4
      If IsNumeric(Mid(arr(cnt, 1), Letter, 1)) Then
         arr(cnt, 1) = Left(arr(cnt, 1), Letter - 1) & " " & Mid(arr(cnt, 1), Letter, 9 ^ 9)
         Exit For
      End If
   Next
Next
Cells(1).Resize(Ubound(arr), 1) = arr
End Sub
Gruß Ralf
Anzeige
Super. Danke :-)
19.01.2017 11:08:09
bassi2008
Oh danke Daniel, danke Ralf,
das ging ja wirklich schnell.
beides funktioniert gut.
Ich habe mich für die VBA - Variante entschieden. Das ist super schnell und ich kann das prima in meinen bestehenden Ablauf integrieren.
Herzlichsten Dank nochmal.
Viele Grüße
bassi
Du solltest
19.01.2017 11:16:58
RPP63
aber noch eine zusätzliche Prüfung einbauen, falls das Makro auch bei Mehrfachnutzung der gleichen Tabelle (nach Erweiterung?) korrekt funktioniert:
Sub RPP()
Dim arr, cnt&, Letter&
arr = Range(Cells(1), Cells(1).End(xlDown))
For cnt = 1 To Ubound(arr)
   For Letter = 1 To 4
      If Mid(arr(cnt, 1), Letter, 1) = " " Then Exit For
      If IsNumeric(Mid(arr(cnt, 1), Letter, 1)) Then
         arr(cnt, 1) = Left(arr(cnt, 1), Letter - 1) & " " & Mid(arr(cnt, 1), Letter, 9 ^ 9)
         Exit For
      End If
   Next
Next
Cells(1).Resize(Ubound(arr), 1) = arr
End Sub
Gruß Ralf
Anzeige
AW: Du solltest
19.01.2017 11:21:13
bassi2008
ahh... der Code merkt nun wenn eine Leerstelle bereits existiert.
Sehr raffiniert :-)
Besten Dank.
Viele Grüße
bassi
AW: Du solltest
19.01.2017 12:25:27
Anton
Hallo Bassi,
die Aufgabenstellung hat mich auch interessiert, deswegen will ich Dir meine Lösung nicht vorenthalten. Auch wenn diese nicht so elegant ist wie vom Ralf.
Sub LeerZeichenEinfügen()
Dim lngZeile As Long
Dim lngZ As Long
Dim pos1 As Integer
Dim pos2 As Integer
Dim lngZeileMax As Long
Dim strSatz As String
Dim wksBlatt As Worksheet
Set wksBlatt = ThisWorkbook.Worksheets("Tabelle2")
With wksBlatt
lngZeileMax = .Cells(.Rows.Count, 1).End(xlUp).Row
For lngZeile = 1 To lngZeileMax
strSatz = ""
pos1 = InStr(1, .Cells(lngZeile, 1).Value, "-")
For lngZ = 1 To pos1
Select Case Mid(.Cells(lngZeile, 1).Value, lngZ, 1)
Case "A" To "Z"
strSatz = strSatz & Mid(.Cells(lngZeile, 1).Value, lngZ, 1)
Case Else
If IsNumeric(Mid(.Cells(lngZeile, 1).Value, lngZ, 1)) Then
pos2 = InStr(1, .Cells(lngZeile, 1).Value, Mid(.Cells(lngZeile, 1).Value,  _
lngZ, 1))
End If
Exit For
End Select
Next lngZ
strSatz = strSatz & " " & Mid(.Cells(lngZeile, 1).Value, pos2, Len(.Cells( _
lngZeile, 1).Value))
.Cells(lngZeile, 2).Value = strSatz
Next lngZeile
End With
End Sub
VG Anton
Anzeige
Nachschlag...
20.01.2017 00:31:33
bassi2008
Guten Abend Anton,
auch Dir herzlichen Dank.
Deine Version der Lösung funktioniert auch tadellos. Hier wird das Ergebnis nach "B" kopiert. Der Quell bleibt erhalten. Auch nicht schlecht.
Nochmals Danke :-)
Ich habe nun doch noch zwei ähnliche Probleme die aus dem Datenimport einer Webseite herrühren:
Problem 1)
Eines der beiden Probleme bezieht sich auf übernommenen Datums-/zeitangaben.
Diese werden mit jeweils zwei leerzeichen vor und hinter dem eigentlichen Datum ausgegeben.
Damit ist jede Weiterverarbeitung zunichte.
Nun habe ich probiert dies mit:

Dim i As Integer
For i = 1 to 10
Cells(i,1) = Trim(Cells(i,1))
Next
zu lösen... allerdings dauert das bei 10.000 Zellen derart lange - das wäre nicht praktikabel.
Über die Excelhauseigene Variante Suchen/Ersetzen lässt sich ein Teilergebnis um längen schneller erreichen. Ich entferne alle Leerzeichen aus den Zellen. Allerdings ist das übernommene Format als Datum mit Uhrzeit formatiert. Damit ergibt sich nun folgendes Ergbnis:
in Spalte "A": 15.01.1614:01
bzw
in Spalte "C": 18.05.201601:24
Wäre es möglich entweder über einen anderen Code ohne Excel-Suchen/Ersetzen das relativ zügig lösen zu können?
Oder alternativ dazu in dem Ergebnis von Suchen/Ersetzen die Leerzelle an die richtige Stelle zu setzen?
Man könnte die Uhrzeit auch "einfach" abschneiden...
Auf jedenfall sollte eine Formel danach mit dem Datum arbeiten können.
Problem 2)
In Spalte "D" wird Text übernommen, welcher zuvor abwechselnd oder zusammen folgende drei Kürzel enthält:
HV
HH
HM
getrennt wird mit einer Schräge / auf welche der eigentliche Text folgt.
Jetzt kommt das Problem.
Eigentlich sind es zwei :-(
Die Kürzel müssten nach Spalte "E" ohne Leerzeichen übernommen werden.
Die Kürzel kommen auch zusammen vor.
Bsp:
HH/ HM - Hier kommt der Text
HM / Hier kommt der Text
HV/HM/HH/Hier kommt der Text
HH/Hier kommt der Text
HV/HM / HH-Hier kommt der Text
Wie man das lösen könnte, da stehe ich vollkommen auf dem Schlauch.
Vielleicht könnte man den Code so aufbauen, dass die Kürzel, Leerzeichen und die Schrägen erkannt und entfernt werden?
Hat da jemand vielleicht eine Idee?
Ich hab mal zum vielleicht besseren Verständnis eine Mappe mit den Beispielen erstellt...
https://www.herber.de/bbs/user/110732.xlsx
Viele Grüße
bassi
Anzeige
=--GLÄTTEN(WECHSELN(I14;" ";" "))
20.01.2017 07:36:51
Matthias L
Hallo
Auf jedenfall sollte eine Formel danach mit dem Datum arbeiten können.
klappt nicht ganz...
20.01.2017 23:35:19
bassi2008
Schönen guten Abend Matthias,
besten Dank für Deine Lösung.
Leider muss ich doch nochmal nachhaken...
Zu 1.)
Die Lösung mit dem Datum funktioniert teilweise.
Enthält das Datum die vollständige Jahreszahl (15.12.2016 09:00) dann klappt das.
Wird das Datum ohne Jahreszahl angegeben (15.12 09:00) dann liefert DATEDIF als Ergebnis #Zahl!
Ich habe hierzu mal eine Beispielmappe angehängt.
https://www.herber.de/bbs/user/110761.xlsx
zu 2.)
Ich dachte nicht, dass das so gut klappt. Die Formel sortiert tatsächlich alle Varianten sauber heraus.
Wie ich heut festgestellt habe, sind aber nun doch auch Eingaben darunter, die keine Kürzel und keine Sonderzeichen enthalten. Damit funktioniert die Formel so noch nicht. Sie wirft "#Wert!" aus.
Sicherlich ließe sich das noch gestalten - aber dennoch muss ich auf die Formelvariante verzichten.
Da wir ca 10.000 Zellen bearbeiten müssen stirbt die Berechnung unterwegs. Zumal das Blatt mehrfach angesprochen wird. Dafür scheint die Rechenleistung vieeel zu klein.
Somit muss ich doch meine erste Idee mit Vba wieder anregen.
Vielleicht gibt es ja hier doch eine Lösung?
Viele Grüße
bassi
Anzeige
klappt bei mir auch mit schleife schnell ...
21.01.2017 10:21:50
Matthias L
Hallo
Also mit der Schleife hab ich keine Probleme
Läuft schnell und sauber durch.
Option Explicit
Sub bassi()
Dim i&
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
For i = 1 To 10000
Cells(i, 5) = CDate(Trim(Application.WorksheetFunction.Substitute(Cells(i, 4), "  ", " ")))
Next
With Application
.ScreenUpdating = False
.Calculation = xlCalculationAutomatic
End With
End Sub
evtl. solltest Du .Calculation erst einlesen und am Ende auf den Erstzustand zurücksetzen.
Dann noch ne Fehlerbehandlung mit rein und gut ist es.
Gruß Matthias
Anzeige
japp.. so gehts
22.01.2017 15:29:10
bassi2008
Hallo Matthias,
besten Dank für diese Lösung.
So läuft das super. Keine relevante Verzögerung bei den 10.000 Berechnungen mehr.
Jetzt beiß ich mir nur noch an dem Datum die Zähne aus.
Enthält das Datum die vollständige Jahreszahl (15.12.2016 09:00) dann klappt das.
Wird das Datum ohne Jahreszahl angegeben (15.12 09:00) dann liefert DATEDIF als Ergebnis #Zahl!
Mittlerweile hab ich auch herausgefunden warum das so ist, kann es aber nicht beheben :-(
Wird das Datum ohne Jahreszahl angegeben, macht Excel daraus das aktuelle Jahr.
Könnte man das vielleicht so lösen?
Excel macht nun aus dem Datum ohne Jahresangabe das aktuelle Jahr. Damit müsste erkennbar sein, dass das Datum vermeintlich größer ist als das heutige.
Ist das so, müsste automatisch das Vorjahr als Jahreszahl eintragen werden.
Ist das Datum in der Zelle kleiner als das heutige trägt Excel ja von sich aus das richtige Datum ein.
Oder hab ich da einen Denkfehler?
Zwei Fragen zur Formel selbst geistern mir noch durch den Kopf...
Was bewirkt das "--" vor Glätten eigentlich?
Und warum entfert weder Glätten noch Wechseln das Leerzeichen zwischen Datum und Uhrzeit?
Hab das bisherige nochmal als Beispeildatei zusammengestellt.
https://www.herber.de/bbs/user/110796.xlsm
Viele Grüße
bassi
Anzeige
Ohhhh neein... :-(
23.01.2017 10:50:16
bassi2008
Hallo Matthias,
ich könnte heulen...
Ich muss leider alles was ich sagte zurück nehmen...
Heut hab ich das alles in die Originaldatei eingebracht.
Leider klappt das hier nun garnicht mehr so schön.
1.)
Bis die Daten in den Formeln landen werden diese in Rohform zuvor aus einer Webseite importiert. Sie durchlaufen drei Filter und werden dann den entsprechenden Spalten zugeordnet.
Noch bevor dieser Ablauf das Tabellenblatt erreicht, welches die Schleife beeinhaltet frieert der Ablauf ein. "Weißer Bildschirm"... Das dauert dann eine Weile und dann läuft alles wie es soll weiter.
Auf dem Tabellenblatt mit der Schleife selbst ist nichts von "Weißer Bildschirm" zu merken. Hier läuft alles problemlos. Kopieren, Einfügen, Berechnen... alles ohne Probleme, so wie in der Beispieldatei auch.
In der Originaldatei ohne diese Schleife ist dieses Phänomen nicht zu beobachten.
Diese besteht aus 8 Tabellenblättern, alle voll mit Berechnungen und Listen. Keine Pivots, keine Diagramme, keine anderen Schleifen... nichts was meines Erachtens große Rechenleistung fordert.
Wie kann denn das sein? Bzw kann man da was gegen tun?
2.)
Nach der Filterung der 10.000 Daten ist nun aufgefallen, dass verschiedene Texte hinter den Kürzeln auch noch Sonderzeichen beeinhalten.
Dies führt dazu, dass die Einsortierung nun nicht mehr korrekt erfolgt.
Ich denke man könnte das nun sozusagen "tauschen" - Statt die Sonderzeichen zu filtern, könnte man die Kürzel filtern?
Das ergibt dann zwar einen Text mit Sonderzeichen vorn an, aber besser so als komplett falsch.
Hab versucht in meinem Laienhaften Wahn in der Formel die Sonderzeichen gegen die Kürzel zu tauschen... naja... kannst Dir ja denken - hat natürlich nicht geklappt :-(
Könntest du hier vielleicht nochmal einschreiten?
Viele Grüße
bassi
Anzeige
kann man nicht alles abdecken ...
23.01.2017 12:43:11
Matthias L
Hallo
Das sind zuviele Unregelmäßigkeiten, die man nicht alle abfangen kann.
Hier mal eine Variante
ok... dann schau ich mal...
23.01.2017 18:54:28
bassi2008
Guten Abend Matthias,
besten Dank für Deine Hilfe.
Hab die Formel für das Datum getestet. Das sollte so gehen.
Muss ich dann halt jedes Jahr anpassen. Es wäre immer das Vorjahr um das es dann geht.
Danke auch für die Info mit dem "--". Das ist sofort notiert :-)
Das mit den Kürzeln / Sonderzeichen... muss ich mal sehen was ich da anstelle.
Ich werd mal drüber schlafen ob ich meine Datei komplett umkonstruiere und dies irgendwie umgehe ... malsehn...
Wenn ich zu keinem Ergebnis komme werd ich die Frage wohl nochmal ins Forum stellen.
Besten Dank nochmal und einen schönen Restabend noch.
Viele Grüße
bassi
mit Datwert() gehts auch ...
24.01.2017 08:00:34
Matthias L
Hallo
Hier noch eine weitere/einfachere Variante für das Datum.
Muss ich dann halt jedes Jahr anpassen. Es wäre immer das Vorjahr um das es dann geht.
jawoll... danke :-)
24.01.2017 15:46:35
bassi2008
Hallo Matthias,
herzlichen Dank hierfür.
Hab ich wieder was gelernt :-)
Viele Grüße
bassi
ein Vorschlag zum Problem Nr. 2
20.01.2017 08:29:55
Matthias L
Hallo
Tabelle1

193 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige