Excel VBA使用公式将行插入到特定表的底部

Excel VBA使用公式将行插入到特定表的底部,excel,vba,copy-paste,Excel,Vba,Copy Paste,我有一个包含多个选项卡的电子表格,每个选项卡都有一个表格。我希望每个选项卡都有一个按钮,用于将行插入该表的底部(无需选择单元格),并从其上方的行复制公式。 以下是我所拥有的: -询问要插入多少行 -默认插入为1 -否则,请使用该变量在底部插入并复制公式 Sub InsertRows() Dim i As Long Dim j As Variant j = InputBox("How many rows would you like to add?", &qu

我有一个包含多个选项卡的电子表格,每个选项卡都有一个表格。我希望每个选项卡都有一个按钮,用于将行插入该表的底部(无需选择单元格),并从其上方的行复制公式。 以下是我所拥有的:

-询问要插入多少行 -默认插入为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

我不知道如何将
I
j
从输入到
For
循环中。

将您的按钮链接到该宏,该宏应粘贴到VBA编辑器中的
模块或
此工作簿



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

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

这是我的方法:

  • 添加向表中添加行的常规过程
  • 通过调整表范围的大小来添加行
  • 为每个按钮添加宏,在每个按钮中指定表的名称
宏:
表1
表2
替换为每张表的表名

' 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

我认为表格会自动添加公式?每张表格只有一个表格吗?@Urderboy是的,每张表格只有一个表格。我不同意OP总是添加1的方法。如果我不小心选择了按钮,只是想取消怎么办?在这种情况下,我希望添加0行,正如您所说,我们肯定会建议进行一些额外的验证,但
vbNullString=1
似乎很奇怪。OP在他的帖子里有这样的内容,所以你的解决方案没有问题。我不同意老年退休金计划,不是你的。:)要添加的行数越大,您的解决方案相对于我的so+1的好处就越大。我使用的循环可能会耗费大量时间。我唯一的意见是op为每张工作表澄清了一个表,因此我认为这是一个合理的时间来依赖
ActiveSheet
,并节省了对许多工作表进行硬编码的时间names@urdearboy我照字面理解,(顺便说一句,我从你那里学到了很多东西)。你的评论完全正确。我曾考虑过使用
Activesheet
,但在这种情况下,我想可能会有人向工作表中添加更多表格,然后导致意外行为。根据下面与@Ricardo Diaz的讨论,值得注意的是,此解决方案取决于您确认的假设(
1张表格/工作表
)。如果这不是真的,那么您需要对此宏进行一些更新。
' 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