组合特定表列

时间:2018-03-28 02:24:14

标签: excel vba excel-vba

我希望将列标题指定的表中的特定列组合到表外的一列中。到目前为止,我有下面的脚本可以正常工作,除了它只组合相邻的列,列号是静态的。

我想开发脚本,以便它可以使用基于列标题名称的非连续范围。我打算使用帮助列列出要合并的列标题。下面的屏幕截图显示了一个示例,其中在帮助列H中列出了三个列标题(实际上列出的列标题的数量会有所不同),并且基于此,这些列中的数据已合并在列中形成新的合并列表J.由于早期版本的Excel,我希望使用 VBA 而不是 Power Query 来实现这一目标。

enter image description here

Sub combine()

Dim LR As Long, i As Long

For i = 1 To 6
    LR = Cells(Rows.Count, i).End(xlUp).Row
    Range(Cells(2, i), Cells(LR, i)).Copy _
        Destination:=Cells(Rows.Count, 10).End(xlUp).Offset(1)
Next i

End Sub

2 个答案:

答案 0 :(得分:2)

如果设置源表,可以尝试此操作 先决条件:创建(3)个表,名为 RawData Helper Combined
其中:

  • RawData 是您的数据所在
  • Helper (单个列表)是您要合并的标题列表
  • 合并(单个列表)是所选列中的合并项目列表
Sub terrain()
    Dim rD As ListObject, cT As ListObject, hT As ListObject
    Dim c As Range

    With Sheet1 '/* change to your actual sheet name or sheet code name */

        Set rD = .ListObjects("RawData")
        Set cT = .ListObjects("Combined")
        Set hT = .ListObjects("Helper")

        With rD
            On Error Resume Next
            cT.DataBodyRange.Delete xlUp
            On Error GoTo 0

            If Not hT.DataBodyRange Is Nothing Then
                For Each c In hT.DataBodyRange
                    If cT.DataBodyRange Is Nothing Then
                        On Error Resume Next
                        .ListColumns(c.Value2).DataBodyRange. _
                        SpecialCells(xlCellTypeConstants).Copy _
                        cT.HeaderRowRange.Offset(1, 0)
                        On Error GoTo 0
                    Else
                        On Error Resume Next
                        .ListColumns(c.Value2).DataBodyRange. _
                        SpecialCells(xlCellTypeConstants).Copy _
                        cT.DataBodyRange.Range("A" & cT.ListRows.Count + 1)
                        On Error GoTo 0
                    End If
                Next
            End If
        End With

    End With

End Sub

但是,如果您在 Helper 表中提供的列名称不存在,则会导致Subcript out of range错误。我所做的并不是那么整洁地用On Error Resume NextOn Error Goto 0包围复制部分。

答案 1 :(得分:0)

你的问题很有趣,但这很大程度上没有经过考验,因为坦率地说,我有更多的事情要处理时间,而不是从图像中重新输入样本数据。令人高兴的是,它确实编译了。好吧,只要你从我的图像中重新输入代码,它就会编译。

enter image description here