Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2738|回复: 5

能用VBA的正则表达式解决吗

[复制链接]
发表于 2019-7-19 11:22 | 显示全部楼层 |阅读模式
A列是原始数据,需要将A列的数据分割到B、C、D、E、F列中来,B2:F2是示例,我原来是用函数解决的,可是因为数据量大了之后,影响表格运行速度,想请教一下用VBA的正则表达式如何解决。
问题.rar (7.55 KB, 下载次数: 13)
发表于 2019-7-19 17:59 | 显示全部楼层
Sub test()
    Range("b:f").Clear
    With Range("a:a")
        .Replace "g", "/"
        .Replace "×", "/"
        .Replace "-", "/"
        .Replace "g", "/"
        .TextToColumns Destination:=[b1], DataType:=xlDelimited, ConsecutiveDelimiter:=True, other:=True, OtherChar:="/"
    End With

    Columns("e:f").Cut
    Columns("b").Insert
    [b1:f1] = Array("物料名称", "等级", "克重", "宽", "长")
    Columns("b:f").AutoFit
End Sub



如果能用,就用简单的代码

回复

使用道具 举报

 楼主| 发表于 2019-7-20 08:54 | 显示全部楼层
本帖最后由 阿利 于 2019-7-20 09:07 编辑

的确是简单,可是我看不懂

需要继续学习啊

用F8看了一下,原来是先把A列的“g”、“×”,“-”,“/”全部替换成“/”,再用“/”顺序分列,再用剪切,插入调好顺序。
只是这一段代码没学过,得努力学习哇  .TextToColumns Destination:=[b1], DataType:=xlDelimited, ConsecutiveDelimiter:=True, other:=True, OtherChar:="/"

不过A列的数据最好还是需要恢复到原来的格式,因为这列的数据还跟其他的表格相关的
回复

使用道具 举报

发表于 2019-7-20 10:02 | 显示全部楼层
Option Explicit
Sub test()
Dim ar, br, i&, t, m, p
ar = [a1].CurrentRegion.Resize(, 6)
For i = 2 To UBound(ar)
    br = Split(ar(i, 1), "-")
    t = Split(br(0), "g")
    m = Split(br(1), "/")
    p = Split(t(1), "×")
    ar(i, 2) = m(0)
    ar(i, 3) = m(1)
    ar(i, 4) = t(0)
    ar(i, 5) = p(0)
    ar(i, 6) = p(1)
Next
[a1].CurrentRegion.Resize(, 6) = ar
End Sub
回复

使用道具 举报

发表于 2019-7-20 14:05 | 显示全部楼层
Sub kk()
    Dim regx As Object
    Dim brr(), arr()
    Set regx = CreateObject("vbscript.RegExp")
    With regx
        .Global = True
        .Pattern = "(\d+)"
    End With
    irow = Sheet1.Cells(Rows.Count, 1).End(3).Row
    arr = Sheet1.Range("a2:a" & irow)
    ReDim brr(1 To UBound(arr), 1 To 5)
    For i = 1 To UBound(arr)
        ar = Split(arr(i, 1), "-")
        Set mat = regx.Execute(ar(0))
        ar_split = Split(ar(1), "/")
        n = n + 1
        brr(n, 1) = ar_split(0)
        brr(n, 2) = ar_split(1)
        brr(n, 3) = mat(0).SubMatches(0)
        brr(n, 4) = mat(1).SubMatches(0)
        brr(n, 5) = mat(2).SubMatches(0)
    Next i
    With Sheet1
        .Range("b2").Resize(n, 5) = brr
    End With
End Sub
回复

使用道具 举报

发表于 2019-7-22 13:52 | 显示全部楼层
几次分列就好了。用替换也行。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 23:08 , Processed in 0.447057 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表