拆分文本和编号IN VBA

时间:2015-08-12 06:25:45

标签: excel vba excel-vba

我想要column header

split

标题 XA 2009 WW YY 2010 XXA 2011

我希望输出

XA, WW YY, XXA

之前我在excel中使用了查找功能,该功能运行良好

= MID(" XA 2009",1,发现(""," XA 2009",发现("&# 34;," XA 2009")+ 1)-1)

OUTPUT AS XA, WW YY

现在要求已更改为vba中的代码

我试图使用Instr()而不是find,因为它在VBA中不起作用

Mid(" XA 2009",1,InStr(1," XA 2009","",InStr(1,&#34) ; XA 2009"," 2")) - 1)

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

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

我希望输出

XA, WW YY, XXA

我正在使用excel 2013

2 个答案:

答案 0 :(得分:1)

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

How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops

现在,根据您的具体要求,尝试以下模式:

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

它适用于您的精确示例,但如果您需要输入字符串更一般,则可能需要修改模式。

一些解释:
\ D *将匹配一个或多个非数字文本字符("字母字符")
\ s +将匹配至少一个空格字符
\ d *将匹配一个或多个数字
(括号)用于分组结果集,所以我用它们来包围你想从输入字符串中提取的内容。

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

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

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

https://regex101.com/

这是您编辑的要求的解决方案:

  1. 在VBA编辑器中,转到tools =>引用,找到并选中" Microsoft VBScript正则表达式5.5"旁边的复选框,按确定

  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
    

答案 1 :(得分:0)

你可能在特定的细胞中有这个公式,对吧?我认为以下应该做:

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

只需将“yourcell”替换为您具有公式的单元格编号。例如,如果您在单元格A1中使用它,则应为Range("A1")