Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1560to1564
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

SplitString soll nicht gefunden Wert überspringen

SplitString soll nicht gefunden Wert überspringen
30.05.2017 14:56:08
Carsten
Hallo zusammen,
ich arbeite gerade daran eine Spalte mit mehreren mit dem Schema [ x yyyyyyyy] enthaltenen Werte Stehen und zwar ist das x eine Zahl und das yyyyyyy ist eine beliebige Bezeichnung sowas wie [ 4 Eier] etc...
Klappt: (alle vorhanden) [ 3 Auto ] [ 3 Eier ] [ 2 Fehl ] [ 2 Bahn ] Klappt nicht:
 [ 3 Auto ] [ 3 Eier ] [ 2 Fehl ] [ 2 Bahn ]  [ 1 Haus ] 
Meine Idee... so aufteilen über Right(Left(... damit ich nur die Zahl in ner Spalte stehen habe...
Allerdings sobald ein Begriff in einer Spalte nicht vorhanden ist kommt Laufzeitfehler 5 .. wie umgehe ich das? Vlt. mit If right > 1 oder so?
Option Explicit
Sub Aufteilen()
Dim splitString As String
Dim LastRow As Long
Dim splitStringLeft1, splitStringLeft2, splitStringLeft3, _
splitStringLeft4, splitStringLeft5, splitStringLeft6, _
splitStringLeft7, splitStringLeft8, splitStringLeft9 As String
Dim i, Eier, Auto, Bahn, Fehl As Long
LastRow = Worksheets("Tabelle1").Cells(Worksheets("Tabelle1").Rows.Count, "A").End(xlUp).Row
For i = 2 To LastRow
splitString = Worksheets("Tabelle1").Range("A" & i)
Eier= InStr(splitString, "Eier")
Auto= InStr(splitString, "Auto")
Bahn = InStr(splitString, "Bahn")
Fehl= InStr(splitString, "Fehl")
splitStringLeft1 = Right(Left(splitString, Eier - 2), 1)
splitStringLeft2 = Right(Left(splitString, Auto - 2), 1)
splitStringLeft3 = Right(Left(splitString, Bahn - 1), 3)
splitStringLeft4 = Right(Left(splitString, Fehl - 2), 1)
Debug.Print splitStringLeft1
Debug.Print splitStringLeft2
Debug.Print splitStringLeft3
Debug.Print splitStringLeft4
Next i
End Sub

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: anderer Ansatz
30.05.2017 15:15:01
Fennek
Hallo,
spontan möchte ich einen anderen Ansatz ins Gespräch bringen:
Die Idee ist EIN Trennzeichen zwischen den Blöcken und erst dann splitten:
ungeprüft:

sub Fen()
y = columns(1).replace("[", "]")
for i = 1 to cells(rows.count, "A").end(xlup).row
Ret = split(cells(i,"A"), "]")
for y = 0 to ubound(Ret) step 2
cells(i,y/2+2) = Ret(y)
next y
next i
end sub
mfg
AW: anderer Ansatz
30.05.2017 17:37:08
Carsten
Gute Idee eigentlich versuche ich mal Umzusetzen :)
Noch ein weiterer Ansatz
30.05.2017 15:27:28
Max2
Hallo,
hier mit Like:
Option Explicit
Sub Aufteilen()
Dim compareString As String
Dim currentString As String
Dim lRow As Long, i As Long
Dim ws As Worksheet
Dim stringLength As Long
Dim j As Long
On Error Resume Next
Set ws = ThisWorkbook.Sheets(1)
With ws
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
'//alles was eine Zahl von 0 bis 9 hat
compareString = "*[0-9]*"
For i = 1 To lRow
'//momentaner String aus Zelle
currentString = .Cells(i, 1).Value
'//Wenn Zellwert wie vergleichswert
If currentString Like compareString Then
'//dann hol dir die Länge des Strings
stringLength = Len(currentString)
For j = 1 To stringLength
'//Wenn position x des Strings Numerisch ist
If IsNumeric(Mid(currentString, j, 1)) Then
'//Dann ersetzte den String
currentString = Mid(currentString, j, 1)
End If
Next j
Debug.Print currentString
End If
Next i
End With
End Sub

Anzeige
am besten noch mit Exit for
30.05.2017 15:31:44
Max2

'//Wenn position x des Strings Numerisch ist
If IsNumeric(Mid(currentString, j, 1)) Then
'//Dann ersetzte den String
currentString = Mid(currentString, j, 1)
Exit For
End If
Das Fettmarkierte am besten noch einfügen
AW: am besten noch mit Exit for
30.05.2017 18:23:38
Carsten
Ok habs getestet, gibt mir jeweils nur die Erste Anzahl der Werte aus
Bsp.
[ 2 Auto ] [ 1 Haus ]
[ 2 Auto ] [ 1 Haus ]
[ 2 Auto ] [ 1 Haus ]
Dann gibt er aus:
2
2
2
Schön wäre es wenn in der nächsten spalte dann die 1 1 1 stehen würde :)
Anzeige
noch ein Ansatz:.Pattern = "(\[ )(\d+(?= ))"
30.05.2017 18:10:19
ransi
HAllo,
Versuch alternativ doch mal sowas:
Tabelle1

 ABCDEFG
1 [ 4 Auto ] [ 3 Eier ] [ 2 Fehl ] [ 2 Bahn ]  [ 12 Haus ] 432212#WERT!
2 [ 3 Auto ] [ 3 Eier ] [ 2 Fehl ] [ 2 Bahn ] 3322#WERT!#WERT!

Formeln der Tabelle
ZelleFormel
B1=machs($A1;SPALTE(A1))


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit


Public Function machs(strText As String, intIndex As Integer) As Long
    Dim regex As Object
    Set regex = CreateObject("vbScript.Regexp")
    Dim objMatches As Object
    With regex
        .Pattern = "(\[ )(\d+(?= ))"
        .Global = True
        Set objMatches = .Execute(strText)
        machs = objMatches(intIndex - 1).submatches(1)
    End With
End Function


ransi
Anzeige
AW: noch ein Ansatz:.Pattern = "(\[ )(\d+(?= ))"
30.05.2017 18:31:20
Carsten
Sehr cool :) Klappt^^
ist es möglich so auch die dazugehörigen Bezeichnungen auszulesen ?
Also aus:

[ 3 Auto ] [ 3 Eier ] [ 2 Fehl ] [ 2 Bahn ]
3          3            2            2

Und die Spalten daneben.
Auto    Eier      Fehl       Bahn

AW: noch ein Ansatz:.Pattern = "(\[ )(\d+(?= ))"
31.05.2017 09:25:49
ransi
Hallo,
Geht auch, ist aber etwas komplizierter:
Tabelle1

 ABCDEFGHIJKL
1[ 3 Auto ] [ 3 Eier ] [ 2 Fehl ] [ 2 Bahn ]3322AutoEierFehlBahn#WERT!#WERT!#WERT!
2[ 3 Auto ] [ 3 Eier ] [ 2 Fehl ] [ 2 Bahn ]  [ 1 Haus ]33221AutoEierFehlBahnHaus#WERT!

Formeln der Tabelle
ZelleFormel
B1=machs($A1;SPALTE(A1))


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public Function machs(strText As String, intIndex As Integer)
    Dim regex As Object
    Dim objMatches As Object
    Dim objMatch As Object
    Dim I As Integer
    Redim out(1)
    Set regex = CreateObject("vbScript.Regexp")
    With regex
        .Pattern = "(\[ )(\d+) ([A-ZÄÖÜß]+)"
        .ignorecase = True
        .Global = True
        Set objMatches = .Execute(strText)
        For Each objMatch In objMatches
            Redim Preserve out((objMatches.Count * 2) - 1)
            out(I) = objMatch.submatches(1)
            out(objMatches.Count + I) = objMatch.submatches(2)
            I = I + 1
        Next
    End With
    machs = out(intIndex - 1)
End Function


ransi
Anzeige
AW: noch ein Ansatz:.Pattern = "(\[ )(\d+(?= ))"
31.05.2017 11:57:49
Carsten
Sehr cool, danke dir Klappt gut :)
Kann man es hinbekommen das wenn da z.B. [ Haustier ] steht das er das dann auch in eine spalte übernimmt weil bislang macht er das nur wenn da ne Zahl vor steht nehme ich an aus dem VBA zu entnehmen.^^
AW: SplitString soll nicht gefunden Wert überspringen
30.05.2017 19:31:39
Carsten
Hier mal der Zwischenstand:
https://www.herber.de/bbs/user/113893.xlsm
Also das Teilen geht schon nur das Zuordnen ist jetzt mein Problem :D z.B. Hätte gerne Spalten mit Überschriften wo die Werte zugewiesen werden. :)
Wie z.B. in der Datei wäre das dann:

3 Haus-Weiß	 1 Garten	 1/1-Wald	 2 Zaunwerk	 1 Schuppen	 1 geom Form

Aus Spalte 1 wird:

Haus-Weiß     Garten       Wald      Zaunwerk        Schuppen     geom Form
3                1          1/1          2              1           1  

Anzeige
Warum nur das Rad immer wieder neu erfinden, ...
30.05.2017 23:36:54
Luc:-?
…Carsten‽
Das gibt's doch alles längst im Archiv, so dass du sogar Fmln verwenden könntest:
 ABCDEFGHI
1
PrimärdatenAutoEierFehlBahnHaus[ 3 Auto ] [ 3 Eier ] [ 2 Fehl ] [ 2 Bahn ] [ 1 Haus ]33221[ 3 Auto ] [ 3 Eier ] [ 2 Fehl ] [ 2 Bahn ]3322 [ 3 Auto ] [ 3 Eier ] [ 2 Bahn ] [ 1 Haus ]33 21[ 3 Eier ] [ 2 Bahn ] 3 2 Formeln:   E1[:I1]:=INDEX(VSplit(MaskOn(GLÄTTEN($A2);"bst"));SPALTE(A1))E2[:I5]:=WENNFEHLER(--MaskOn(INDEX(VSplit(GLÄTTEN($A2);"] [");VERGLEICH("*"&E$1&"*";VSplit(GLÄTTEN($A2);"] [");0));"num");"")
2
3
4
5
6
7
In den Fmln enthaltene UDFs und ihr Standort im Archiv:
MaskOn https://www.herber.de/cgi-bin/callthread.pl?index=1344962#1345181
VSplit https://www.herber.de/bbs/user/99024.xlsm
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Warum nur das Rad immer wieder neu erfinden, ...
31.05.2017 12:33:49
Carsten
Sehr guter Beitrag :)
Hab nicht gewusst das es sowas gibt, habe es jetzt hinbekommen das es soweit Funktioniert, allerdings hab ich ein Problem :( und zwar gibt es Begriffe die z.B. erst in Zeile 10 das erste mal Vorkommen diese findet er dann oben in der ersten Zeiele natürlich nicht als Vergleich, gibts da ne möglichkeit das er jede Zelle in Spalte A nach den Begriffen in den [ ] durchsucht und dann als Überschrift nimmt?
oder kann man mit nem Befehl,z.B. automatisch alle spalten der Reihe Verketten und dann nach Verschiedenen Begriffen in den [ ] suchen und die als Überschriften nehmen?
Anzeige
Ja, das gibt's durchaus, ...
31.05.2017 15:41:07
Luc:-?
…Carsten;
in der Datei unter dem 2.Link findest du auch die UDF VJoin, mit der man so etwas machen und dabei gleich alle Doppel weglassen kann. Die Fml lautet dann für das obige Bsp so:
E1[:I1]: {=INDEX(VSplit(MaskOn(VJoin(GLÄTTEN($A2:$A5);;-1);"bst"));SPALTE(A1))}
Dabei richtet sich die Reihenfolge der Texte allerdings nach ihrem 1.Auftreten. Falls alphabetische Reihenfolge gewünscht ist, kann man natürlich die Fmln auch mit ihren Ergebnissen überschreiben und die dann in eine solche bringen. Habe dafür zwar auch eine UDF, die aber nicht im Archiv ist, weil sie intern externe Bezüge (zu anderen UDFs) verwendet.
Luc :-?
Anzeige
Unter bestimmten Umständen wdn doppelte ...
31.05.2017 20:10:44
Luc:-?
…Texte nicht vollständig eliminiert, Carsten,
dann ist folgende singulare MatrixFml besser geeignet:
E1[:I1]: {=INDEX(VSplit(VJoin(VSplit(MaskOn(VJoin(GLÄTTEN($A2:$A5);;-2);"bst"));;-1));SPALTE(A1))}
Luc :-?
AW: Unter bestimmten Umständen wdn doppelte ...
31.05.2017 21:14:39
Carsten
Stimmt hattest recht :D
Gerade getestet klappt echt Prima das ganze (: jetzt muss ich nur meine Daten noch so anpassen das mittendrin kein Leerzeichen, Sonderzeichen oder ne Zahl steht sonst splittet er das in X Spalten :D
Danke dir Luc, möge die macht mit dir sein ;D
Anderenfalls musst du ein anderes Trennzeichen ...
01.06.2017 00:49:18
Luc:-?
…festlegen, Carsten;
allerdings erzeugt MaskOn auch je ein LeerZeichen für jede zusammenhängende Folge entfernter Zeichen (außer an Anfang und Ende des Textes). Übrigens, bereits vorhandene Leerzeichen, die nicht als Trennzeichen verwendet wdn sollen, kannst du durch ein beliebiges anderes SonderZeichen ersetzen und das dann auch als 3.Argument von MaskOn angeben. Das zählt dann ebenso wie ein fehlendes 3.Argument als Default-Wert 0, der nur die im 2.Argument direkt oder indirekt per GruppenKennung angegebe­nen Zeichen bewahrt (1 löscht sie und bewahrt die anderen). Zusätzlich zu einer Zeichengruppe (hier bst für alle Buchstaben) im 2.Argument wdn/wird dann auch diese/s Zeichen bewahrt. Für so etwas wie Haus_Katze unter den Texten sähe das dann so aus:
E1[:I1]: {=INDEX(VSplit(VJoin(VSplit(MaskOn(VJoin(GLÄTTEN($A2:$A5);;-2);"bst";"_"));;-1));SPALTE(A1))}
Danke, ebenso mit dir! ;-)
Luc :-?
Luc :-?
Anzeige
AW: Anderenfalls musst du ein anderes Trennzeichen ...
01.06.2017 09:54:58
Carsten
Sehr nett von dir, das du dir die Zeit nimmst mir zu helfen :)
Also habs soweit jetzt hinbekommen muss halt von Hand die Begriffe logisch machen. Aber die Arbeit ist überschaubar, und muss mir dann nen Makro schreiben der mir dann immer die begriffe xx.x-x ändert in xx_x_x etc. :)
Allerdings habe ich noch eine Frage und zwar hab ich entdeckt das du in einer Formel vor das MaskOn "--" gesetzt hast das hab ich dann Probiert und dabei hab ich gesehen das aus "Text" ne Zahl wurde. Ist das Zufall? oder bedeuten die zwei Striche sowas wie mache ne Zahl aus dem Text?
So ungefähr, -- => -1*-1* - man kann auch 1* ...
01.06.2017 14:19:57
Luc:-?
…oder 0+ schreiben, Carsten;
in der Form kommt das in manchen PgmierSprachen (Inkrement) vor, fktioniert aber auch in Xl-Fmln.
In VSplit ist so etwas bereits eingebaut (3.Argument), würde hier aber nur was nutzen, wenn die Fml entsprd aufbaubar wäre. MaskOn ist aber schon mindestens 12 Jahre alt und kann deshalb direkt nur Einzelwerte verarbeiten.
Luc :-?

120 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige