【问题标题】:Concatenate Columns Of Data连接数据列
【发布时间】:2016-04-22 04:36:35
【问题描述】:

*编辑添加:我收到的当前错误。截图见本帖底部。

我在 D 列中有文本。宏应该找到空白单元格,然后将其下方所有单元格中的文本连接起来。

示例

从 D2 开始的文本,显示如下...

Blank Cell
SampleText1
SampleText2
SampleText3
Blank Cell
SampleText4
SampleText5
SampleText6

应该在 D2 中显示文本...

SampleText1, SampleText2, SampleText3

然后在 D6 中,像这样......

SampleText4, SampleText5, SampleText6

..等等。

这只需要在 D 列中起作用,所以我猜我可以将它写入该范围。

我遇到的最接近的答案在这里: Excel Macro to concatenate

这是我目前正在使用的代码...

Sub ConcatColumns()

   Do While ActiveCell <> ""  'Loops until the active cell is blank.

      'The "&" must have a space on both sides or it will be
      'treated as a variable type of long integer.

      ActiveCell.Offset(0, 1).FormulaR1C1 = _
         ActiveCell.Offset(0, -1) & " " & ActiveCell.Offset(0, 0)

      ActiveCell.Offset(1, 0).Select
   Loop

End Sub

编辑:现在使用来自@jeeped 的优秀代码,但收到错误,如下图所示

【问题讨论】:

    标签: vba excel concatenation


    【解决方案1】:

    从底部开始,逐步构建字符串数组。当您到达一个空白单元格时,Join 使用您喜欢的分隔符的字符串。

    Sub build_StringLists()
        Dim rw As Long, v As Long, vTMP As Variant, vSTRs() As Variant
        Dim bReversedOrder As Boolean, dDeleteSourceRows As Boolean
        ReDim vSTRs(0)
    
        bReversedOrder = False
        dDeleteSourceRows = True
    
        With Worksheets("Sheet4")
            For rw = .Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
                If IsEmpty(.Cells(rw, 1)) Then
                    ReDim Preserve vSTRs(0 To UBound(vSTRs) - 1)
                    If Not bReversedOrder Then
                        For v = LBound(vSTRs) To UBound(vSTRs) / 2
                            vTMP = vSTRs(UBound(vSTRs) - v)
                            vSTRs(UBound(vSTRs) - v) = vSTRs(v)
                            vSTRs(v) = vTMP
                        Next v
                    End If
                    .Cells(rw, 1) = Join(vSTRs, ", ")
                    .Cells(rw, 1).Font.Color = vbBlue
                    If dDeleteSourceRows  Then _
                        .Cells(rw, 1).Offset(1, 0).Resize(UBound(vSTRs) + 1, 1).EntireRow.Delete
                    ReDim vSTRs(0)
                Else
                    vSTRs(UBound(vSTRs)) = .Cells(rw, 1).Value2
                    ReDim Preserve vSTRs(0 To UBound(vSTRs) + 1)
                End If
            Next rw
        End With
    
    End Sub
    

    我留下了用于反转字符串列表以及删除原始字符串行的选项。

          
                在 build_StringLists 过程之前

          
                在 build_StringLists 程序之后

    【讨论】:

    • 这看起来很棒,非常感谢!你甚至预料到我需要在之后删除这些行!实施中的一个问题——我需要改变什么?我尝试仅修改对工作表的引用(即将“With Worksheets(“Sheet4”)”更改为我的工作表名称),但我得到“下标超出范围(错误 9)”。显然这意味着我引用了一些不包括在内的东西,但我在 VBA 方面不够熟练,无法在这里修改你的精彩代码:) 出于我的需要,它将在单元格 D2 - D39998 上运行。
    • 另外,当我在处理这个问题时,您说您留下了用于反转和删除的选项 - 我需要更改哪些内容才能实现删除部分?我已经编写了其他代码,在此之前我已经完成了,但是如果您可以一步完成,我更愿意这样做!再次,谢谢你。这正是我所需要的,而且您的反应非常迅速!
    • ①查看Range.Cells property了解如何更改行和列。 ②查看bReversedOrderdDeleteSourceRows这两个布尔变量来开启和关闭选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2018-12-10
    • 2020-04-08
    • 1970-01-01
    • 2015-11-16
    • 2021-11-07
    相关资源
    最近更新 更多