【问题标题】:VBA Insert Rows to bottom of specific table with formulaVBA使用公式将行插入特定表格的底部
【发布时间】:2020-12-23 21:38:55
【问题描述】:

我有一个包含多个选项卡的电子表格,每个选项卡都有一个表格。我希望每个选项卡都有一个按钮来在该表的底部插入行(不必选择单元格)并从其上方的行中复制公式。 这是我所拥有的:

-询问要插入多少行 -默认插入为 1 - 否则,使用该变量在底部插入并复制公式

Sub InsertRows()
   Dim i As Long
   Dim j As Variant
   j = InputBox("How many rows would you like to add?", "Insert Rows")
   If j = "" Then
      j = 1
   End If
   For i = 1 to j
      Dim newrow As ListRow
      Set newrow = tbl.ListRows.Add
      With newrow.Range
         .Offset(-1).Copy
         .Cells(1).PasteSpecial xlPasteFormulas
         Application.CutCopyMode = False
      End With
    Next
End Sub

我不确定如何从输入到For 循环中实现ij

【问题讨论】:

  • 我认为表格会自动添加公式?
  • 每张表只有一张桌子吗?
  • @urdearboy 是的,每张纸只有一张桌子。

标签: excel vba copy-paste


【解决方案1】:

将您的按钮链接到此宏,该宏应在 VBA 编辑器中粘贴到 ModuleThisWorkbook


Sub InsertRows()

Dim ws As Worksheet: Set ws = ThisWorkbook.ActiveSheet
Dim i As Long, x As Long
Dim Tbl As ListObject
Dim NewRow As ListRow

i = Application.InputBox("How many rows would you like to add?", "Insert Rows", 1, Type:=1)
Set Tbl = ws.ListObjects(1)

For x = 1 To i
    Set NewRow = Tbl.ListRows.Add(AlwaysInsert:=True)
Next x

End Sub

使用Application.InputBox 可让您设置默认值 (1) 并设置变量类型(Type:= 1 = 数字),这将通过不允许非数字输入来帮助进行数据验证。

请注意,这并不涵盖所有边缘情况,因此您仍可能需要添加一些数据验证:例如,有人可以提供负数。在这种情况下,将创建 0 行。用户还可以提供小数,在这种情况下,excel 将四舍五入到最接近的整数以确定要添加的行数。因此,您可能希望将输入限制为正整数

【讨论】:

  • 根据下面与@Ricardo Diaz 的讨论,值得注意的是,此解决方案取决于您确认的假设 (1 Table per Worksheet)。如果这不是为真,那么您将需要对此宏进行一些更新。
【解决方案2】:

这是我的方法:

  • 添加通用过程以向表中添加行
  • 通过调整表格范围的大小来添加行
  • 为每个按钮添加宏,在每个按钮中指定表的名称

宏:Table1Table2 替换为每个工作表的表名

' Macros to associate with buttons
Public Sub InsertRowsInTable1()
    InsertRowsInTable "Table1"
End Sub

Public Sub InsertRowsInTable2()
    InsertRowsInTable "Table2"
End Sub

通用代码:

' Generic procedure to add table rows
Private Sub InsertRowsInTable(ByVal targetTableName As String)
    
    ' Ask user how many rows to ask
    Dim rowsToAdd As Variant
    rowsToAdd = InputBox("How many rows would you like to add?", "Insert Rows", 1)
    
    ' If user didn't input anything, default to 1
    If rowsToAdd = vbNullString Then rowsToAdd = 1
    
    Dim targetTable As ListObject
    Set targetTable = Range(targetTableName).ListObject
    
    ' Resize the table to add rows
    targetTable.Resize targetTable.Range.Resize(targetTable.Range.Rows.Count + rowsToAdd)
        
End Sub

【讨论】:

  • 我不同意 OP 总是加 1 的方法。如果我不小心选择了按钮并只想取消怎么办?在那种情况下,我希望添加 0 行
  • 如您所说,建议进行一些额外的验证
  • 当然,但vbNullString = 1 似乎很奇怪。 OP在他的帖子中确实有这个,所以你的解决方案不是问题。我不同意 OP 的方法,而不是你的。 :) 要添加的行数越多,您的解决方案对我的好处就越大,所以我+1。我的使用了一个循环,这可能会耗费大量时间
  • 我唯一的评论是 op 澄清了每张表 1 个表,所以我认为这是一个合理的时间来依赖 ActiveSheet 并节省对许多表名称进行硬编码的时间
  • @urdearboy 我从字面上理解,(顺便说一句,我从你那里学到了很多东西)。你的评论完全有效。我考虑过使用Activesheet,但在这种情况下,我猜人们可能会在工作表中添加更多表格,然后导致意外行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多