使用VBA和ListObjects将值从一个表复制并粘贴到另一个表

时间:2019-04-04 15:21:31

标签: excel vba

我正在尝试比较两个来源的支出数据:来自用户的精选人工输入和针对不同业务部门的自动摘录。这两个来源的共同数据是支出的ID。

这个想法是将两个数据源(excel表)聚合到一个表中,其中前两列是支出的ID,下一列是与该ID相关的来自用户的支出数据,最后一个是支出自动提取的数据。

在此表中,我将每个ID的总支出“翻倍”,但是我可以创建数据透视表,在其中将用户输入与每个ID的自动提取的内容进行清楚地比较。

我强调了我需要复制和粘贴的重要字段。 [![PGIvsManual] [3]] [3]

我的代码如下

Sub PGIvsManualInput()

    With Application
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    Set PGIvsManualTable = Worksheets("PGI vs Dépenses (Auto)").ListObjects("PGIvsManualInputAuto")
    Set PGITable = Worksheets("PGI Clean").ListObjects("PGIExtract")
    Set ManualInputTable = Worksheets("Dépenses").ListObjects("Dépenses")

    'Cleaning the table
    With Worksheets("PGI vs Dépenses (Auto)").Range("PGIvsManualInputAuto")
        .ClearContents
        .Borders(xlInsideHorizontal).LineStyle = xlNone
    End With

    With PGIvsManualTable
        If .ListRows.Count >= 1 Then
            .DataBodyRange.Rows.Delete
        End If
    End With

    'Copy the data
    PGITable.ListColumns(1).DataBodyRange.Resize(, 2).Copy Destination:= _
    PGIvsManualTable

蚂蚁就是它变得凌乱的地方。我什至无法正确导入第一批数据!我正在尝试从PGITable复制前两列并将其粘贴到PGIvsManualTable的前两列中。即使输入表和目标表的列数不相同,以前在第一个示例中也没有定义任何目标列的情况下可以正常工作

但是在这种情况下,它将粘贴扩展到了目标表的所有列!我不理解这种说法,因为在我之前的示例中使用完全相同的代码不会发生这种情况!

我尝试将目的地设置如下,但总是出现错误:

PGIvsManualTable.ListColumns(1).DataBodyRange.Resize(, 2) ==> Error 91

PGIvsManualTable.DataBodyRange(1,1) ==> Error 438

PGIvsManualTable.ListColumns(1).Resize(, 2) ==> Error 438

还有其他一些,但是它无法正常工作。

根据我在ListObecjts.DataBodyRange中提供的坐标,我希望输出是我选择的列在目标列中正确复制/粘贴的结果。

我想,如果我设法使第一个导入工作成功,那么所有其他导入都将在同一模板上工作,但是与此同时,我的代码似乎也可以在前面的示例中工作。

1 个答案:

答案 0 :(得分:0)

如果您尝试粘贴到DataBodyRange.Rows中,则删除DataBodyRange会引起问题。

作为解决方法,您可以删除第一行之后的所有行,例如以下示例:

Sub Test()
    Dim firstTbl As ListObject, secondTbl As ListObject
    Set firstTbl = Sheet1.ListObjects("Table1")
    Set secondTbl = Sheet1.ListObjects("Table2")

    With secondTbl
        .DataBodyRange.Clear

        If .ListRows.Count > 1 Then
            .DataBodyRange.Offset(1).Resize(.ListRows.Count - 1).Rows.Delete
        End If   
    End With

    firstTbl.ListColumns(1).DataBodyRange.Resize(, 2).Copy secondTbl.DataBodyRange(1, 1)
End Sub