abuelito
Goto Top

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

Content-Key: 263832

Url: https://administrator.de/contentid/263832

Printed on: April 25, 2024 at 16:04 o'clock

Member: Meierjo
Meierjo Feb 18, 2015 at 18:43:11 (UTC)
Goto Top
Hallo

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.

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
Member: abuelito
abuelito Feb 19, 2015 at 05:00:58 (UTC)
Goto Top
Hallo Meierjo,

vielen Dank für Deine Nachricht.

Folgendes zu Deinen Fragen:

a) Ja, da hast Du recht. Punkt 1 und 2 ist eine Bedingung. Ich habe sie einfach nur gesplittet.

WENN text-a1,23456 text-b1,23456 abc DANN soll text-a in Spalte B Zeile 1 als Überschrift dienen und die abgetrennte Zahl jeweils ab Zeile B2 folgen UND text-b soll in Spalte C Zeile 1 als Überschrift dienen und die abgetrennte Zahl jeweils ab Zeile C2 folgen

b) Es ist eine einzige Tabelle, die jeden Tag erstellt wird und immer wieder mit dem selben Aufbau

c) Die Anzahl der Zeilen sind unterschiedlich, können aber bis zu 10.000 sein

d) Ja, leider benötige ich das Ganze in VBA, dann kann ich es als Makro nutzen

Vielen Dank für Deine Hilfe.

Grüße
Abuelito
Member: Meierjo
Meierjo Feb 19, 2015 at 07:42:34 (UTC)
Goto Top
Hallo

Und wie kommst du zu den Daten, liest du die aus einem Textfile (.txt, .csv) ein?? Wenn ja, dann her damit, das kann man wahrscheinlich eleganter beim importieren lösen.

Gruss Urs
Member: abuelito
abuelito Feb 19, 2015 at 09:45:07 (UTC)
Goto Top
Hallo Meierjo,

nein, die Exceldatei wird jeden Mittag aus einem Programm erstellt und abgelegt Das bedeutet, dass ich keine Daten einlese, sondern nur Zugriff auf diese fertig erstellte Datei habe.

Grüße
Abuelito.
Member: Meierjo
Meierjo Feb 19, 2015 updated at 09:59:50 (UTC)
Goto Top
Hallo

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
Member: abuelito
abuelito Feb 19, 2015 at 10:26:23 (UTC)
Goto Top
Vielen Dank für Deine Nachricht.

Vor dem Komma können auch 3 Stellen stehen, aber nach dem Komma sind es immer 5 Stellen.

Genau und daraus sollen die Zahlen herausgefiltert werden. Und der Text als Spaltenüberschrift dienen ... der wichtige Text ist "text-a, text-b und text" .. der andere Text "abc" wird nicht benötigt und muss nicht ausgelesen werden.

Viele Grüße
Abuelito
Member: Meierjo
Meierjo Feb 19, 2015 at 13:09:27 (UTC)
Goto Top
Hallo

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
e6de961f00d6686a442b7116ef9f1dd9

face-smile bin aus der Schweiz, deshalb habe ich Punkte anstelle von Komma bei den Zahlen eingefügt face-smile

Der Rest folgt, wenn das soweit mal geht face-smile

Gruss Urs
Mitglied: 114757
Solution 114757 Feb 19, 2015, updated at Feb 20, 2015 at 10:35:04 (UTC)
Goto Top
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. face-wink 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
-edit- 19.02 21:33 Uhr - kleine Fehlerkorrektur
Gruß jodel32
Member: abuelito
abuelito Feb 19, 2015 at 15:46:32 (UTC)
Goto Top
Hallo Urs,

vielen lieben Dank für Deine Hilfe. Leider funktioniert Dein Code nicht. Ich habe es kopiert und ausgeführt, aber nach dem Ausführen passiert nichts. Es kommt aber auch keine Fehlermeldung.

ich bin jetzt mal viele Dateien durchgegangen, auch ganz alte. Folgende Daten können vorkommen:

Daten
abc22.01.15 text-a1,23456 text-b1,23456
text-a1,23456 text-b1,23456 abc13.01.14 abc123
text-a1,23456 text-b1,23456 abc11.01.11 abc
abc text1,23456
text1,23456 abc
text-a1,23456 text-b1,23456
text1,23456 abc

Wobei mich nur text-a1,23456, text-b1,23456 und text1,23456 interessiert (text-a, text-b und text sind feste Werte) .. Alles andere benötige ich nicht.

Viele Grüße
Abuelito
Mitglied: 114757
114757 Feb 19, 2015 at 15:50:00 (UTC)
Goto Top
abc22.01.15 text-a1,23456 text-b1,23456
ist ja auch klar, hier hast du ein Format welches du uns nicht genannt hast !
Member: abuelito
abuelito Feb 19, 2015 at 16:02:58 (UTC)
Goto Top
Hallo Jodel32,

vielen lieben Dank für Deine Hilfe.

Dein Code funktioniert soweit ganz gut.

Folgendes Problem habe ich damit aber noch:

Die Dezimalzahlen werden nicht 1zu1 übernommen es sieht dann so aus:

Daten DV-K DV-V DV
text-a1,23456 text-b1,23456 abc123 123.456 123.456
text-a1,23456 text-b1,23456 abc123 123.456 123.456
text1,23456 123.456
text1,23456 abc123 123.456 123
text-a1,23456 text-b1,23456 abc123 123.456 123.456

Was auch nicht sein darf ist, dass die Zahl nach dem abc übernommen wird.

Alles, was mit abc zusammenhängt, darf ignoriert werden, da mich wirklich nur alles was mit text-a, text-b und text zusammenhängt interessiert, wobei text-a, text-b und text feste Werte sind und nur die Dezimalzahl sich verändert.

Viele Grüße
Abuelito
Member: abuelito
abuelito Feb 19, 2015 at 16:04:41 (UTC)
Goto Top
Hallo Jodel32,

da hast Du vollkommen Recht. Es tut mir wirklich leid. Das habe ich nicht gesehen. Das kam jetzt erst, nachdem ich ältere Dateien hinzugenommen habe.
Sorry.

Viele Grüße
Abuelito
Mitglied: 114757
Solution 114757 Feb 19, 2015 updated at 20:28:38 (UTC)
Goto Top
Kein Problem, ist oben alles nach Wunsch angepasst.
Mitglied: 116301
116301 Feb 19, 2015 at 16:51:01 (UTC)
Goto Top
Hallo Jodel!

Naja, hätte man aber auch so machen könnenface-wink
= CDbl(matches(0).submatches(1))

Grüße Dieter
Member: abuelito
abuelito Feb 19, 2015 at 17:45:00 (UTC)
Goto Top
Hallo Jodel,

mensch super, vielen Dank!!! Passt alles einwandfrei!!!

Was bedeutet eigentlich mal submatches(0) und dann mal submatches(2) oder cell.Offset(0, 1) oder (0, 2) usw. ???

Vielen lieben Dank noch mal für Deine ausgezeichnete und vor allem schnelle Hilfe.

Viele Grüße
Abuelito
Mitglied: 114757
114757 Feb 19, 2015 at 19:02:06 (UTC)
Goto Top
Naja, hätte man aber auch so machen können
Yup, gibt immer x Wege nach Kanossa face-smile

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
Member: abuelito
abuelito Feb 19, 2015 at 19:13:27 (UTC)
Goto Top
Ahhhh, vielen Dank für die Info.

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.

Bedeutet:

Ich habe ja jetzt 3 neue Spalten B, C und D .. da stehen jetzt die getrennten Werte drin .. diese müsste ich jetzt noch mit dem Wert in Spalte E vergleichen. Falls die Werte in B, C und D um 2% vom Wert der in Spalte E steht abweicht, wäre es super, wenn die entsprechende Zelle sich ROT verfärbt.

B C D E
1,23456 1,23456 1,2567
1,23456 1,2875
usw.

Vielen lieben Dank

Viele Grüße
Abuelito
Mitglied: 114757
114757 Feb 19, 2015 at 19:47:21 (UTC)
Goto Top
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.
Member: abuelito
abuelito Feb 19, 2015 at 20:27:22 (UTC)
Goto Top
Du bist der absolute Hammer. Vielen Dank. Genau das war es!!!!

Mensch Danke Dir für Deine super Hilfe.

Viele Grüße
Abuelito
Member: abuelito
abuelito Feb 20, 2015 at 09:59:18 (UTC)
Goto Top
Hallo Jodel32,

sorry, passt leider doch noch nicht. Die Berechnung stimmt irgendwie nicht.

Es sollte so sein:

In der Spalte E ab Zeile 2 steht eine Referenzzahl x,xxxxx ... Jetzt muss ich ich Zahlen aus den Spalten B, C und D jeweils mit abgleichen.

Beispiel: Weicht die Zahl in B2 um 2% nach oben oder nach unten von der Referenzzahl ab, dann soll die Zelle ROT eingefärbt werden.

Könntest Du mir vielleicht noch mal helfen?

Vielen Dank und viele Grüße
Abuelito
Mitglied: 114757
114757 Feb 20, 2015 updated at 10:01:58 (UTC)
Goto Top
Zitat von @abuelito:
sorry, passt leider doch noch nicht. Die Berechnung stimmt irgendwie nicht.
hatte ich gestern Abend noch korrigiert, siehe edit im Code-Post face-wink sorry
Member: abuelito
abuelito Feb 20, 2015 at 10:13:11 (UTC)
Goto Top
Aber der rechnet nicht richtig, denn ich bekomme vieles ROT markiert, was keine 2% Abweichung ist

Könntest Du bitte nochmal nachschauen? Ich bräuchte es leider so:

Beispiel: Weicht die Zahl in B2 um 2% nach oben oder nach unten von der Referenzzahl ab, dann soll die Zelle ROT eingefärbt werden.

Ich danke Dir vielmals

Grüße
Abuelito
Mitglied: 114757
114757 Feb 20, 2015 at 10:36:46 (UTC)
Goto Top
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.
Member: abuelito
abuelito Feb 20, 2015 at 10:50:22 (UTC)
Goto Top
Bei mir steht nach dem Else Wert1 .. müsste da nicht Wert3 kommen? ... und >= .. ist das OK?

Vielen Dank für Deine Hilfe
Mitglied: 114757
114757 Feb 20, 2015 updated at 11:27:10 (UTC)
Goto Top
Zitat von @abuelito:

Bei mir steht nach dem Else Wert1 .. müsste da nicht Wert3 kommen?
nein das ist OK ich verwende die Variable einfach nur erneut weil sie ja durch den else Teil keine Verwendung findet
... 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:

38f56713c9fa7d7595751ad544bae8ad

p.s. ich hoffe du hast due Markierungen vor dem Testen gelöscht face-wink
Member: abuelito
abuelito Feb 20, 2015 at 11:32:50 (UTC)
Goto Top
Du hattest vollkommen recht ... habe den Code erneut kopiert und schon gehts.

Sorry und vielen Dank

Grüße
Member: abuelito
abuelito Feb 23, 2015 updated at 15:36:22 (UTC)
Goto Top
Hallo Jodel32,

oh man, schäme mich so face-smile

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.

Viele Grüße
Abuelito
Mitglied: 114757
114757 Feb 23, 2015 updated at 18:01:36 (UTC)
Goto Top
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 face-wink
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