Excel·VBA分列、字符串拆分

看到一篇博客《VBA,用VBA进行分列(拆分列)的2种方法》,使用VBA对字符串进行拆分

目录

Excel分列功能

vbnet 复制代码
Sub 测试1()
    Range("a:a").TextToColumns other:=True, otherchar:=";"
End Sub

代码运行可以将左边拆分为右边,但分隔符只能有1个

将字符串拆分为二维数组,Split函数

分隔符只能有2个,且分隔符是有顺序的,具体看举例

vbnet 复制代码
Function str_split2d(ByVal source_str$, ByVal delimiter)
    'delimiter为分隔符数组,只能有2个元素;source_str按分隔符拆分为二维数组(数组从1开始计数)
    Dim s1$, s2$, srr, res, result, s, t, i&, j&, max_c&
    If UBound(delimiter) - LBound(delimiter) <> 1 Then Debug.Print "参数错误": Exit Function
    s1 = delimiter(LBound(delimiter)): s2 = delimiter(UBound(delimiter))
    srr = Split(source_str, s1): ReDim res(1 To UBound(srr) - LBound(srr) + 1, 1 To 10 ^ 3)
    For Each s In srr
        temp = Split(s, s2): i = i + 1: j = 0
        For Each t In temp
            j = j + 1: res(i, j) = t
        Next
        If j > max_c Then max_c = j
    Next
    ReDim result(1 To i, 1 To max_c)  '结果数组
    For i = 1 To UBound(res)
        For j = 1 To max_c
            result(i, j) = res(i, j)
        Next
    Next
    str_split2d = result
End Function

举例

vbnet 复制代码
Sub 测试2()
    Dim res
    res = str_split2d([a1], Array(";", ","))
    [d1].Resize(UBound(res), UBound(res, 2)) = res
End Sub

将字符串拆分为一维数组,正则表达式

Split函数虽然能够拆分字符串,但是如果分隔符数量较多,那么就需要不断循环遍历分隔符,对拆分后的字符串继续进行拆分,这显然是比较麻烦的

而正则表达式是处理字符串的强大工具,对于处理多个分隔符,代码较为简单

更多关于正则表达式内容详见,《Excel·VBA自定义正则表达式函数、使用》

vbnet 复制代码
Function 正则拆分字符串(ByVal source_str$, ByVal delimiter$)
    'delimiter为分隔符,source_str按分隔符拆分为一维数组(数组从1开始计数)
    Dim pat$, result, i&, num&
    pat = "[^" & delimiter & "]+"  '正则匹配模式,^非
    With CreateObject("vbscript.regexp")  '正则表达式
        .Global = True
        .Pattern = pat
        Set mhs = .Execute(source_str): num = mhs.Count
        If num = 0 Then 正则拆分字符串 = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Array(source_str))): Exit Function
        ReDim result(1 To num)
        For i = 0 To num - 1
            result(i + 1) = mhs(i).Value
        Next
        正则拆分字符串 = result
    End With
End Function

举例

vbnet 复制代码
Sub 测试3()
    Dim res
    res = 正则拆分字符串([a1], ",;")
    [a3].Resize(UBound(res), 1) = WorksheetFunction.Transpose(res)
    res = 正则拆分字符串([d1], ",;|")
    [d3].Resize(UBound(res), 1) = WorksheetFunction.Transpose(res)
End Sub
相关推荐
FL16238631292 天前
[windows工具]PDFOCR识别导出Excel工具1.1版本使用教程及注意事项
windows·excel
Lauren_Lu2 天前
如何在 ArcGIS 中使用 Microsoft Excel 文件_20250614
microsoft·arcgis·excel
叶 落2 天前
[Java 基础]正则表达式
java·正则表达式·java 基础
勇太的数分之旅2 天前
Excel大厂自动化报表实战(互联网金融-数据分析周报制作下)
信息可视化·金融·数据分析·自动化·excel·数据可视化
Channing Lewis3 天前
sharepoint 共享excel,如何实现某个 sheet 别人只读,但是另一个 sheet 可以编辑
excel·sharepoint
霸王蟹4 天前
前端项目Excel数据导出同时出现中英文表头错乱情况解决方案。
笔记·学习·typescript·excel·vue3·react·vite
开开心心就好4 天前
高效账号信息管理工具,可安全随机生成密码
javascript·安全·docker·智能手机·pdf·word·excel
勇太的数分之旅4 天前
Excel大厂自动化报表实战(互联网金融-数据分析周报制作上)
金融·数据分析·自动化·excel·数据可视化
勇太的数分之旅4 天前
Excel大厂自动化报表实战(互联网金融-数据分析周报制作中)
金融·数据分析·自动化·excel·数据可视化
一晌小贪欢4 天前
【Python办公】使用pandas批量读取csv保存为Excel
python·excel·pandas·读取excel·python办公·excel转csv