Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1576to1580
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
Ausdrücke in Spalten aufteilen.
27.08.2017 11:02:16
Jens
Hallo,
wie würde gerne Ausdrücke in Spalten autteilen.
Die Ausdrücke sehen so aus und stehen ab Zelle B12. (Ende nach unten offen)
O1.300Z100.a1
O1.400A1.1
Es sollen dabei die Buchstabenblöcke und Ziffernblöcke in je einzele Spalten zerlegt werden. Der Punkt agiert dabei wieder als Vorgabe zu einer neuen Spalte
Spalte B: O
Spalte C: 1
Spalte D: 300
Spalte E: Z
Spalte F: 100
Spalte G: a
Spalte I: 1
Bzw.
Spalte B: O
Spalte C: 1
Spalte D: 400
Spalte E: A
Spalte F: 1
Spalte G:
Spalte I: 1
Nach dem zweiten Punkt muss es so sein, dass die Buchstaben in Spalte G und die Ziffern in Spalte I geschrieben werden.
Kann mir hierzu wer weiterhelfen?

28
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: bzgl. Deiner bisherigen Angaben ...
27.08.2017 12:03:04
...
Hallo Jens,
... z.B. mit folgende Formel in B12:
=WENN(A12="";"";WECHSELN(WENN(SPALTE()3) *3;(SPALTE(A12)=3)*3+(SPALTE(A12)=5)*(FINDEN(".";TEIL($A12;8;6))-2)+1); LINKS(RECHTS($A12;9-SPALTE());1));".";"")) und diese nach unten und rechts kopieren.
Gruß Werner
.. , - ...
AW: bzgl. Deiner bisherigen Angaben ...
27.08.2017 12:05:45
JEns
Ist das als VBA auch umsetzbar?
AW: natürlich, aber da halte ich mich heraus owT
27.08.2017 12:10:40
...
Gruß Werner
.. , - ...
Deine Fml scheint nicht ganz das zu ergeben, ...
28.08.2017 04:38:57
Luc:-?
…Werner,
was Jens haben wollte. Sehe ich das richtig?
Morrn, Luc :-?
AW: ich hatte ein $-Zeichen "verschluckt" ;-) ...
28.08.2017 08:26:19
...
Hallo Luc,
... insofern ergab mein Formelvorschlag nicht das gewünschte.
Anstelle =WENN(A12="";"";...) sollte es =WENN($A12="";"";...) lauten.
Gruß Werner
.. , - ...
Anzeige
Das hatte beim Test nicht gestört, ...
28.08.2017 15:52:47
Luc:-?
…Werner;
gemeint hatte ich eher die fehlende LeerSpalte. Habe mir deshalb erlaubt, in die folgd Darstellung Deine Fml entsprd ergänzt, aber zwecks fairen Vgls ohne die primäre LeerZellenAbfrage, aufzunehmen:
 ABCDEFGHIJKLMN
12
O1.300Z100.a1O1300Z100a 1209 ZeichenFINDEN, LINKS, RECHTS, SPALTE[8], TEIL[2], WECHSELN, WENN[2]O1.400A1.1O1400A1  1 7[16] Funktionen[einsätze]O1.300Z100.a2O1300Z100a 2187 ZeichenCountOn, MaskOn[3], VJoin, VSplit[3], WECHSELN[3], WIEDERHOLENO1.400A1.2O1400A1  2 6[12] Funktionen[einsätze]davon 4[8] UDF[-Einsätze]O1.300Z100.b2O1300Z100b 2223 ZeichenLÄNGE[2], MaskOn[4], VJoin, VSplit[3], WECHSELN[4], WIEDERHOLENO1.400B1.2O1400B1  2 6[15] Funktionen[einsätze]davon 3[8] UDF[-Einsätze]O1.300Z100.a3O1300Z100a 3254 ZeichenMaskOn[4], PickOn[7], VJoin, VSplit[2], WECHSELN[2]O1.400A1.3O1400A1  3 5[16] Funktionen[einsätze]davon 4[14] UDF[-Einsätze]B12[:I12;B13:I13]:=WENN(SPALTE(B12)=8;"";WECHSELN(WENN(SPALTE()<7;TEIL($A12;SPALTE(A12)+(SPALTE(A12)>3)*3;(SPALTE(A12)=3)*3+(SPALTE(A12)=5)*(FINDEN(".";TEIL($A12;8;6))-2)+1);LINKS(RECHTS($A12;9-SPALTE()+(SPALTE()>8));1));".";""))B14:I14[;B15:I15]: {=VSplit(WECHSELN(WECHSELN(VJoin(VSplit(WECHSELN(MaskOn(A14;"alf");" ";" ";1)&WIEDERHOLEN(" ";2-CountOn(MaskOn(A14;"alf");" ")))&" "&VSplit(MaskOn(A14;"num")));" ";" ";1);" ";" ";6);;1)}B16:I16[;B17:I17]: {=VSplit(WECHSELN(WECHSELN(VJoin(VSplit(WECHSELN(MaskOn(A16;"alf");" ";" ";1)&WIEDERHOLEN(" ";2-LÄNGE(MaskOn(A16;"alf"))+LÄNGE(WECHSELN(MaskOn(A16;"alf");" ";""))))&" "&VSplit(MaskOn(A16;"num")));" ";" ";1);" ";" ";6);;1)}B18:I18[;B19:I19]: {=VSplit(VJoin(VSplit(PickOn(A18;1;".");"");" ")&" "&WECHSELN(PickOn(A18;2;".");MaskOn(PickOn(A18;2;".");"gb");" "&MaskOn(PickOn(A18;2;".");"gb")&" ")&" "&WECHSELN(PickOn(A18;3;".");MaskOn(PickOn(A18;3;".");"num");" "&MaskOn(PickOn(A18;3;".");"num"));;1)}
13
14
15
16
17
18
19
20
21
22
23
Während Deine Fml in B12:I13 natürlich eine zellenweise NormalFml ist, handelt es sich bei den 3 Fmln von mir um plurale Matrix­Fmln. Da immer auf die gleiche SpaltenAnzahl aufgeteilt wird, dürfte das ggf schneller und rationeller sein (auch etwas beim Anle­gen). Durch Aufkopieren der Ergebnisse können die Werte ja auch vereinzelt wdn, wobei anschld auch gleich noch Spalte H gelöscht wdn kann, falls dort später anderes eingetragen wdn soll (nur vorher darf dort nichts stehen!).
Die Fmln in Zeile 16/17 entsprechen denen in 14/15, nur wurde hier CountOn durch das „klassische“ Fml­Kon­strukt ersetzt. Die Fmln in 18/19 zeigen dagg einen anderen Ansatz, der wohl leichter durchschaubar und ggf sicherer ist.
Allerdings müsste Deine Fml doch (deutlich) länger ausfallen, falls numerische Werte zu echten Zahlen wdn sollen… ;-)
UDF-Links:
CountOn: https://www.herber.de/forum/archiv/732to736/732035_Zaehlennwenn_mit_Zahlenkombinationen.html#734566
MaskOn: https://www.herber.de/cgi-bin/callthread.pl?index=1344962#1345181
PickOn: https://www.herber.de/forum/archiv/1140to1144/1141994_Teilstring_aus_String_entfernen.html#1142025 (Folgebeiträge m.Korrekturen beachten!)
VJoin & VSplit: https://www.herber.de/bbs/user/99024.xlsm (BspDatei)
Gruß, Luc :-?
Anzeige
AW: mich hätte es beim Test schon gestört ...
28.08.2017 20:14:54
...
Hallo Luc,
... aber ich hatte selbst heute Morgen noch übersehen :-(, dass die Spalte H gänzlich frei bleiben soll.
Nun meine Formel wäre dann noch etwas länger geworden als in Deiner Ergänzung vorgesehen.
Dafür hätte diese jeweils eine Funktion /-einsatz weniger gebraucht ;-) Aber gesucht war ja dann offensichtlich eh eine reine VBA-Lösung.
 B
12O

Formeln der Tabelle
ZelleFormel
B12=WECHSELN(WAHL(1+($A12>0)*((SPALTE()<7)+(SPALTE()=7)*2+(SPALTE()=9)*3); "";TEIL($A12;SPALTE()-1+(SPALTE()-1>3)*3;(SPALTE()-1=3)*3+(SPALTE()-1=5)*(FINDEN(".";TEIL($A12;8;6))-2)+1); LINKS(RECHTS($A12;2); 1); RECHTS($A12;1)); ".";"")


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Gruß Werner
.. , - ...
Anzeige
Ein FktsEinsatz mehr oder weniger macht ja ...
29.08.2017 03:45:51
Luc:-?
…auch keinen entscheidenden Unterschied, Werner,
falls es nicht gerade um Massen-DV geht.
Tja, und was die VBA-Lösung betrifft, die hat er ja nun schon, was uns nicht daran hindern soll/kann, auch an einer FmlLösung für dieses kompliziertere Problem zu werken. Das könnte ggf für andere noch mal interessant wdn, obwohl (bzw gerade weil) die Aufgabe doch recht speziell ist. Aber nun sind wir wohl durch.
Übrigens musste ich auch ziemlich zirkeln, denn ältere UDFs von mir sind oft nicht aktiv mxfml-fähig, d.h., können keine ZellBereiche und Datenfelder verarbeiten, nur EinzelZellen und skalare Werte (wie hier bspw MaskOn). Das kann auch Datenfelder aus nur einem Wert betreffen, wie sie ZEILE bzw SPALTE einer EinzelZelle liefern. Sonst wären die Fmln wohl kürzer ausgefallen. Das würde ich wohl auch nur in Ausnahme­fällen noch in neue Versionen dieser UDFs einbauen, da mir ja inzwischen Interessanteres vor­schwebt, wie dieses FAN (Du erinnerst Dich!) und anderes, für das ich ebenfalls zu wenig Zeit habe…
Morrn, Luc :-?
PS: Habe zu Deiner AW im bewussten Thread (K-Donner) noch eine kleine OT(PS)-Replik geschrieben… ;-)
Anzeige
...Und außerdem scheint's ein 'Fass ohne Boden' …
30.08.2017 15:19:33
Luc:-?
…wdn zu wollen, Werner (s. unten!)… ;-]
Luc :-?
AW: bzgl. Deiner bisherigen Angaben ...
27.08.2017 12:39:40
JEns
sry. die Ausdrücke stehen natürlich in Spalte A ab Zeile 12
AW: bzgl. Deiner bisherigen Angaben ...
27.08.2017 12:50:22
Sepp
Hallo Jens,
wen deine Angaben stimmen, dann z.B. so.
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub spiltText()
Dim varInPut As Variant, varOutput() As Variant, varTmp As Variant
Dim lngI As Long, lngN As Long

With Sheets("Tabelle4") 'Tabellenname - Anpassen!
  varInPut = .Range("A12:B" & Application.Max(12, .Cells(.Rows.Count, 2).End(xlUp).Row))
  Redim varOutput(1 To UBound(varInPut, 1), 1 To 7)
  For lngI = 1 To UBound(varInPut, 1)
    varTmp = Split(varInPut(lngI, 1), ".")
    varOutput(lngI, 1) = Left(varTmp(0), 1)
    varOutput(lngI, 2) = Right(varTmp(0), 1)
    varOutput(lngI, 3) = Left(varTmp(1), 3)
    varOutput(lngI, 4) = Mid(varTmp(1), 4, 1)
    varOutput(lngI, 5) = Mid(varTmp(1), 5)
    If Len(varTmp(2)) = 2 Then
      varOutput(lngI, 6) = Left(varTmp(2), 1)
      varOutput(lngI, 7) = Right(varTmp(2), 1)
    ElseIf Len(varTmp(2)) = 1 Then
      If IsNumeric(varTmp(2)) Then
        varOutput(lngI, 7) = varTmp(2)
      Else
        varOutput(lngI, 6) = varTmp(2)
      End If
    End If
  Next
  .Range("A12").Resize(UBound(varOutput, 1), 7) = varOutput
End With
End Sub

Gruß Sepp

Anzeige
AW: bzgl. Deiner bisherigen Angaben ...
27.08.2017 12:54:01
JEns
Hallo
besten Dank. aber die Daten stehen nur in Spalte a ab Zeile 12. Hatte einen Fehler in den Angaben drinnen.
Sry was muss ich dann wie anpassen?
AW: bzgl. Deiner bisherigen Angaben ...
27.08.2017 12:58:57
JEns
vorallen können die Zahlen bzw. Buchstabenblöcke unterschiedliche Längen haben. Deshalb auch meine Aussage Blöcke. Können manchmal aus einem Wert, Zwei , fünf , oder weniger oder mehr Werten besten.
Kann man das dann noch lösen?
AW: bzgl. Deiner bisherigen Angaben ...
27.08.2017 13:01:28
Sepp
Hallo Jens,
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub spiltText()
Dim varInPut As Variant, varOutput() As Variant, varTmp As Variant
Dim lngI As Long, lngN As Long

With Sheets("Tabelle4") 'Tabellenname - Anpassen!
  varInPut = .Range("A12:A" & Application.Max(12, .Cells(.Rows.Count, 2).End(xlUp).Row))
  Redim varOutput(1 To UBound(varInPut, 1), 1 To 7)
  For lngI = 1 To UBound(varInPut, 1)
    varTmp = Split(varInPut(lngI, 1), ".")
    varOutput(lngI, 1) = Left(varTmp(0), 1)
    varOutput(lngI, 2) = Right(varTmp(0), 1)
    varOutput(lngI, 3) = Left(varTmp(1), 3)
    varOutput(lngI, 4) = Mid(varTmp(1), 4, 1)
    varOutput(lngI, 5) = Mid(varTmp(1), 5)
    If Len(varTmp(2)) = 2 Then
      varOutput(lngI, 6) = Left(varTmp(2), 1)
      varOutput(lngI, 7) = Right(varTmp(2), 1)
    ElseIf Len(varTmp(2)) = 1 Then
      If IsNumeric(varTmp(2)) Then
        varOutput(lngI, 7) = varTmp(2)
      Else
        varOutput(lngI, 6) = varTmp(2)
      End If
    End If
  Next
  .Range("A12").Resize(UBound(varOutput, 1), 7) = varOutput
End With
End Sub

"vorallen können die Zahlen bzw. Buchstabenblöcke unterschiedliche Längen haben"
Dann zeig bitte, welche Kombinationen vorkommen können, dann muss man den Code nicht x-Mal anpassen/korrigieren.
Gruß Sepp

Anzeige
Code nochmal falsch ;-))
27.08.2017 13:02:10
Sepp
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub spiltText()
Dim varInPut As Variant, varOutput() As Variant, varTmp As Variant
Dim lngI As Long, lngN As Long

With Sheets("Tabelle4") 'Tabellenname - Anpassen!
  varInPut = .Range("A12:A" & Application.Max(12, .Cells(.Rows.Count, 1).End(xlUp).Row))
  Redim varOutput(1 To UBound(varInPut, 1), 1 To 7)
  For lngI = 1 To UBound(varInPut, 1)
    varTmp = Split(varInPut(lngI, 1), ".")
    varOutput(lngI, 1) = Left(varTmp(0), 1)
    varOutput(lngI, 2) = Right(varTmp(0), 1)
    varOutput(lngI, 3) = Left(varTmp(1), 3)
    varOutput(lngI, 4) = Mid(varTmp(1), 4, 1)
    varOutput(lngI, 5) = Mid(varTmp(1), 5)
    If Len(varTmp(2)) = 2 Then
      varOutput(lngI, 6) = Left(varTmp(2), 1)
      varOutput(lngI, 7) = Right(varTmp(2), 1)
    ElseIf Len(varTmp(2)) = 1 Then
      If IsNumeric(varTmp(2)) Then
        varOutput(lngI, 7) = varTmp(2)
      Else
        varOutput(lngI, 6) = varTmp(2)
      End If
    End If
  Next
  .Range("A12").Resize(UBound(varOutput, 1), 7) = varOutput
End With
End Sub

Gruß Sepp

Anzeige
AW: Code nochmal falsch ;-))
27.08.2017 13:11:47
JEns
Danke.
mein Problem ist, dass es vermutlich 100 Fälle geben könnte. Gibt es nicht eine Möglichkeit irgendwie einfach nach Buchstaben bzw. Ziffernblöcke das ganze Aufzuteilen? Sprich wenn ein Wechsel das ist dann neue Spalte unter Berücksichtigung des Trennzeichen "." und der Zuordnung zu den beiden letzten Spalten.
AW: Code nochmal falsch ;-))
27.08.2017 13:30:01
Sepp
Hallo Jens,
wenn die Grundstruktur der String immer deinen Beispielen folgt, dann evtl. so.
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub spiltText()
Dim varInPut As Variant, varOutput() As Variant, varLetter As Variant, varDigit As Variant
Dim strTmp As String
Dim lngI As Long

On Error Resume Next

With Sheets("Tabelle4") 'Tabellenname - Anpassen!
  varInPut = .Range("A12:A" & Application.Max(12, .Cells(.Rows.Count, 1).End(xlUp).Row))
  Redim varOutput(1 To UBound(varInPut, 1), 1 To 7)
  For lngI = 1 To UBound(varInPut, 1)
    strTmp = Trim$(Replace(varInPut(lngI, 1), ".", " "))
    varLetter = SplitRe(strTmp, "\d+")
    varDigit = SplitRe(strTmp, "\D+")
    varOutput(lngI, 1) = Trim$(varLetter(0))
    varOutput(lngI, 4) = Trim$(varLetter(2))
    varOutput(lngI, 6) = Trim$(varLetter(3))
    varOutput(lngI, 2) = Trim$(varDigit(1))
    varOutput(lngI, 3) = Trim$(varDigit(2))
    varOutput(lngI, 5) = Trim$(varDigit(3))
    varOutput(lngI, 7) = Trim$(varDigit(4))
  Next
  .Range("A12").Resize(UBound(varOutput, 1), 7) = varOutput
End With
End Sub

Private Function SplitRe(text As String, pattern As String, Optional ignorecase As Boolean = True) As String()
Static re As Object
If re Is Nothing Then
  Set re = CreateObject("VBScript.RegExp")
  re.Global = True
  re.MultiLine = True
End If
re.ignorecase = ignorecase
re.pattern = pattern
SplitRe = Strings.Split(re.Replace(text, vbNullChar), vbNullChar)
End Function

Gruß Sepp

Anzeige
AW: Code nochmal falsch ;-))
27.08.2017 13:38:50
JEns
Wow. Das funktioniert super.
Das einzige zwischen den letzten beiden Spalte muss eine ausgelassen werden. Sprich die letzte Spalte rutscht nochmals um eins weiter rechts. Was muss man hierzu ergänzen? Alles andere funktioniert sehr gut. Danke
AW: Code nochmal falsch ;-))
27.08.2017 13:42:42
Sepp
Hallo Jens,
sorry, dass hatte ich überlesen.
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub spiltText()
Dim varInPut As Variant, varOutput() As Variant, varLetter As Variant, varDigit As Variant
Dim strTmp As String
Dim lngI As Long

On Error Resume Next

With Sheets("Tabelle4") 'Tabellenname - Anpassen!
  varInPut = .Range("A12:A" & Application.Max(12, .Cells(.Rows.Count, 1).End(xlUp).Row))
  Redim varOutput(1 To UBound(varInPut, 1), 1 To 8)
  For lngI = 1 To UBound(varInPut, 1)
    strTmp = Trim$(Replace(varInPut(lngI, 1), ".", " "))
    varLetter = SplitRegEX(strTmp, "\d+")
    varDigit = SplitRegEX(strTmp, "\D+")
    varOutput(lngI, 1) = Trim$(varLetter(0))
    varOutput(lngI, 4) = Trim$(varLetter(2))
    varOutput(lngI, 6) = Trim$(varLetter(3))
    varOutput(lngI, 2) = Trim$(varDigit(1))
    varOutput(lngI, 3) = Trim$(varDigit(2))
    varOutput(lngI, 5) = Trim$(varDigit(3))
    varOutput(lngI, 8) = Trim$(varDigit(4))
  Next
  .Range("A12").Resize(UBound(varOutput, 1), 8) = varOutput
End With
End Sub

Private Function SplitRegEX(Text As String, Pattern As String, Optional iCase As Boolean = True) As String()
Static objRegEX As Object
If objRegEX Is Nothing Then
  Set objRegEX = CreateObject("VBScript.RegExp")
  objRegEX.Global = True
  objRegEX.MultiLine = True
End If
objRegEX.IgnoreCase = iCase
objRegEX.Pattern = Pattern
SplitRegEX = Strings.Split(objRegEX.Replace(Text, vbNullChar), vbNullChar)
End Function

Gruß Sepp

Anzeige
Andere Version
27.08.2017 16:55:57
Sepp
Hallo Jens,
eine andere Version.
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub spiltText()
Dim varInPut As Variant, varOutput() As Variant, varSplit As Variant
Dim strTmp As String
Dim lngI As Long

On Error Resume Next

With Sheets("Tabelle4") 'Tabellenname - Anpassen!
  varInPut = .Range("A12:A" & Application.Max(12, .Cells(.Rows.Count, 1).End(xlUp).Row))
  Redim varOutput(1 To UBound(varInPut, 1), 1 To 8)
  For lngI = 1 To UBound(varInPut, 1)
    strTmp = Trim$(Replace(varInPut(lngI, 1), ".", " "))
    If RXSplit(varSplit, strTmp, "\D+|\d+") = 0 Then
      varOutput(lngI, 1) = Trim$(varSplit(0))
      varOutput(lngI, 2) = Trim$(varSplit(1))
      varOutput(lngI, 3) = Trim$(varSplit(3))
      varOutput(lngI, 4) = Trim$(varSplit(4))
      varOutput(lngI, 5) = Trim$(varSplit(5))
      varOutput(lngI, 6) = Trim$(varSplit(6))
      varOutput(lngI, 8) = Trim$(varSplit(7))
    End If
  Next
  .Range("A12").Resize(UBound(varOutput, 1), 8) = varOutput
End With
End Sub

Private Function RXSplit(ByRef Result As Variant, Text As String, Pattern As String, Optional iCase As Boolean = True) As Long
Dim objMatch As Object, lngI As Long, varTemp() As Variant
Static objRegEX As Object
On Error GoTo ErrorHandler
If objRegEX Is Nothing Then
  Set objRegEX = CreateObject("VBScript.RegExp")
  objRegEX.Global = True
  objRegEX.MultiLine = True
End If
With objRegEX
  .IgnoreCase = iCase
  .Pattern = Pattern
  Set objMatch = .Execute(Text)
  Redim varTemp(objMatch.Count - 1)
  For lngI = 0 To objMatch.Count - 1
    varTemp(lngI) = objMatch.Item(lngI)
  Next
End With
Result = varTemp
Exit Function
ErrorHandler:
RXSplit = -1
End Function

Gruß Sepp

AW: Andere Version
28.08.2017 16:49:05
Jens
Hallo,
danke. Wo liegen die Unterschiede bei den beiden Varinaten?
AW: Andere Version
28.08.2017 18:39:25
Sepp
Hallo Jens,
in Ergebnis gibt es keinen Unterschied, der zweite Code ist einfacher, kürzer und schneller, weil die Funktion RXSplit() nur einmal aufgerufen wird.
Gruß Sepp

AW: Andere Version
29.08.2017 07:45:59
Jens
Ok danke
Habe ich Verstanden.
Habe noch das Problem wenn Daten nicht richtig aufgebaut sind müssen die gesucht und markiert werden.
Die Daten sind ja so aufgebaut
O1.23Z01.a
U1.100A999.b2
E0.101A998
Sprich es ist immer die Gleiche Reighenfolge die sein muss.
Buchstabenblock U
Ziffernblock 1
Punkt .
Ziffernblock 100
Buchstabenblock A
Ziffernblock 999
Die Länge der Blöcke kann aber varieren, aber es muss immer mindestens ein Zeichen vorhanden sein.
Danach können noch Informationen zusätzlich kommen.
Punkt .
Buchstabe b
Ziffernblock 2
Wenn der Punkt vorhanden sein sollte muss mindestens der Buchstabe noch dabei sein. Hier handelt es sich nicht um einen Buchstabenblock sondern wirklich nur um einen Buchstaben der aber varieren kann.
Danach kann dann wieder ein Ziffernblock folgen.
Sofern nun die Daten ab B12 nicht den Aufbau genmäß der obigen Vorgabe haben, soll die Zelle rot eingefärbt werden.
Als Block meine ich einfach eine Ansammlung von mehreren Buchstaben oder Ziffern.
Hast du hierzu eine Idee?
Dann habe ich alle Funktionen drin die ich brauche.
AW: Andere Version
30.08.2017 21:49:45
Sepp
Hallo Jens,
bin erst heute dazu gekommen, ich hoffe, dass ich nichts übersehen habe.
' **********************************************************************
' Modul: Modul3 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Sub spiltText()
Dim varInPut As Variant, varOutput() As Variant, varSplit As Variant
Dim objRange As Object
Dim strTmp As String
Dim lngI As Long

On Error Resume Next

With Sheets("Tabelle4") 'Tabellenname - Anpassen!
  Set objRange = .Range("A12:A" & Application.Max(12, .Cells(.Rows.Count, 1).End(xlUp).Row))
  objRange.Interior.ColorIndex = xlNone
  varInPut = objRange
  Redim varOutput(1 To UBound(varInPut, 1), 1 To 8)
  For lngI = 1 To UBound(varInPut, 1)
    If RXCheck(varInPut(lngI, 1), "^\D+\d+\.\d+\D+\d+$|^\D+\d+\.\d+\D+\d+\.\D{1}\d*$") Then
      strTmp = Trim$(Replace(varInPut(lngI, 1), ".", " "))
      If RXSplit(varSplit, strTmp, "\D+|\d+") = 0 Then
        varOutput(lngI, 1) = Trim$(varSplit(0))
        varOutput(lngI, 2) = Trim$(varSplit(1))
        varOutput(lngI, 3) = Trim$(varSplit(3))
        varOutput(lngI, 4) = Trim$(varSplit(4))
        varOutput(lngI, 5) = Trim$(varSplit(5))
        varOutput(lngI, 6) = Trim$(varSplit(6))
        varOutput(lngI, 8) = Trim$(varSplit(7))
      End If
    Else
      varOutput(lngI, 1) = varInPut(lngI, 1)
      objRange.Cells(lngI, 1).Interior.Color = vbRed
    End If
  Next
  .Range("A12").Resize(UBound(varOutput, 1), 8) = varOutput
End With

Set objRange = Nothing
End Sub

Private Function RXSplit(ByRef Result As Variant, Text As String, Pattern As String, Optional iCase As Boolean = True) As Boolean
Dim objMatch As Object, lngI As Long, varTemp() As Variant
Static objRegEX As Object
On Error GoTo ErrorHandler
If objRegEX Is Nothing Then
  Set objRegEX = CreateObject("VBScript.RegExp")
  objRegEX.Global = True
  objRegEX.MultiLine = True
End If
With objRegEX
  .IgnoreCase = iCase
  .Pattern = Pattern
  Set objMatch = .Execute(Text)
  Redim varTemp(objMatch.Count - 1)
  For lngI = 0 To objMatch.Count - 1
    varTemp(lngI) = objMatch.Item(lngI)
  Next
End With
Result = varTemp
Exit Function
ErrorHandler:
RXSplit = -1
End Function

Private Function RXCheck(ByVal Text As String, ByVal Pattern As String, Optional ByVal iCase As Boolean = True) As Boolean
Static objRegEX As Object

If objRegEX Is Nothing Then
  Set objRegEX = CreateObject("VBScript.RegExp")
  objRegEX.Global = True
  objRegEX.MultiLine = True
End If
With objRegEX
  .Global = True
  .IgnoreCase = iCase
  .Pattern = Pattern
  RXCheck = .test(Text)
End With

End Function

Gruß Sepp

AW: Andere Version
31.08.2017 09:05:39
Jens
Besten Dank.
Genau das Wollte ich.
Super :)
AW: Andere Version
01.09.2017 08:55:21
Jens
Hallo Sepp,
habe das Problem, dass die Datei sehr groß ist und dadurch sehr überladen mit den roten zellen.
Hätte versucht jetzt die Schrift Fett und die schriftfarbe rot zu machen.
Wir auch gemacht aber am Ende des makros wird wieder alles zurück gesetzt. Kannst du mir hier nochmals helfen?
in Spalten aufteilen.

Sub Positionsnummer_prüfen()
Dim varInPut As Variant, varOutput() As Variant, varSplit As Variant
Dim objRange As Object
Dim strTmp As String
Dim lngI As Long
On Error Resume Next
Worksheets("Aufstellung").Range("B13:B" & Cells(Rows.Count, 1).End(xlUp).Row).Locked = True
With Sheets("Aufstellung") 'Tabellenname - Anpassen!
Set objRange = .Range("B13:B" & Application.Max(12, .Cells(.Rows.Count, 1).End(xlUp).Row))
objRange.Interior.ColorIndex = xlNone
'objRange.Font.Bold = False
'objRange.Font.ColorIndex = 1
varInPut = objRange
ReDim varOutput(1 To UBound(varInPut, 1), 1 To 8)
For lngI = 1 To UBound(varInPut, 1)
If RXCheck(varInPut(lngI, 1), "^\D+\d+\.\d+\D+\d+$|^\D+\d+\.\d+\D+\d+\.\D{1}\d*$") Then
strTmp = Trim$(Replace(varInPut(lngI, 1), ".", " "))
If RXSplit(varSplit, strTmp, "\D+|\d+") = 0 Then
varOutput(lngI, 1) = Trim$(varSplit(0))
varOutput(lngI, 2) = Trim$(varSplit(1))
varOutput(lngI, 3) = Trim$(varSplit(3))
varOutput(lngI, 4) = Trim$(varSplit(4))
varOutput(lngI, 5) = Trim$(varSplit(5))
varOutput(lngI, 6) = Trim$(varSplit(6))
varOutput(lngI, 8) = Trim$(varSplit(7))
End If
Else
varOutput(lngI, 1) = varInPut(lngI, 1)
objRange.Cells(lngI, 1).Interior.Color = vbRed
'objRange.Cells(lngI, 1).Font.Bold = True
'objRange.Cells(lngI, 1).Font.ColorIndex = 3
objRange.Cells(lngI, 1).Locked = False
End If
Next
.Range("AO13").Resize(UBound(varOutput, 1), 8) = varOutput
End With
UserForm3.Show
Set objRange = Nothing
End Sub
Private Function RXSplit(ByRef Result As Variant, Text As String, Pattern As String, Optional  _
iCase As Boolean = True) As Boolean
Dim objMatch As Object, lngI As Long, varTemp() As Variant
Static objRegEX As Object
On Error GoTo ErrorHandler
If objRegEX Is Nothing Then
Set objRegEX = CreateObject("VBScript.RegExp")
objRegEX.Global = True
objRegEX.MultiLine = True
End If
With objRegEX
.ignorecase = iCase
.Pattern = Pattern
Set objMatch = .Execute(Text)
ReDim varTemp(objMatch.Count - 1)
For lngI = 0 To objMatch.Count - 1
varTemp(lngI) = objMatch.Item(lngI)
Next
End With
Result = varTemp
Exit Function
ErrorHandler:
RXSplit = -1
End Function
Private Function RXCheck(ByVal Text As String, ByVal Pattern As String, Optional ByVal iCase As  _
Boolean = True) As Boolean
Static objRegEX As Object
If objRegEX Is Nothing Then
Set objRegEX = CreateObject("VBScript.RegExp")
objRegEX.Global = True
objRegEX.MultiLine = True
End If
With objRegEX
.Global = True
.ignorecase = iCase
.Pattern = Pattern
RXCheck = .test(Text)
End With
End Function

AW: Andere Version
01.09.2017 17:18:54
Sepp
Hallo Jens,
da du einige Änderungen vorgenommen hast, weiß ich nicht, ob das Ergebnis so passt.
Sub Positionsnummer_prüfen()
Dim varInPut As Variant, varOutput() As Variant, varSplit As Variant
Dim objRange As Object, objError As Object
Dim strTmp As String
Dim lngI As Long

On Error Resume Next

With Sheets("Aufstellung") 'Tabellenname - Anpassen!
  Set objRange = .Range("B13:B" & Application.Max(13, .Cells(.Rows.Count, 2).End(xlUp).Row))
  With objRange
    .Interior.ColorIndex = xlNone
    .Font.Bold = False
    .Font.ColorIndex = 1
    .Locked = True
  End With
  varInPut = objRange
  Redim varOutput(1 To UBound(varInPut, 1), 1 To 8)
  For lngI = 1 To UBound(varInPut, 1)
    If RXCheck(varInPut(lngI, 1), "^\D+\d+\.\d+\D+\d+(\.\D{1}\d*)*$") Then
      strTmp = Trim$(Replace(varInPut(lngI, 1), ".", " "))
      If RXSplit(varSplit, strTmp, "\D+|\d+") = 0 Then
        varOutput(lngI, 1) = Trim$(varSplit(0))
        varOutput(lngI, 2) = Trim$(varSplit(1))
        varOutput(lngI, 3) = Trim$(varSplit(3))
        varOutput(lngI, 4) = Trim$(varSplit(4))
        varOutput(lngI, 5) = Trim$(varSplit(5))
        varOutput(lngI, 6) = Trim$(varSplit(6))
        varOutput(lngI, 8) = Trim$(varSplit(7))
      End If
    Else
      If objError Is Nothing Then
        Set objError = objRange.Cells(lngI, 1)
      Else
        Set objError = Union(objError, objRange.Cells(lngI, 1))
      End If
    End If
  Next
  .Range("AO13").Resize(UBound(varOutput, 1), 8) = varOutput
  If Not objError Is Nothing Then
    With objError
      .Font.Bold = True
      .Font.ColorIndex = 3
      .Locked = False
    End With
  End If
End With
UserForm3.Show
Set objRange = Nothing
Set objError = Nothing
End Sub

Der Rest des Codes, also die Funktionen bleiben unverändert!
Gruß Sepp

AW: Ausdrücke in Spalten aufteilen.
27.08.2017 16:30:12
Peter
Hallo Jens,
vielleicht so:
Option Explicit
Public Sub Aufteilen()
Dim lZeile     As Long
Dim iSpalte    As Integer
Dim sText      As Variant
Dim lLaenge    As Long
Dim iPosition  As Long
Application.ScreenUpdating = False
iSpalte = 2
With ThisWorkbook.Worksheets("Tabelle1") ' den tabellenblattnamen ggf. anpassen
.Range("B2:I" & .Cells(.Rows.Count, 2).End(xlUp).Row).ClearContents
For lZeile = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
.Range("B" & lZeile).Value = Left(Range("A" & lZeile).Value, 1)
.Range("C" & lZeile).Value = Mid(Range("A" & lZeile).Value, 2, 1)
sText = ""
For lLaenge = 4 To 7
If IsNumeric(Mid(.Range("A" & lZeile).Value, lLaenge, 1)) Then
sText = sText + Mid(.Range("A" & lZeile).Value, lLaenge, 1)
Else
Exit For
End If
Next lLaenge
.Range("D" & lZeile).Value = sText
If Not IsNumeric(Mid(.Range("A" & lLaenge), 1, 1)) Then
.Range("E" & lZeile).Value = Mid(Range("A" & lZeile).Value, lLaenge, 1)
End If
sText = ""
iPosition = lLaenge + 1
For lLaenge = iPosition To 15
If IsNumeric(Mid(.Range("A" & lZeile).Value, lLaenge, 1)) Then
sText = sText + Mid(.Range("A" & lZeile).Value, lLaenge, 1)
Else
Exit For
End If
Next lLaenge
.Range("F" & lZeile).Value = sText
iPosition = lLaenge + 1
If Not IsNumeric(Mid(.Range("A" & lZeile).Value, iPosition, 1)) Then
.Range("G" & lZeile).Value = Mid(.Range("A" & lZeile).Value, iPosition, 1)
End If
.Range("H" & lZeile).Value = Right(.Range("A" & lZeile), 1)
Next lZeile
End With
End Sub

Gruß Peter

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige