【问题标题】:Copying rows from one listobject to another using Excel VBA使用 Excel VBA 将行从一个列表对象复制到另一个
【发布时间】:2013-11-20 13:25:23
【问题描述】:

我想创建一段 VBA 代码,它将从 ListObject 中选择前 10 行,然后将它们粘贴到另一个 ListObject 中。将一组行复制到新工作表后,将对其进行处理,然后选择并处理接下来的 10 行,依此类推。

我可以使用标准的 VBA 函数来实现这一点,但我想使用 ListObject 来实现这一点,即

Sub PopulateSectionOfData()

    Dim loInput As ListObject
    Dim loOutput As ListObject
    Dim intNumOfColumns As Integer
    Dim rngToCopy As Range
    Dim intRowsInFile As Integer

    ' Create the inout and output ListObjects
    Set loInput = Worksheets(WS_INPUT).ListObjects(LO_INPUT)
    Set loOutput = Worksheets(WS_OUTPUT).ListObjects(LO_OUTPUT)

    ' Delete all the current rows from the output table
    Worksheets(WS_OUTPUT).ListObjects(LO_OUTPUT).DataBodyRange.Delete

    ' Set variables
    intNumOfColumns = loInput.ListColumns.Count
    WorkbookCounter = 1
    intRowsInFile = 10                   ' Select 10 records at a time

    ' Get 10 records at a time from the input file
    For i = 1 To loInput.DataBodyRange.Rows.Count Step intRowsInFile - 1

        '???? - This is the area that i am unsure on
        Set rngToCopy = loInput.DataBodyRange(p, 1)
        rngToCopy.Copy loOutput

        '????

        ' TODO - Add further processing here
    Next i

    ' Clear used objects
    Set loInput = Nothing
    Set loOutput = Nothing

End Sub

如果我想使用 ListObjects,我们将不胜感激任何关于此问题的帮助

提前谢谢你

【问题讨论】:

    标签: excel vba listobject


    【解决方案1】:

    DataBodyRange指的是表中的实际行列范围。如果表格中没有行(这是您执行DataBodyRange.Delete后的情况,您需要先在表格中添加一行;然后,您可以将数据复制并粘贴到该行中,Excel会相应地展开表格

    您的for 循环可以更新为如下所示:

    For i = 1 To loInput.DataBodyRange.Rows.Count Step intRowsInFile - 1
    
        ' First add a blank row to the table
        loOutput.ListRows.Add
    
        ' Check that 10 rows are available in the input table
        ' (Done to avoid adding blank rows to the output table)
        If i + 9 > loInput.DataBodyRange.Rows.Count Then
            loInput.DataBodyRange.Rows(i & ":" & loInput.DataBodyRange.Rows.Count) _
                .Copy loOutput.DataBodyRange.Rows(i)
        Else
            loInput.DataBodyRange.Rows(i & ":" & i + 9).Copy loOutput
        End If
    Next i
    

    【讨论】:

    • 这太棒了,谢谢。我知道可以通过某种方式完成,只是没有您的专业知识。非常感谢您的帮助和及时回复。
    • 我现在已经使用了一些生产数据的解决方案,而不是 A1、B1 等,但现在解决方案失败了!而不是将一批记录写入新工作表,而是覆盖现有信息。数据中是否有我应该关注的字符?生产数据中的字符只是字母数字,所以不确定是什么问题。您可以提供的任何帮助将不胜感激,因为我没有任何线索!
    • 这段代码有一些假设。一是数据跨列是连续的。例如,如果第一行是“A(空白)B”,第二行是“A B C”,那么第一行的结果将是“A A B C”,因为第一行中的连续数据以“A”停止
    • 感谢您的回复。我做了一些进一步的调查,数据似乎没有问题,因为我已经通过一次添加一行来测试这一点,然后进行处理,直到达到第 19 条记录为止!将 19 条记录用作输入后,新工作表中只会显示最后一组记录。我已将第 19 条记录的内容更改为与成功处理的其他记录相同,但错误一直出现,有什么想法吗?
    • 我已经解决了这个问题。我在 else 语句中添加了 .DataBodyRange.Rows(i) ,它工作正常。感谢您对此事的所有帮助
    【解决方案2】:

    请记住,“DataBodyRange”返回一个范围。这样做:

    'copies entire line 1 from "loInput" to "loOutput" on line 2
    loOutput.DataBodyRange.Rows(2) = loInput.DataBodyRange.Rows(1)
    

    另外,只需做一个 FOR 来处理其余部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多