2017-08-01 1 views
0

Ich hoffe, jemand kann einen besseren Ansatz für das, was ich tue, bieten. Leider sitzen die Daten und der Code auf Client-Systemen, so dass ich sie nicht teilen kann.VBA Verwenden regulärer Ausdrücke, um eine Zeichenfolge zu trennen

Ich habe diese lange Zeichenfolge, die zuvor eine Datentabelle war und die Werte in Zeilen und Spalten wieder aufteilen muss. Das System ist stark gesperrt, so dass ich nur VBA verwenden kann. Der beste Weg, an den ich denken kann, ist die Verwendung von regulären Ausdrücken, um Spalten und Zeilen zu identifizieren. Ich habe mein reguläres Ausdruck-Objekt eingerichtet und gegen die Eingabe-Zeichenfolge ausgeführt, habe alle Übereinstimmungen, die ich brauche, was in Ordnung ist. Das Problem ist, dass wenn ich mache

re = CreateObject("VBScript.RegExp") 
re.pattern = mypattern 
re.split(myString) 

Soweit ich sehen kann, gibt es keine Möglichkeit, die Werte zu behalten, auf die ich spalte. In einigen Fällen möchte ich trotzdem in der Mitte der Regex-Zeichenfolge aufteilen.

Die vielversprechendste Lösung, die ich denke, ist zu tun

re = CreateObject("VBScript.RegExp") 
re.pattern = mypattern 
Set matches = re.execute(myString) 
for each match in matches: 
    'do something with match.firstindex 

Ich hielt gerade Begrenzungszeichen eingefügt und dann gespalten werden. Leider scheint VBA keine Methode zu haben, ein Zeichen in eine Zeichenkette einzufügen, es sieht ein bisschen klobig aus, um den ersten Index zu verwenden.

Hat jemand irgendwelche Gedanken zu besseren Ansätzen? Sehr geschätzt wenn ja.

+4

Ohne irgendwelche - sogar dummy - Daten ist es nicht klar, wie zu helfen. –

+0

Ziemlich sicher 'Matches' muss eine Objektreferenz sein und somit mit dem' Set' Schlüsselwort zugewiesen werden. Frage: Warum verwenden Sie keine frühzeitige Bindung, um mit APIs zu arbeiten, mit denen Sie nicht vertraut sind? –

+0

Danke für Ihre Gedanken. Ich werde versuchen, eine bessere Beschreibung der Daten/Zeichenfolge später zu teilen. Ich bin nicht auf den Begriff frühe Bindung gestoßen, aber es sieht so aus, als würde ich ihn benutzen. Ich habe gerade den obigen Code im Stackoverflow-Editor eingegeben, da ich keinen Zugriff auf den Code habe, den ich gerade verwende. Ja, ich denke, gesetztes Schlüsselwort ist erforderlich. – soundofsilence

Antwort

1

Sie können tatsächlich Zeichen in eine Zeichenfolge einfügen. Hängt von Ihrer Definition von „klobig“, aber hier ist ein Beispiel:

ActiveCell.Characters(5, 1).Insert (" | ") 

Dies eine setzen wird „|“ ab dem fünften Zeichen der Zelle. Möglicherweise müssen Sie einige Positionen mithilfe von find oder einigen Schleifen durch die Zellenzeichen identifizieren, aber ich denke, dass Sie dadurch möglicherweise auf dem richtigen Weg sind.

AKTUALISIERT MIT STRING EDIT Dies ist nur meine Vorliebe, aber die Bearbeitung der Zeichenfolge scheint nicht zu klobig. Sie können dieses Setup verwenden, um wahrscheinlich zu bekommen, was Sie wollen:

Sub StringSlicerSample() 
Dim teststring As String, Separater As String, tangoTxt As String, BeforeTXT As String, AfterTxt As String, MidTxt As String 
Dim Position_To_Slice As Integer 

teststring = "xxxbangyyy"  
Separater = " | " 'can be whatever you want as separator  
tangoTxt = "bang" 'text to look for that you want use for split 
Position_To_Slice = 1 'If you want to split somewhere in between, lets say after the "b" 
'put =1 as that's the first position in "bang" 

'Insert separator before 
BeforeTXT = Mid(teststring, 1, InStr(1, teststring, tangoTxt) - 1) & Separater & Mid(teststring, InStr(1, teststring, tangoTxt), Len(teststring)) 

'Insert after 
AfterTxt = Mid(teststring, 1, InStr(1, teststring, tangoTxt) + Len(tangoTxt) - 1) & Separater & Mid(teststring, InStr(1, teststring, tangoTxt) + Len(tangoTxt), Len(teststring)) 

'Split inbetween based on position to slice 
MidTxt = Mid(teststring, 1, InStr(1, teststring, tangoTxt) + Position_To_Slice - 1) & Separater & Mid(teststring, InStr(1, teststring, tangoTxt) + Position_To_Slice, Len(teststring)) 


MsgBox BeforeTXT, Title:="Before Example" 
MsgBox AfterTxt, Title:="After Example" 
MsgBox MidTxt, Title:="Sliced in position " & Position_To_Slice 

End Sub 
+0

Danke, das ist nützlich. Ich habe versucht, zu einer VBA-Zeichenfolge statt direkt in einer Zelle hinzuzufügen. Ich könnte meinen Ansatz ein wenig ändern, um seine Methode zu nutzen. – soundofsilence

+0

Siehe aktualisierte Antwort, wenn Sie die Zeichenfolge verwenden möchten. Scheint nicht zu komplex? – PGCodeRider

+1

Ich werde als Antwort akzeptieren, ich denke, das ist der beste Ansatz, den ich mir vorstellen kann. +1 für eine vernünftige Schätzung der Art der Daten, mit denen ich gearbeitet habe – soundofsilence

Verwandte Themen