在我的一个工作表中,我有一个
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
答案 0 :(得分:2)
当我们粘贴整个表或清除整个表的内容时,附属结果是删除了表对象(ListObject
)。这就是当数据逐行更改时代码工作的原因。
但是,如果我们使用ListObject
的属性,则无需逐行执行,甚至不需要插入新行,如下面的代码所示。
在这些程序中,我们假设&#34;目标&#34; Table
和“新数据”在同一个{{ 1}}保存代码,分别位于工作表workbook
和1
:
由于我们将使用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