在ListObject(Excel表)上粘贴一组值会破坏Listobject

时间:2015-01-22 10:35:00

标签: excel-vba excel-2010 listobject vba excel

在我的一个工作表中,我有一个

Private Sub BuggingVba()

应该使用值数组

替换表中的数据
    Dim MyTable As ListObject, myData() As Variant
    Set MyTable = Me.ListObjects(1)
    myData = collectMyData ' a function defined somewhere else in my workbook

这可能是无关紧要的,但在此之前,我调整列表对象(我逐行扩展,因为如果我立刻执行此操作,我会覆盖我的表下面的内容而不是转移它。)

    Dim current As Integer, required As Integer, saldo As Integer
    current = MyTable.DataBodyRange.Rows.Count
    required = UBound(sourceData, 1) - LBound(sourceData, 1)
    ' current and required are size of the body, excluding the header

    saldo = required - current

    If required < current Then
        ' reduce size
        Range(DestinBody.Rows(1), DestinBody.Rows(current - required)).Delete xlShiftUp
    Else
        ' expland size
        DestinBody.Rows(1).Copy
        For current = current To required - 1
            DestinBody.Rows(2).Insert xlShiftDown
        Next saldo
    End If

如果要插入任何数据,我会覆盖值

    If required Then
        Dim FullTableRange As Range
        Set FullTableRange = MyTable.HeaderRowRange _
            .Resize(1 + required, MyTable.HeaderRowRange.Columns.Count)
        FullTableRange.Value = sourceData
    End If

而BAM,我的表/ ListObject已经消失了!为什么会发生这种情况,我该如何避免呢?

End Sub

2 个答案:

答案 0 :(得分:2)

当我们粘贴整个表或清除整个表的内容时,附属结果是删除了表对象(ListObject)。这就是当数据逐行更改时代码工作的原因。

但是,如果我们使用ListObject的属性,则无需逐行执行,甚至不需要插入新行,如下面的代码所示。

在这些程序中,我们假设&#34;目标&#34; Table“新数据”在同一个{{ 1}}保存代码,分别位于工作表workbook1

由于我们将使用2的{​​{1}}和HeaderRowRange,因此我们需要获取“新数据”以相同的方式替换表中的数据。下面的代码将生成两个带有Header和Body Arrays的数组。

DataBodyRange

然后使用此代码用&#34;新数据&#34;

替换表格中的数据
ListObject

答案 1 :(得分:-1)

旧文章,但是我粘贴在listobject表上的方法是删除databodyrange,将范围设置为数组大小,然后将范围设置为数组。与上面提供的解决方案类似,但是不需要调整表的大小。

'Delete the rows in the table
    If lo.ListRows.Count > 0 Then
        lo.DataBodyRange.Delete
    End If

'Assign the range to the array size then assign the array values to the range
    Set rTarget = wsTemplate.Range("A2:K" & UBound(arrTarget) + 1)
    rTarget = arrTarget