ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: hnyylx

[求助] 用split将字符串按单个字符拆分到数组,为啥达不到目的?

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-18 16:09 | 显示全部楼层
tanglf188 发表于 2024-4-18 16:04
包含子字符串和分隔符的字符串表达式。 如果expression是零长度字符串 (""),则Split返回空数组,即不包括 ...

请问老师,如何做到将某字符串按照多个指定的分隔字符拆分?
比如:  
str = "one,two;three|four-five"
separators = ",;|-" ' 指定多个分隔符

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-18 16:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
自己搜腾讯的ai解决了,代码供大家参考:

'根据您的需求,以下是使用VBA代码实现的方案:
Function SplitString(inputString As String, delimiters As String) As String()
    ' 定义一个字典对象,用于存储分隔符及其出现的位置
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
   
    ' 定义一个变量,用于存储当前分隔符的位置
    Dim currentPosition As Long
    currentPosition = 1
   
    ' 遍历输入字符串,查找分隔符,并将其位置存储到字典中
    For i = 1 To Len(inputString)
        For j = 1 To Len(delimiters)
            If Mid(inputString, i, 1) = Mid(delimiters, j, 1) Then
                If Not dict.Exists(Mid(delimiters, j, 1)) Then
                    dict.Add Mid(delimiters, j, 1), New Collection
                End If
                dict(Mid(delimiters, j, 1)).Add i
            End If
        Next j
    Next i
   
    ' 定义一个数组,用于存储拆分后的字符串
    Dim result() As String
    ReDim result(dict.Count)
   
    ' 根据分隔符的位置,将字符串拆分,并存储到数组中
    Dim counter As Long
    counter = 0
    currentPosition = 1
    For Each delimiter In dict
        For Each Position In dict(delimiter)
            result(counter) = Mid(inputString, currentPosition, Position - currentPosition)
            counter = counter + 1
            currentPosition = Position + 1
        Next Position
    Next delimiter
   
    ' 返回拆分后的字符串数组
    SplitString = result
End Function

Sub TestSplitString()
    Dim inputString As String
    inputString = "one,two;three|four-five"
   
    Dim delimiters As String
    delimiters = ",;|-"
   
    Dim result() As String
    result = SplitString(inputString, delimiters)
   
    For i = LBound(result) To UBound(result)
        Debug.Print result(i)
    Next i
End Sub
'在这段代码中,我们定义了一个名为`SplitString`的函数,该函数接受两个参数:一个是要拆分的字符串,另一个是包含多个分隔符的字符串。函数的返回值是一个字符串数组,其中包含拆分后的字符串。
'
'我们还定义了一个名为`TestSplitString`的子程序,用于测试`SplitString`函数。在这个子程序中,我们将您提供的示例字符串和分隔符字符串作为参数传递给`SplitString`函数,并将返回的结果打印到控制台。
'
'请注意,这段代码需要在Microsoft Excel或其他支持VBA的应用程序中运行。在运行之前,请确保已经正确设置了引用,以便使用字典对象。如果您在运行过程中遇到任何问题,请随时告诉我。

TA的精华主题

TA的得分主题

发表于 2024-4-18 16:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hnyylx 发表于 2024-4-18 16:09
请问老师,如何做到将某字符串按照多个指定的分隔字符拆分?
比如:  
str = "one,two;three|four-five ...

用循环喽
  1.     s = "one,two;three|four-five"
  2.     separators = ",;|-" ' 指定多个分隔符
  3.     For i = 1 To Len(separators)
  4.         If InStr(s, Mid(separators, i, 1)) Then
  5.             a1 = Split(s, Mid(separators, i, 1))(0)
  6.             If i = Len(separators) Then
  7.                 Debug.Print Split(s, Mid(separators, i, 1))(0)
  8.                 Debug.Print Split(s, Right(separators, 1))(1)
  9.             Else
  10.                 Debug.Print Split(s, Mid(separators, i, 1))(0)
  11.             End If
  12.             s = Split(s, Mid(separators, i, 1))(1)
  13.         End If
  14.     Next
复制代码

TA的精华主题

TA的得分主题

发表于 2024-4-18 17:19 | 显示全部楼层
本帖最后由 tspliu 于 2024-4-18 17:20 编辑
hnyylx 发表于 2024-4-18 16:09
请问老师,如何做到将某字符串按照多个指定的分隔字符拆分?
比如:  
str = "one,two;three|four-five ...

用正则吧,省眼睛


Sub aa()
    Set reg = CreateObject("Vbscript.Regexp")
    Str1 = "one,two;three|four-five"
    reg.Global = True
    reg.Pattern = "[,;|-]"
    s = Split(reg.Replace(Str1, " "), " ")
    Debug.Print s(0), s(1), s(2), s(3)
End Sub


新建位图图像 (4).jpg

TA的精华主题

TA的得分主题

发表于 2024-4-19 09:25 | 显示全部楼层
hnyylx 发表于 2024-4-18 16:09
请问老师,如何做到将某字符串按照多个指定的分隔字符拆分?
比如:  
str = "one,two;three|four-five ...

最简单的办法是把分隔符统一。也可以用正则做。

TA的精华主题

TA的得分主题

发表于 2024-4-19 09:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
正则用\w+即可。
360截图20240419092651998.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-22 13:19 | 显示全部楼层
tspliu 发表于 2024-4-18 17:19
用正则吧,省眼睛

还是正则厉害,简洁又可以做到更具普遍性。谢谢您的指导!
Sub SplitString()
    Set reg = CreateObject("Vbscript.Regexp")
    Str1 = "one,two;three|four-five,six;seven"
    reg.Global = True
    reg.Pattern = "[,;|-]"
    s = Split(reg.Replace(Str1, " "), " ")
    Debug.Print s(0), s(1), s(2), s(3), s(4), s(5)
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-22 13:20 | 显示全部楼层
grf1973 发表于 2024-4-19 09:25
最简单的办法是把分隔符统一。也可以用正则做。

对的,就这个思路。上面老师用这个思路用正则解决了!也谢谢您!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-2 11:58 , Processed in 0.041620 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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