【问题标题】:VBA to insert new row from table with formulaVBA使用公式从表中插入新行
【发布时间】:2019-03-06 11:37:48
【问题描述】:

我有 VBA 代码向表中添加新行(数据从第 5 行开始)。

我制作了一张新表格,当表格没有标题时效果很好。但是,当我添加标题时,会弹出以下错误

运行时错误“1004”这不起作用,因为它会 在工作表的表格中移动单元格。

我点击调试,它突出显示Rng.Insert Shift:=x1Down

错误的原因是什么,如何纠正?

Sub AddRows()

    Const BaseRow As Long = 5   ' modify to suit

    Dim x As String             ' InputBox returns text if 'Type' isn't specified
    Dim Rng As Range
    Dim R As Long

    x = InputBox("How many rows would you like to add?", "Insert Rows")
    If x = "" Then Exit Sub
    R = BaseRow + CInt(x) - 1

    Rows(BaseRow).Copy          'Copy BaseRow
    'specify range to insert new cells
    Set Rng = Range(Cells(BaseRow, 1), Cells(R, 1))
    Rng.Insert Shift:=xlDown

    ' insert the new rows BEFORE BaseRow
    ' to insert below BaseRow use Rng.Offset(BaseRow - R)
    Set Rng = Rng.Offset(BaseRow - R - 1).Resize(Rng.Rows.Count, ActiveSheet.UsedRange.Columns.Count)
    Rng.Select
    On Error Resume Next
    Rng.SpecialCells(xlCellTypeConstants).ClearContents
    Application.CutCopyMode = False '
End Sub

【问题讨论】:

  • 如果你有标题,你的baserow会是+1?
  • 在要插入行的表下面还有其他表吗?
  • 不,是一张大桌子
  • 我试过 R = BaseRow + CInt(x) + 1 但没有任何乐趣。你是这个意思吗?

标签: excel vba row add


【解决方案1】:

我认为你的表是一个列表对象。那么下面的代码可能会起作用

Sub TestAdd()
Dim myTbl As ListObject
Dim x As String
Dim i As Long

    Set myTbl = Sheet1.ListObjects(1)
    x = InputBox("How many rows would you like to add?", "Insert Rows")

    If x = "" Then Exit Sub
    For i = 1 To CInt(x)
        myTbl.ListRows.Add (1)
    Next i
End Sub

更新:为了保持格式和公式,您可以使用以下代码

Sub TestAdd()

Dim myTbl As ListObject
Dim x As String
Dim i As Long
Dim newRow As Range
Dim sngCell As Range

    Set myTbl = Sheets("Rentals").ListObjects(1)
    x = InputBox("How many rows would you like to add?", "Insert Rows")
    If x = "" Then Exit Sub
    For i = 1 To CInt(x)
        Set newRow = myTbl.ListRows.Add(1).Range
        With newRow
            .Offset(1).Copy
            ' .PasteSpecial xlPasteFormulasAndNumberFormats
            .PasteSpecial xlPasteFormulas
            .PasteSpecial xlPasteFormats
            For Each sngCell In newRow
                If Not (sngCell.HasFormula) Then
                    sngCell.ClearContents
                End If
            Next
        End With
        Application.CutCopyMode = False
    Next i
End Sub

【讨论】:

  • 请你学会分辨错误在哪里弹出?我假设在 Sheet1.ListObjects(1)。那么要么我的假设是错误的,要么 listobject 不在 Sheet1 上。你知道数据在哪张纸上吗?您是否知道名称,无论是您在底部选项卡中看到的代号还是工作表名称?
  • 谢谢。我将 sheet1 更改为“Rentals”以匹配我的工作表。错误现在读取所需的对象。
  • 您的代码现在看起来如何?要么使用代号,要么需要将行更改为Set myTbl = Sheets("Rentals").ListObjects(1)
  • Sub TestAdd() Dim myTbl As ListObject Dim x As String Dim i As Long Set myTbl = Sheets("Rentals").ListObjects(1) x = InputBox("你想要多少行add?", "Insert Rows") If x = "" Then Exit Sub For i = 1 To CInt(x) myTbl.ListRows.Add (1) Next i End Sub
  • 好的,这会插入新行,但存在一些格式问题,并非所有公式都被复制进去。有什么想法吗?
猜你喜欢
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多