2017-08-01 356 views
0

希望有人能够提供更好的方法来处理我正在做的事情。不幸的是,数据和代码位于客户端系统上,所以我无法共享它们。使用正则表达式分割字符串的VBA

我有这个以前是数据表的长字符串,需要再次将值分成行和列。系统严重锁定,所以我仅限于使用VBA。我能想到的最好方法是使用正则表达式来识别列和行。我已经建立了我的正则表达式对象并对输入的字符串执行,并拥有我需要的所有匹配,这很好。问题是,如果我这样做

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

据我所见,有没有办法保留我分裂的价值观。在某些情况下,我想要在正则表达式字符串中间分割。

最有希望的解决方案,我觉得是做

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

我考虑刚插入分隔符,然后使用分裂。不幸的是,VBA似乎没有方法将字符插入到字符串中,但使用第一个索引看起来有点笨重。

有没有人对更好的方法有任何想法?非常感谢,如果是这样。

+4

没有任何 - 甚至是虚拟 - 数据,它不清楚如何提供帮助。 –

+0

很确定'匹配'需要是一个对象引用,因此使用'Set'关键字进行赋值。问题:为什么你不使用早期绑定来处理你不熟悉的API? –

+0

谢谢你的想法。我会尽力在稍后分享一个更好的数据/字符串描述。我没有遇到早期绑定这个词,但看起来像我正在使用它。我只是在stackoverflow编辑器中键入他上面的代码,因为我没有访问我实际使用的代码。是的,我认为set关键字是必需的。 – soundofsilence

回答

1

您实际上可以将字符插入到字符串中。取决于你的“笨重”的定义,但这里有一个例子:

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

这将会把一个“|”开始在小区的第五个字符。您可能需要通过单元格字符中的查找或某些循环来识别某些位置,但我认为这可能会让您走上正路。

使用STRING编辑进行更新 这只是我的偏好,但编辑字符串看起来不太笨拙。您可以使用此设置来获取您想要的内容:

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

谢谢,这很有用。我正在考虑添加到VBA字符串而不是直接在单元格中。尽管我可以改变我的方法来利用他的方法。 – soundofsilence

+0

如果您想使用字符串,请参阅更新的答案。似乎不太复杂? – PGCodeRider

+1

我会接受作为答案,我认为这是我可以设想的最佳方法。 +1用于明智地猜测我正在使用的数据类型 – soundofsilence