04.02.2018, 20:43
Hallo JoGi,
wenn man in Texten "wühlen" möchte, kann man sich leicht in Ausnahmen verlieren und mit einen umfangreichen, schwer zu wartenden Code enden. In der Liste aller Code habe ich die Hex-Zahlen erkannt (00-FF) und RegEx genutzt. Damit steckt das know-how in nur einer Zeile, dem Pattern. Der Rest ist Standard und war dementsprecht zügig zu programmieren.
Ein Fehler könnte bei Texten wie "1254Abteilung" auftreten, da der Text vor dem Hex-Code nicht geprüft wird. Falls das ein Problem sein sollte, kann man ein "\b" (Wortanfang) voranstellen. Der Aufwand wäre ähnlich einer Neuprogrammierung.
Der Wunsch, keine doppelten Codes pro Zeile zu zeigen, war ähnlich aufwändig wie der Rest.
Bis zu mehreren 10.000 Zeilen sollte der Code nicht länger als wenige Sekunden benötigen, falls es ca 1 Mio Zeilen wäre, kann man das Zurückschreiben in die Tabelle noch beschleunigen.
mfg
wenn man in Texten "wühlen" möchte, kann man sich leicht in Ausnahmen verlieren und mit einen umfangreichen, schwer zu wartenden Code enden. In der Liste aller Code habe ich die Hex-Zahlen erkannt (00-FF) und RegEx genutzt. Damit steckt das know-how in nur einer Zeile, dem Pattern. Der Rest ist Standard und war dementsprecht zügig zu programmieren.
Ein Fehler könnte bei Texten wie "1254Abteilung" auftreten, da der Text vor dem Hex-Code nicht geprüft wird. Falls das ein Problem sein sollte, kann man ein "\b" (Wortanfang) voranstellen. Der Aufwand wäre ähnlich einer Neuprogrammierung.
Code:
Sub iPhi()
'Starten im Menü: Ansicht -> Makro -> iPhi
'Annahmen: Fehlercodes sind HEX-Codes und es folgt keine Zahl
'Texte mit den Codes ab Zeile 7 in Spalte C, D und E, beliebig viele Zeilen
'falsches Erkennen bei "BAB", "ABS", "FER"
Dim RegEx As Object: Set RegEx = CreateObject("vbscript.regexp")
Dim Ar() As String, Res() As String
With RegEx
.Pattern = "[0-9A-F]{2}\D"
.Global = True
.ignorecase = False
End With
With ActiveSheet
lr = .Cells(Rows.Count, 3).End(xlUp).Row
Arr = Range("C7:E" & lr)
ReDim Ar(UBound(Arr))
For i = 1 To UBound(Ar)
Ar(i - 1) = " " & Arr(i, 1) & " " & Arr(i, 2) & " " & Arr(i, 3) & " "
If RegEx.test(Ar(i - 1)) Then
Set RR = RegEx.Execute(Ar(i - 1))
ReDim Res(RR.Count - 1)
For r = 0 To RR.Count - 1
'jeder Code nur einmal
If InStr(1, Join(Res, ", "), Left(RR(r), 2)) = 0 Then Res(r) = Left(RR(r), 2)
Next r
With Cells(i + 6, "F")
.Value = Trim(Replace(Join(Res, ", "), ", ,", ",", , True))
Do While Right(.Value, 1) = ","
.Value = Trim(Left(.Value, Len(.Value) - 1))
Loop
End With
End If
Next i
End With
End Sub
Der Wunsch, keine doppelten Codes pro Zeile zu zeigen, war ähnlich aufwändig wie der Rest.
Bis zu mehreren 10.000 Zeilen sollte der Code nicht länger als wenige Sekunden benötigen, falls es ca 1 Mio Zeilen wäre, kann man das Zurückschreiben in die Tabelle noch beschleunigen.
mfg