按自定义分隔符在单元格中拆分值
我在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()应用于带有分隔符格式的数据?
- 拆分()使用分隔符作为分隔符
- 删除尾部的虚假空元素
- join()使用分隔符作为分隔符
- 附加分隔符
在代码中:
>> 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 >>