Excel VBA Zahl von Text trennen
Hallo an Alle,
ich habe folgendes Problem:
In der Spalte A habe ich in den Zellen folgende Werte stehen:
text-a1,23456 text-b1,23456 abc .. aber auch anders herum .. abc text-a1,23456 text-b1,23456
oder
text1,23456 abc
Jetzt hätte ich gerne, dass 3 neue Spalten B, C und D hinzugefügt werden:
1.) WENN text-a1,23456 text-b1,23456 abc DANN sollen die Buchstaben text-a von der Zahl getrennt werden und als Überschrift in B1 erscheinen und die Zahl 1,23456, die getrennt wurde, soll in die Spalte B ab Zeile B2 eingetragen werden. Bedeutet ich benötige den Text nur 1x und zwar als Überschrift und unter der Überschrift ab Zeile B2 folgen die entsprechenden Werte (Zahlen). Den restlichen Text abc benötige ich nicht.
2.) WENN text-a1,23456 text-b1,23456 abc DANN sollen die Buchstaben text-b von der Zahl getrennt werden und als Überschrift in C1 erscheinen und die Zahl 1,23456, die getrennt wurde, soll in die Spalte C ab Zeile C2 eingetragen werden. Bedeutet ich benötige den Text nur 1x und zwar als Überschrift und unter der Überschrift ab Zeile C2 folgen die entsprechenden Werte (Zahlen). Den restlichen Text abc benötige ich nicht.
3.) WENN text1,23456 abc DANN sollen die Buchstaben text von der Zahl getrennt werden und als Überschrift in D1 erscheinen und die Zahl 1,23456, die getrennt wurde, soll in die Spalte D ab Zeile D2 eingetragen werden. Bedeutet ich benötige den Text nur 1x und zwar als Überschrift und unter der Überschrift ab Zeile D2 folgen die entsprechenden Werte (Zahlen). Den restlichen Text abc benötige ich nicht.
4.) In Spalte E ab Zeile E2 habe ich Zahlen stehen. Diese würde ich gerne mit den Zahlen aus den neuen Spalten B,C und D vergleichen. Wenn die Zahlen aus B, C und D eine Abweichung von 2 % zum Wert in Spalte E haben, dann sollen die entsprechenden Zellen aus den Spalten, B, C und D die Farbe ROT erhalten.
Vielen Dank für eure Hilfe.
Viele Grüße
Abuelito
ich habe folgendes Problem:
In der Spalte A habe ich in den Zellen folgende Werte stehen:
text-a1,23456 text-b1,23456 abc .. aber auch anders herum .. abc text-a1,23456 text-b1,23456
oder
text1,23456 abc
Jetzt hätte ich gerne, dass 3 neue Spalten B, C und D hinzugefügt werden:
1.) WENN text-a1,23456 text-b1,23456 abc DANN sollen die Buchstaben text-a von der Zahl getrennt werden und als Überschrift in B1 erscheinen und die Zahl 1,23456, die getrennt wurde, soll in die Spalte B ab Zeile B2 eingetragen werden. Bedeutet ich benötige den Text nur 1x und zwar als Überschrift und unter der Überschrift ab Zeile B2 folgen die entsprechenden Werte (Zahlen). Den restlichen Text abc benötige ich nicht.
2.) WENN text-a1,23456 text-b1,23456 abc DANN sollen die Buchstaben text-b von der Zahl getrennt werden und als Überschrift in C1 erscheinen und die Zahl 1,23456, die getrennt wurde, soll in die Spalte C ab Zeile C2 eingetragen werden. Bedeutet ich benötige den Text nur 1x und zwar als Überschrift und unter der Überschrift ab Zeile C2 folgen die entsprechenden Werte (Zahlen). Den restlichen Text abc benötige ich nicht.
3.) WENN text1,23456 abc DANN sollen die Buchstaben text von der Zahl getrennt werden und als Überschrift in D1 erscheinen und die Zahl 1,23456, die getrennt wurde, soll in die Spalte D ab Zeile D2 eingetragen werden. Bedeutet ich benötige den Text nur 1x und zwar als Überschrift und unter der Überschrift ab Zeile D2 folgen die entsprechenden Werte (Zahlen). Den restlichen Text abc benötige ich nicht.
4.) In Spalte E ab Zeile E2 habe ich Zahlen stehen. Diese würde ich gerne mit den Zahlen aus den neuen Spalten B,C und D vergleichen. Wenn die Zahlen aus B, C und D eine Abweichung von 2 % zum Wert in Spalte E haben, dann sollen die entsprechenden Zellen aus den Spalten, B, C und D die Farbe ROT erhalten.
Vielen Dank für eure Hilfe.
Viele Grüße
Abuelito
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 263832
Url: https://administrator.de/contentid/263832
Ausgedruckt am: 15.11.2024 um 23:11 Uhr
28 Kommentare
Neuester Kommentar
Hallo
Ist das eine einzige Tabelle, oder mehrere Tabellen mit demselben Aufbau?
Wieviele Zeilen sind davon betroffen?
Mir geht es bei der Frage darum, ob das unbedingt mit VBA gelöst werden muss. Den Text in mehrere Spalten aufteilen kann man auch mit der Funktion "Text in Spalten..."
Am Besten stellst du hier mal eine Beispielmappe ein, dann wird's uns vielleicht klarer, was du erreichen willst.
Gruss Urs
1.) WENN text-a1,23456 text-b1,23456 abc
2.) WENN text-a1,23456 text-b1,23456 abc
Sind doch die gleichen Bedingungen, wie soll Excel oder sonst ein Programm hier einen Unterschied erkennen?4.) In Spalte E ab Zeile E2 habe ich Zahlen stehen. Diese würde ich gerne mit den Zahlen aus den neuen Spalten B,C und D
vergleichen. Wenn die Zahlen aus B, C und D eine Abweichung von 2 % zum Wert in Spalte E haben, dann sollen die entsprechenden
Zellen aus den Spalten, B, C und D die Farbe ROT erhalten.
Kann man mit bedingter Formatierung lösen.vergleichen. Wenn die Zahlen aus B, C und D eine Abweichung von 2 % zum Wert in Spalte E haben, dann sollen die entsprechenden
Zellen aus den Spalten, B, C und D die Farbe ROT erhalten.
Ist das eine einzige Tabelle, oder mehrere Tabellen mit demselben Aufbau?
Wieviele Zeilen sind davon betroffen?
Mir geht es bei der Frage darum, ob das unbedingt mit VBA gelöst werden muss. Den Text in mehrere Spalten aufteilen kann man auch mit der Funktion "Text in Spalten..."
Am Besten stellst du hier mal eine Beispielmappe ein, dann wird's uns vielleicht klarer, was du erreichen willst.
Gruss Urs
Hallo
Ok, und du hast auf der linken Seite immer eine dieser Kombinationen
text-a
text-b
text
abc text-a
abc text-b
abc text
Und die länge der Zahl ist immer 1 Stelle vor dem Komma und 5 Stellen hinter dem Komma?
Und daraus sollen dann die Zahlen "herausgefiltert" werden, oder??
Gruss Urs
text-a1,23456 text-b1,23456 abc .. aber auch anders herum .. abc text-a1,23456 text-b1,23456
Ok, und du hast auf der linken Seite immer eine dieser Kombinationen
text-a
text-b
text
abc text-a
abc text-b
abc text
Und die länge der Zahl ist immer 1 Stelle vor dem Komma und 5 Stellen hinter dem Komma?
Und daraus sollen dann die Zahlen "herausgefiltert" werden, oder??
Gruss Urs
Hallo
Probier mal folgenden Code
Er sollte eigentlich die Werte nach B C D splitten, wie in dieser Abbildung
bin aus der Schweiz, deshalb habe ich Punkte anstelle von Komma bei den Zahlen eingefügt
Der Rest folgt, wenn das soweit mal geht
Gruss Urs
Probier mal folgenden Code
Sub Splitten()
Dim TempWert As Variant
With Sheets(1)
For Each cell In .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
'splitten, wenn Leerzeichen vorhanden
arrdata = Split(cell.Value, " ", -1, vbTextCompare)
If UBound(arrdata) = -1 Then
MsgBox "diese Zelle ist leer", vbOKOnly
End If
'wenn kein abc am Anfang
If UBound(arrdata) = 0 Then
'MsgBox "diese Zelle " & cell.Value & " hat kein abc drin", vbOKOnly
Debug.Print arrdata(0)
TempWert = arrdata(0)
End If
'wenn abc am Anfang, zuerst abc aus dem String enfernen
If UBound(arrdata) = 1 Then
'MsgBox "diese Zelle " & cell.Value & " hat abc drin", vbOKOnly
Debug.Print arrdata(0), arrdata(1)
TempWert = arrdata(1)
End If
'mit dem String ohne ABC weitermachen
Select Case Left(TempWert, 6)
Case "text-a"
.Range(cell.Offset(0, 1), cell.Offset(0, 1)).Value = Right(TempWert, Len(TempWert) - 6)
Case "text-b"
.Range(cell.Offset(0, 2), cell.Offset(0, 2)).Value = Right(TempWert, Len(TempWert) - 6)
Case Else
Select Case Left(TempWert, 4)
Case "text"
.Range(cell.Offset(0, 3), cell.Offset(0, 3)).Value = Right(TempWert, Len(TempWert) - 4)
End Select
End Select
Next
TempWert = ""
End With
'MsgBox Var(UBound(Var))
End Sub
Er sollte eigentlich die Werte nach B C D splitten, wie in dieser Abbildung
bin aus der Schweiz, deshalb habe ich Punkte anstelle von Komma bei den Zahlen eingefügt
Der Rest folgt, wenn das soweit mal geht
Gruss Urs
Moin zusammen,
folgender Code macht das auch alles vollautomatisch, via Regular Expressions, damit ist es auch egal wie lange der Text oder die Zahl vorher etc. ist:
-edit- 19.02 21:33 Uhr - kleine Fehlerkorrektur
Gruß jodel32
folgender Code macht das auch alles vollautomatisch, via Regular Expressions, damit ist es auch egal wie lange der Text oder die Zahl vorher etc. ist:
Sub ExtractData()
Dim ws As Worksheet, cell As Range, matches As Object, wert1, wert2, ref
Set ws = ActiveSheet
Set regex = CreateObject("vbscript.regexp")
regex.IgnoreCase = True
regex.Pattern = "(text-a)([\d,]+) (text-b)([\d,]+)|(text)([\d,]+)"
With ws
For Each cell In .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
Set matches = regex.Execute(cell.Value)
If matches.Count > 0 Then
ref = cell.Offset(0, 4).Value
If matches(0).submatches(0) <> "" Then
If .Range("B1").Value = "" Then
.Range("B1").Value = matches(0).submatches(0)
End If
If .Range("C1").Value = "" Then
.Range("C1").Value = matches(0).submatches(2)
End If
wert1 = CDbl(matches(0).submatches(1))
wert2 = CDbl(matches(0).submatches(3))
cell.Offset(0, 1).Value = wert1
cell.Offset(0, 2).Value = wert2
If Abs(ref - wert1) >= Abs(ref * 0.02) Then
cell.Offset(0, 1).Interior.Color = vbRed
End If
If Abs(ref - wert2) >= Abs(ref * 0.02) Then
cell.Offset(0, 2).Interior.Color = vbRed
End If
Else
If .Range("D1").Value = "" Then
.Range("D1").Value = matches(0).submatches(4)
End If
wert1 = CDbl(matches(0).submatches(5))
cell.Offset(0, 3).Value = wert1
If Abs(ref - wert1) >= Abs(ref * 0.02) Then
cell.Offset(0, 3).Interior.Color = vbRed
End If
End If
End If
Next
End With
Set regex = Nothing
End Sub
Gruß jodel32
abc22.01.15 text-a1,23456 text-b1,23456
ist ja auch klar, hier hast du ein Format welches du uns nicht genannt hast !
Kein Problem, ist oben alles nach Wunsch angepasst.
Hallo Jodel!
Naja, hätte man aber auch so machen können
Grüße Dieter
Naja, hätte man aber auch so machen können
= CDbl(matches(0).submatches(1))
Grüße Dieter
Naja, hätte man aber auch so machen können
Yup, gibt immer x Wege nach Kanossa Was bedeutet eigentlich mal submatches(0) und dann mal submatches(2)
Das sind die geklammerten Regex-Teile im Pattern. Das erste Klammernpaar ist submatch(0) das zweite submatch(1) usw. oder cell.Offset(0, 1) oder (0, 2) usw. ???
Damit wird die aktuelle Zelle 1 bzw. n-mal nach rechts verschoben um eine Zelle neben an anzusprechen.Gruß jodel32
Jetzt fehlt mir nur noch die Zelle ROT zu markieren, falls ein Wert um 2% vom Wert, der in der Spalte E ab Zeile 2 steht abweicht.
Done.
hatte ich gestern Abend noch korrigiert, siehe edit im Code-Post sorry
Könntest Du bitte nochmal nachschauen?
Also hier tut es das was es soll sowohl mit Abweichungen nach unten also auch nach oben , kopiere den Code nochmal da ist wahrscheinlich was schief gelaufen oder der Browser-Cache hat dir einen Streich gespielt.
nein das ist OK ich verwende die Variable einfach nur erneut weil sie ja durch den else Teil keine Verwendung findet
Kopiere den Code nochmal, du hast 100% Prozent da einen Fehler beim kopieren, gabs hier schon mal das Problem mit dem Cache.
Hier als Beweis ein Screenshot:
p.s. ich hoffe du hast due Markierungen vor dem Testen gelöscht
... und >= .. ist das OK?
wenn es Größer oder Gleich 2% sein sollen ja ! Wenn du nur größer als 2% willst nimmst du das Gleichheitszeichen weg. Bitte beachte das durch ABS() die absoluten Zahlenwerte Verwendung finden, es also kein Minus gibt, daher ist der Vergleich >= hier richtig.Kopiere den Code nochmal, du hast 100% Prozent da einen Fehler beim kopieren, gabs hier schon mal das Problem mit dem Cache.
Hier als Beweis ein Screenshot:
p.s. ich hoffe du hast due Markierungen vor dem Testen gelöscht
Zitat von @abuelito:
Wenn ich nach dem text-a eine 5 stellige Zahl mit 6 Nachkommastellen habe, z.B.
text-a12456,789012 oder text-b12456,789012 oder text12456,789012
habe noch mehr ältere Dateien gefunden mit größeren Zahlen.
Leider trennt das Makro die großen Zahlen nicht korrekt ab, wenn mehr Stellen vorhanden sind.
doch das tut es hier einwandfrei, dafür habe ich ja ein Regex verwendet Wenn ich nach dem text-a eine 5 stellige Zahl mit 6 Nachkommastellen habe, z.B.
text-a12456,789012 oder text-b12456,789012 oder text12456,789012
habe noch mehr ältere Dateien gefunden mit größeren Zahlen.
Leider trennt das Makro die großen Zahlen nicht korrekt ab, wenn mehr Stellen vorhanden sind.
regex.Pattern = "(text-a)([\d,]+) (text-b)([\d,]+)|(text)([\d,]+)"
Das [\d,]+ besagt das mindestens eine Zahl oder Komma vorkommen müssen, nach oben hin offen, d.h. die Zahl kann so groß sein wie sie will (bzw. so groß wie ein Double Wert sein kann)!Leider trennt das Makro die großen Zahlen nicht korrekt ab
Was heißt das bei dir ? Kommen bei den Werten hinter der Zahl ein Leerzeichen, bzw stehen diese alleine da, also nicht in Kombination mit text-a und text-b sondern z.B. nur text-a ?Du solltest dir mal das Regular Expressions Tutorial durchlesen damit du hier nicht jeden Furz nachfragen musst.
Gruß jodel32