按自定义分隔符在单元格中拆分值

我在Excel中有一个单元格中的以下数据

Pankaj sharma;#234;#khushal verma;#786;#parul datta;#456;# 

我想用VBA把它转换成这个:

 pankaj sharma khushal verma 

来自OP评论的代码:

 Sub test1() Dim rng As Range Dim InputRng As Range, OutRng As Range xTitleId = "KutoolsforExcel" Set InputRng = Application.Selection.Range("F3") Set InputRng = Application.InputBox("Range(single cell) :", xTitleId, InputRng.Address, Type:=8) Set OutRng = Application.InputBox("Out put to (single cell):", xTitleId, Type:=8) Arr = VBA.Split(InputRng.Range("A1").Value, ";#",-1,1) OutRng.Resize(UBound(Arr) - LBound(Arr) + 1).Value = Application.Transpose(Arr) End Sub 

这里有两个基于你的代码的实现。

第一个使用Split

 Sub TestSplit() Dim Arr() As String Dim Res() As String Dim m As Long, i As Long Dim InputRng As Range, OutRng As Range Dim xTitleId As String xTitleId = "KutoolsforExcel" Set InputRng = Application.Selection.Range("F3") Set InputRng = Application.InputBox("Range (single cell) :", xTitleId, InputRng.Address, Type:=8) Set OutRng = Application.InputBox("Out put to (single cell):", xTitleId, Type:=8) Arr = VBA.Split(InputRng.Range("A1").Value, ";#", -1, 1) m = UBound(Arr) \ 2 ReDim Preserve Res(m) For i = 0 To m Res(i) = Arr(i * 2) Next OutRng.Resize(UBound(Res) - LBound(Res) + 1).Value = Application.Transpose(Res) End Sub 

第二个是VBScript.RegExp

 Sub TestRegExp() Dim oMatch As Object Dim InputRng As Range, OutRng As Range Dim xTitleId As String xTitleId = "KutoolsforExcel" Set InputRng = Application.Selection.Range("F3") Set InputRng = Application.InputBox("Range (single cell) :", xTitleId, InputRng.Address, Type:=8) Set OutRng = Application.InputBox("Out put to (single cell):", xTitleId, Type:=8) With CreateObject("VBScript.RegExp") .Global = True .Pattern = "([\s\S]*?);#\d{3,3};#" For Each oMatch In .Execute(InputRng.Range("A1").Value) OutRng.Cells(1, 1).Value = oMatch.SubMatches(0) Set OutRng = OutRng.Offset(1, 0) Next End With End Sub 

用于简单parsing/格式化的标准VBScript工具Split()和Join()使用分隔符而不是分隔符。 区别:如果“;#”是分隔符,则该行

 "pankaj sharma;#234;#khushal verma;#786;#parul datta;#456;#" 

包含最后一个为空的7个元素。 规则:n个分隔符分隔n + 1个元素。 如果将“;#”看作分隔符,则该行中有6个元素。 规则:n分隔符分隔n个元素。

您的数据是结构化的 – 不仅仅是一个元素列表,而是一个列表(每个都包含一个名字(?)和一个数字)。 这意味着:该行应该代表3对元素,“;#”必须是分隔符。

如何将Split()/ Join()应用于带有分隔符格式的数据?

  1. 拆分()使用分隔符作为分隔符
  2. 删除尾部的虚假空元素
  3. join()使用分隔符作为分隔符
  4. 附加分隔符

在代码中:

 >> s0 = "pankaj sharma;#234;#khushal verma;#786;#parul datta;#456;#" >> a = Split(s0, ";#") >> WScript.Echo ">" & Join(a, "|") & "<" >> ReDim Preserve a(UBound(a) - 1) >> s1 = Join(a, ";#") >> WScript.Echo s1 >> s1 = s1 & ";#" >> WScript.Echo s1 >> >pankaj sharma|234|khushal verma|786|parul datta|456|< pankaj sharma;#234;#khushal verma;#786;#parul datta;#456 pankaj sharma;#234;#khushal verma;#786;#parul datta;#456;# >> WScript.Echo CStr(s0 = s1) >> True 

或者,您可以在Split()之前从inputstring中删除尾随分隔符。 更好:从一开始就使用分隔符。

如何处理数据的子结构? 如果有g个n个子元素(例如3组对),则使用n级循环。 在代码中:

 >> For i = 0 To UBound(a) Step 2 >> WScript.Echo a(i) >> WScript.Echo a(i + 1) >> WScript.Echo "----" >> Next >> pankaj sharma 234 ---- khushal verma 786 ---- parul datta 456 ---- >> 

要访问单个元素,请按如下方式计算索引:所需组的基于零的数字* n +所需元素的基于零的数字。 例如,khushal verma的数字元素=> 1 * 2 + 1 = 3:

 >> WScript.Echo a(1 * 2 + 1) >> 786 >>