在VBA中分割文本和数字

我有我想split column header

标题 XA 2009 WW YY 2010 XXA 2011

我想输出像

XA,WWYY,XXA

之前我在excel使用find函数,工作正常

= MID(“XA 2009”,1,FIND(“”,“XA 2009”,FIND(“”,“XA 2009”)+ 1)-1)

输出为XA,WW YY

现在需求已经改变为vba中的代码

我试图使用Instr()而不是查找,因为它不是在VBA中工作

(1,“XA 2009”,“”,InStr(1,“XA 2009”,“2”)) – 1)

现在输出是XA,WW而不是WW YY。

任何人都可以提出我做错了什么。 我对vba很新。

我想输出像

XA,WWYY,XXA

我正在使用excel 2013

首先,请参阅以下SO问题的答案,在VBA中使用Regexsearch的一般方法和先决条件:

如何在Microsoft Excel中使用正则expression式(正则expression式)在单元格内和循环中

现在,针对您的具体要求,请尝试以下模式:

 (\D*)\s+\d*\s+(\D*)\s+\d*\s+(\D*)\s+\d* 

它会为你的精确的例子,但如果你需要inputstring是一个更普遍的一点,你可能需要修改模式。

一些解释:
\ D *将匹配一个或多个非数字文本字符(“字母字符”)
\ s +将匹配至less一个空格字符
\ d *将匹配一个或多个数字
(括号)是用于对结果集合进行分组的,所以我用它们来包围你想要从inputstring中提取的内容。

例如,如果您确实知道只能使用一个空格字符,您可以使用:
[\ s]的
所以模式可能如下所示:

 (\D*)[\s]\d*[\s](\D*)[\s]\d*[\s](\D*)[\s]\d* 

此外,这是在线模式testing的一个很好的工具:

https://regex101.com/

这是您编辑的要求的解决scheme:

  1. 在VBA编辑器中,转到tools =>引用,find并选中“Microsoft VBScript Regular Expressions 5.5”旁边的checkbox,按ok

  2. 将此代码添加到“ThisWorkbook”模块:

     Private Sub solution() Dim regEx As New RegExp Dim strPattern As String Dim myInput As Range Dim myOutput As Range Set myInput = ActiveSheet.Range("A1") Set myOutput = ActiveSheet.Range("A2") strPattern = "(\D*)[\s]\d*[\s](\D*)[\s]\d*[\s](\D*)[\s]\d*" strInput = myInput.Value With regEx .Global = True .MultiLine = True .IgnoreCase = False .Pattern = strPattern End With If regEx.test(strInput) Then ActiveSheet.Range("A2") = regEx.Replace(strInput, "$1, $2, $3") End If End Sub 

你可能在一个特定的单元格中有这个公式,对吧? 我认为应该做以下事情:

 Range("yourcell").FormulaR1C1 = "=MID("XA 2009",1,FIND(" ","XA 2009",FIND(" ","XA 2009")+1)-1)" 

只要用你公式中的单元格号代替“你的单元格”。例如,如果你在单元格A1中有它,它应该是Range("A1")