首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ListObject (Excel表)上粘贴值数组会破坏Listobject

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

Stack Overflow用户
提问于 2015-01-22 10:34:59
回答 2查看 14.8K关注 0票数 2

在我的一张工作表里,我有一个

代码语言:javascript
复制
Private Sub BuggingVba()

应该将表中的数据替换为值的数组()

代码语言:javascript
复制
    Dim MyTable As ListObject, myData() As Variant
    Set MyTable = Me.ListObjects(1)
    myData = collectMyData ' a function defined somewhere else in my workbook

这可能无关紧要,但在这样做之前,我调整了list对象的大小(我逐行展开,因为如果立即展开,就会覆盖表下面的内容,而不是重新编排它)。

代码语言:javascript
复制
    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将覆盖值。

代码语言:javascript
复制
    If required Then
        Dim FullTableRange As Range
        Set FullTableRange = MyTable.HeaderRowRange _
            .Resize(1 + required, MyTable.HeaderRowRange.Columns.Count)
        FullTableRange.Value = sourceData
    End If

和BAM,我的表/列表对象不见了!为什么会发生这种情况,我如何避免它?

代码语言:javascript
复制
End Sub
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-28 16:41:19

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

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

在这些过程中,我们假设“目标”Table和“新数据”在保存代码的同一个workbook中分别位于工作表12中:

由于我们将使用HeaderRowRangeListObjectDataBodyRange,因此我们需要获得“新数据”,以相同的方式替换表中的数据。下面的代码将生成两个具有头数组和正文数组的数组。

代码语言:javascript
复制
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

然后使用以下代码将表中的数据替换为“新数据”

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2018-07-03 20:40:00

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

代码语言:javascript
复制
'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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28086597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档