【问题标题】:Split comma separated entries to new rows [closed]将逗号分隔的条目拆分为新行[关闭]
【发布时间】:2012-01-23 13:07:50
【问题描述】:

我目前在工作表中有这些数据

Col A   Col B
1       angry birds, gaming
2       nirvana,rock,band

我想要做的是拆分第二列中的逗号分隔条目并插入新行,如下所示:

Col A   Col B
1   angry birds
1   gaming
2   nirvana
2   rock
2   band

我确信这可以使用 VBA 完成,但我自己无法解决。

【问题讨论】:

  • 您是尝试就地执行此操作还是可以使用新工作表?
  • 到目前为止你试过了吗?什么有效?什么没有?
  • 逗号后面的空格怎么办?它总是在那里吗?
  • @KannanS 该链接中的代码并不太漂亮-接受的答案在范围循环内使用Select 和InStr 进行重新剪切,第二个是其中最好的它使用数组,但它连接到一个很长的字符串预输出,第三个不会编译。最后没有人在这里完成所需的任务(其中有 A 列要处理)

标签: vba excel


【解决方案1】:

将您的数据放入 A 列,并将结果放入 C 列。

Sub SplitAll()
    Dim src As Range
    Dim result As Variant
    For Each src In Range("A:A").SpecialCells(xlCellTypeConstants)
        result = Split(src, ",")
        'last cell in column C
        With Cells(Rows.Count, 3).End(xlUp)
            Range(.Offset(1, 0), .Offset(1 + UBound(result, 1), 0)) = Application.WorksheetFunction.Transpose(result)
        End With
    Next src
End Sub

【讨论】:

  • 哎呀,我刚刚看到 Kannan S 提供的链接。看起来我白费力气。无论如何我的代码更短:-))
  • 是的 - 您的代码仅拆分 A 列 ..... 但要处理的数据是 B 列(以 A 作为标记)它是两列输出。 :)
  • 至少对于 redGREENblue 来说这是一个不错的小练习 ;-)
  • 像魅力一样工作。非常感谢
【解决方案2】:

最好使用变体数组而不是单元循环 - 一旦数据集有意义,它们在代码方面会更快。即使代码更长:)

下面的示例转储到 C 和 D 列,以便您可以查看原始数据。 将 [c1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y) 更改为 [a1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y) 以转储您的原始数据

[更新了正则表达式以删除, 之后的所有空格,即“, band”变为“band”]

Sub SliceNDice() 
Dim objRegex As Object 
Dim X 
Dim Y 
Dim lngRow As Long 
Dim lngCnt As Long 
Dim tempArr() As String 
Dim strArr 
Set objRegex = CreateObject("vbscript.regexp") 
objRegex.Pattern = "^\s+(.+?)$" 
 'Define the range to be analysed
X = Range([a1], Cells(Rows.Count, "b").End(xlUp)).Value2 
Redim Y(1 To 2, 1 To 1000) 
For lngRow = 1 To UBound(X, 1) 
     'Split each string by ","
    tempArr = Split(X(lngRow, 2), ",") 
    For Each strArr In tempArr 
        lngCnt = lngCnt + 1 
         'Add another 1000 records to resorted array every 1000 records
        If lngCnt Mod 1000 = 0 Then Redim Preserve Y(1 To 2, 1 To lngCnt + 1000) 
        Y(1, lngCnt) = X(lngRow, 1) 
        Y(2, lngCnt) = objRegex.Replace(strArr, "$1") 
    Next 
Next lngRow 
 'Dump the re-ordered range to columns C:D
[c1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y) 
End Sub 

【讨论】:

  • +1 很酷的代码。好一个人。如果可能,请删除逗号后面的空格。再次,干得好。
  • @kannans thx 和很好的建议,因为提问者没有回答关于数据布局提出的查询,我将添加您提出的改进建议
  • +1。优秀。 VU 使用正则表达式。
  • 刚刚在我自己的一个非常相似的问题上运行了这个。完美地工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多