加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ExcelVBA正则表达式-取不规则文本

(2014-04-19 21:49:24)
标签:

excel

vba

正则表达式

教育

分类: ExcelVBA

http://s11/mw690/001f8HsBzy6IeAIQtjc3a&690

自定义函数:

Public Function 取不规则的文本(rng As Range, i As Integer)

    Dim Mat As Object

    With CreateObject("Vbscript.Regexp")

        .Global = True    'Global属性:查找范围:True全部查找,False只查找第1个,默认False

        .MultiLine = True    '匹配多行为True

        .IgnoreCase = False    '如果赋值为True不区分大小写,如果赋值为False或者不写,就区分大小写

        .Pattern = "([一-龢]+)([A-Za-z] .+)"    'Pattern属性:书写正则表达式,默认为"

        Set Mat = .Execute(rng)   'Execute方法:返回匹配成功的结果,是一个对象

        If i > Mat(0).SubMatches.Count Then

            取不规则的文本 = ""

        Else

            取不规则的文本 = Mat(0).SubMatches(i - 1)

        End If

    End With

End Function

正则的Sub过程:

 

Public Sub 取不规则的文本2()

    Dim Mat As Object, Arr, Brr, i As Long

    Arr = Range("A5:A" & Cells(Rows.Count, 1).End(xlUp).Row).Value

    ReDim Brr(1 To UBound(Arr), 1 To 2)

    With CreateObject("Vbscript.Regexp")

        .Global = True    'Global属性:查找范围:True全部查找,False只查找第1个,默认False

        .MultiLine = True    '匹配多行为True

        .IgnoreCase = False    '如果赋值为True不区分大小写,如果赋值为False或者不写,就区分大小写

        .Pattern = "([一-龢]+)([A-Za-z] .+)"    'Pattern属性:书写正则表达式

        For i = 1 To UBound(Arr)

            Set Mat = .Execute(Arr(i, 1))  'Execute方法:返回匹配成功的结果,是一个对象

            Brr(i, 1) = Mat(0).SubMatches(0)

            Brr(i, 2) = Mat(0).SubMatches(1)

        Next

    End With

    Range("C5").Resize(UBound(Arr), 2) = Brr

End Sub



函数公式解法如下:

=LEFT(A5,SEARCHB("?",A5)/2)

=SUBSTITUTE(A5,C5,)



A5开始单元格内容:

东疆港金融A SLX-05(MD)

烟草二期A SLX-05(MD)

烟草二期A SLX-10(MD)

东疆港金融A SLX-13(5)MD

东疆港金融A SLX-1-2(MD)G

东疆港金融A SLX-1-2(MD)

天娇园工地C 护栏  1.2米

天娇园工地C 旗杆

天娇园工地D 双层床

天娇园工地D 花饰大门

天娇园工地D 警卫室

东疆港金融A 120平方电缆线

大港工地A 洒水车

大港工地D 双层床

大港工地D 电闸箱护栏 1.2*2

东疆港金融C 彩板

东疆港金融C 护栏  1.5米

东疆港金融C 集装箱

东疆港金融D 双层床

东疆港金融D 电闸箱护栏 1.2*2

东疆港金融D 电闸箱护栏 1.2*3


普通Sub过程的解法:

Sub 循环配合Like()

    Dim Arr, i As Long, j As Long, Brr

    Arr = Range("A5:A" & Cells(Rows.Count, 1).End(xlUp).Row).Value

    ReDim Brr(1 To UBound(Arr), 1 To 2)

    For i = 1 To UBound(Arr)

        For j = 1 To Len(Arr(i, 1))

            If Mid(Arr(i, 1), j, 1) Like "[A-Za-z]" Then

                Brr(i, 1) = Mid(Arr(i, 1), 1, j - 1)

                Brr(i, 2) = Mid(Arr(i, 1), j)

                Exit For

            End If

        Next

    Next

    Range("C5").Resize(UBound(Arr), 2) = Brr

End Sub

或:

Sub Test()

    Dim Arr, i As Long, j As Long, Brr

    Arr = Range("A5:A" & Cells(Rows.Count, 1).End(xlUp).Row).Value

    ReDim Brr(1 To UBound(Arr), 1 To 2)

    For i = 1 To UBound(Arr)

        For j = 1 To Len(Arr(i, 1))

            If Mid(Arr(i, 1), j, 1) <= "Z" Then

                Brr(i, 1) = Mid(Arr(i, 1), 1, j - 1)

                Brr(i, 2) = Mid(Arr(i, 1), j)

                Exit For

            End If

        Next

    Next

    Range("C5").Resize(UBound(Arr), 2) = Brr

End Sub


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有