在我的一张工作表里,我有一个
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这可能无关紧要,但在这样做之前,我调整了list对象的大小(我逐行展开,因为如果立即展开,就会覆盖表下面的内容,而不是重新编排它)。
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如果有任何数据要插入,I将覆盖值。
If required Then
Dim FullTableRange As Range
Set FullTableRange = MyTable.HeaderRowRange _
.Resize(1 + required, MyTable.HeaderRowRange.Columns.Count)
FullTableRange.Value = sourceData
End If和BAM,我的表/列表对象不见了!为什么会发生这种情况,我如何避免它?
End Sub发布于 2015-09-28 16:41:19
当我们粘贴到整个表或清除整个表的内容时,附带的结果是表对象(ListObject)被删除。这就是当数据逐行更改时代码工作的原因。
但是,如果我们使用ListObject的属性(如下面的代码所示),则不需要逐行执行,甚至不需要插入新行。
在这些过程中,我们假设“目标”Table和“新数据”在保存代码的同一个workbook中分别位于工作表1和2中:
由于我们将使用HeaderRowRange和ListObject的DataBodyRange,因此我们需要获得“新数据”,以相同的方式替换表中的数据。下面的代码将生成两个具有头数组和正文数组的数组。
Sub Dta_Array_Set(vDtaHdr() As Variant, vDtaBdy() As Variant)
Dim vArray As Variant
With ThisWorkbook.Worksheets("Sht(1)").Range("DATA") 'Change as required
vArray = .Rows(1)
vDtaHdr = vArray
vArray = .Offset(1, 0).Resize(-1 + .Rows.Count)
vDtaBdy = vArray
End With
End Sub然后使用以下代码将表中的数据替换为“新数据”
Private Sub ListObject_ReplaceData()
Dim MyTable As ListObject
Dim vDtaHdr() As Variant, vDtaBdy() As Variant
Dim lRowsAdj As Long
Set MyTable = ThisWorkbook.Worksheets(1).ListObjects(1) 'Change as required
Call Data_Array_Set(vDtaHdr, vDtaBdy)
With MyTable.DataBodyRange
Rem Get Number of Rows to Adjust
lRowsAdj = 1 + UBound(vDtaBdy, 1) - LBound(vDtaBdy, 1) - .Rows.Count
Rem Resize ListObject
If lRowsAdj < 0 Then
Rem Delete Rows
.Rows(1).Resize(Abs(lRowsAdj)).Delete xlShiftUp
ElseIf lRowsAdj > 0 Then
Rem Insert Rows
.Rows(1).Resize(lRowsAdj).Insert Shift:=xlDown
End If: End With
Rem Overwrite Table with New Data
MyTable.HeaderRowRange.Value = vDtaHdr
MyTable.DataBodyRange.Value = vDtaBdy
End Sub发布于 2018-07-03 20:40:00
旧的post,但我在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 = arrTargethttps://stackoverflow.com/questions/28086597
复制相似问题