【问题标题】:VBA splicing cells separated by comma用逗号分隔的 VBA 拼接单元格
【发布时间】:2012-08-29 01:29:40
【问题描述】:

我对 VBA 编码真的很陌生。

我遇到的问题是:

B60、D60、F60、H60(等)单元格在此格式中具有不同的值:x、y、z (x、y 和 z 可以是数字 0-10) 我想把它拼接成:

B60 = x
B61 = y
B62 = z
D60 = x2
D61 = y2
D62 = z2

等等

我找到了这段代码:

Dim objRegex
Dim Z
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
Z = Range([a1], Cells(Rows.Count, "b").End(xlUp)).Value2
ReDim Y(1 To 2, 1 To 1000)
For lngRow = 1 To UBound(Z, 1)
'Split each string by ","
tempArr = Split(Z(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) = Z(lngRow, 1)
Y(2, lngCnt) = objRegex.Replace(strArr, "$1")
Next
Next lngRow
'Dump the re-ordered range to columns C:D
[a1].Resize(lngCnt, 2).Value2 = Application.Transpose(Y)

但这并不适合我。我只需要第 60 行就可以做到这一点。我真的尝试过编辑这段代码,但我什么都不懂……有人可以帮帮我吗?非常感谢。

【问题讨论】:

    标签: excel vba row splice


    【解决方案1】:

    这将为您解决问题。仅适用于第 60 行,不会覆盖现有值,因此您可以检查准确性。仅适用于每个单元格中的 3 个逗号分隔值。

    'Required declaration for the arrays to be 0-based in VBA.
    Option Base 0
    
    'Routine to split out the values and place them vertically under the original cell.
    Sub SplitItOut()
        'Variable to hold the contents of the cell in question.
        Dim contents
        'Column number of the column to start searching for data in.
        Dim startColumn As Integer
        'Counter variable used to keep track of the current column.
        Dim columnCounter As Integer
        'Array to store the comma-separated values in, after they have been separated from their commas.
        Dim numArray() As String
        Dim i As Integer
    
        columnCounter = 0
    
        'Starting column is 2 which is "B".
        startColumn = 2
        'Read in the initial contents of "B60". Cells function is using (row 60, column 2) style notation.
        contents = Cells(60, startColumn).Value
    
        'Keep looping until there is nothing but an empty string in the contents variable.
        Do While contents <> ""
            'Split out the numbers in the cell and store them in an array.
            numArray = Split(contents, ",", -1)
            'Loop through the 3 entries in the array.
            For i = 0 To 2
                'Place each entry in successive rows below the original cell.
                'The Trim function is used to remove any potential extra spaces from the number.
                Cells(61 + i, startColumn + columnCounter).Value = Trim(numArray(i))
            Next
            'Move to the next column.
            columnCounter = columnCounter + 1
            'Read in its contents.
            contents = Cells(60, startColumn + columnCounter).Value
            'If the contents are empty, move to the next column.
            If contents = "" Then
                columnCounter = columnCounter + 1
            End If
            'If the next column is also empty, the loop will exit, otherwise it will continue with the new contents of the current column.
            contents = Cells(60, startColumn + columnCounter).Value
        Loop
    End Sub
    

    如果每个单元格中有不同数量的逗号分隔值,则需要更改行:

    For i = 0 To 2
    

    For i = 0 to Ubound(numArray)
    

    编辑

    修复了在每列数据之间使用 1 个空白列的代码。

    【讨论】:

    • 在您的代码中添加一些 cmets 肯定会对 OP 有所帮助(特别是如果他不太了解他找到的代码),那么您的答案肯定值得投票
    • 哇,我几乎明白没有你的 cmets 的代码意味着什么。添加 cmets 后,您所做的一切就变得非常清楚了。我试过了,效果很好!我唯一改变的是 columncounter + 1 到 columncounter + 2,因为我每次都跳过 1 列(此列不是空的,但有不同的数据)。非常感谢,绝对很有帮助。
    • @user1646031 很高兴能提供帮助。您可以通过单击复选标记将此答案标记为“已接受”答案。欢迎使用 *。
    • @Stewbob:excel 用户感谢您的注释代码。你让世界变得更美好 :D - 为编辑和评论代码点赞
    • @Stewbob。我希望你不介意我用另一个(也许很简单的)问题来打扰你。有时 2 列是空的,但数据在这 2 个空列之后继续。但是,循环将停止。我试图将最后一列定义为 finalCol = Cells(1, Columns.Count).End(xlToLeft).Column 但很难将其集成到您的代码中。