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
相关推荐
DS随心转APP1 天前
AI 一键导出 Word 与 Excel 实战应用指南
人工智能·ai·word·excel·deepseek·ai导出鸭
之歆2 天前
Day24_JavaScript正则表达式与性能优化实战:从入门到精通
javascript·性能优化·正则表达式
spencer_tseng2 天前
excel 2003 [Cell division function]
excel·office
开开心心就好2 天前
小白友好的程序联网封锁实用工具
windows·eureka·计算机外设·rabbitmq·word·excel·csdn开发云
SunnyDays10112 天前
Python操作Excel批注:从基础添加到高级自定义的完整指南
开发语言·python·excel
Eiceblue2 天前
Python 操作 Excel:数据分组、分类汇总与取消分组全解
开发语言·python·excel
城数派2 天前
2026年500米分辨率DEM地形数据(全球/全国/分省/分市)
数据库·arcgis·信息可视化·数据分析·excel
SunnyDays10112 天前
Python 操作 Excel 超链接:添加网页、文件、工作表和图片链接
python·excel
专注VB编程开发20年3 天前
我制作excel工作簿的选项卡,发给deep seek, 昨天修改了一天
前端·vue.js·excel
羑悻的小杀马特3 天前
【动态规划篇】正则表达式与通配符:开启代码匹配的赛博奇幻之旅
c++·算法·leetcode·正则表达式