VBA Excel-插入表格行,格式与上面的行相同

VBA Excel-插入表格行,格式与上面的行相同,vba,excel,Vba,Excel,我有一个按钮,用户可以点击它将一行添加到给定工作表上的给定表中。如果用户在表中选择了一个单元格,则宏将确定它需要在所选内容的正下方添加一行。如果用户不在表中,则只需在表的底部添加一行即可 它工作得相当好,只是我不知道如何从上面的行复制格式。这可能吗 我的代码可能有用,如下所示: Private tblTotalRows As Integer Public selectedRow As Integer Public selectedCol As Integer '''''''''''''''''

我有一个按钮,用户可以点击它将一行添加到给定工作表上的给定表中。如果用户在表中选择了一个单元格,则宏将确定它需要在所选内容的正下方添加一行。如果用户不在表中,则只需在表的底部添加一行即可

它工作得相当好,只是我不知道如何从上面的行复制格式。这可能吗

我的代码可能有用,如下所示:

Private tblTotalRows As Integer
Public selectedRow As Integer
Public selectedCol As Integer

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Add a row to the table
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub addRow(shtName As String, tblName As String, startRow As Integer)

    Dim tableRef As Integer

    Call getSelectedCell
    Call totalRowsInTable(shtName, tblName, startRow) ' Sets the selectedRow and tblTotalRows property

    ' We determine the row number where the new table row should be placed
    tableRef = selectedRow - startRow + 1

    ' Check to make sure the user is in the active table and then add a row
    If tableRef > 0 And selectedRow <= tblTotalRows Then
        Sheets(shtName).ListObjects(tblName).ListRows.Add (tableRef)
    Else
    ' If they're not in the table and then add a row to the bottom of the table
        Sheets(shtName).ListObjects(tblName).ListRows.Add AlwaysInsert:=True
    End If

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Get the row and column of the cell under selection
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub getSelectedCell()

    selectedRow = ActiveCell.Row
    selectedCol = ActiveCell.Column

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Count the number of rows in the Table
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub totalRowsInTable(shtName As String, tblName As String, startRow As Integer)

    Call getSelectedCell

    ' Select the entire table
    Sheets(shtName).ListObjects(tblName).Range.Select

    ' Count the number of rows in the table and add to the starting row
    tblTotalRows = Selection.Rows.Count + startRow - 1

    ' Go back to the users position
    Cells(selectedRow, selectedCol).Select

End Sub
私有tblTotalRows作为整数
Public selectedRow作为整数
公共选择列为整数
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'向表中添加一行
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
私有子addRow(shtName作为字符串,tblName作为字符串,startRow作为整数)
Dim tableRef为整数
调用getSelectedCell
Call totalRowsInTable(shtName、tblName、startRow)”设置selectedRow和tblTotalRows属性
'我们确定新表行应放置的行号
tableRef=selectedRow-startRow+1
'检查以确保用户在活动表中,然后添加一行

如果tableRef>0并选择了Drow作为注释,则可以从
Sheets(shtName).ListObjects(tblName).Range.Row中返回
Sub
中的startRow,并且不需要作为属性传递

我还想知道当Excel的默认行为是插入一行或多个单元格以复制上面单元格的格式时,您需要复制什么格式

在任何情况下,这些添加的行都可以(添加
Dim
s和最后几行):

Private Sub addRow(shtName作为字符串,tblName作为字符串,startRow作为整数)
Dim tableRef为整数
弱加法单元
Dim ADEDCELLRANGE As范围
将前一个单元格范围变暗为范围
调用getSelectedCell
Call totalRowsInTable(shtName、tblName、startRow)”设置selectedRow和tblTotalRows属性
'我们确定新表行应放置的行号
tableRef=selectedRow-startRow+1
'检查以确保用户在活动表中,然后添加一行

如果tableRef>0并选择了Drow作为注释,则可以从
Sheets(shtName).ListObjects(tblName).Range.Row中返回
Sub
中的startRow,并且不需要作为属性传递

我还想知道当Excel的默认行为是插入一行或多个单元格以复制上面单元格的格式时,您需要复制什么格式

在任何情况下,这些添加的行都可以(添加
Dim
s和最后几行):

Private Sub addRow(shtName作为字符串,tblName作为字符串,startRow作为整数)
Dim tableRef为整数
弱加法单元
Dim ADEDCELLRANGE As范围
将前一个单元格范围变暗为范围
调用getSelectedCell
Call totalRowsInTable(shtName、tblName、startRow)”设置selectedRow和tblTotalRows属性
'我们确定新表行应放置的行号
tableRef=selectedRow-startRow+1
'检查以确保用户在活动表中,然后添加一行

如果tableRef>0并选择了Drow,则可将其缩短为

Private Sub addRow(shtName As String, tblName As String)
    Dim newRow as Range

    With Sheets(shtName).ListObjects(tblName)
       If Not Intersect(ActiveCell,.Range) Is Nothing Then
            Set newRow= .ListRows.Add(ActiveCell.Row - .Range.Rows(1).Row + 1).Range
       Else
            Set newRow= .ListRows.Add(AlwaysInsert:=True).Range
       End If
    End With 

    With newRow
        .offset (-1).Copy
        .PasteSpecial xlPasteFormats
    End With 
    Application.CutCopyMode = False
End Sub

它可以缩短为

Private Sub addRow(shtName As String, tblName As String)
    Dim newRow as Range

    With Sheets(shtName).ListObjects(tblName)
       If Not Intersect(ActiveCell,.Range) Is Nothing Then
            Set newRow= .ListRows.Add(ActiveCell.Row - .Range.Rows(1).Row + 1).Range
       Else
            Set newRow= .ListRows.Add(AlwaysInsert:=True).Range
       End If
    End With 

    With newRow
        .offset (-1).Copy
        .PasteSpecial xlPasteFormats
    End With 
    Application.CutCopyMode = False
End Sub

这有帮助吗?不幸的是没有。我认为我的代码要干净得多,我宁愿继续处理表对象而不是范围。你不能将特殊格式从源行粘贴到新的目标行吗?通用示例:
Sheets(1).范围(“A1:A200”)。复制
然后
Sheets(2).范围(“B1”)。粘贴特殊XLPaste格式,如Marc所述。作为提示,如果您不知道如何在VBA/Excel中执行某些操作,只需记录一个新宏,手动执行您试图实现的操作,停止记录,然后执行ALT&F11,进入VBA编辑器中的模块,查看它生成的代码。作为第二个技巧,您可以通过不使用公共变量来简化代码,并将sub更改为传递局部变量的函数,然后返回您想要进一步操作的结果。您的
列表对象的当前
表样式是什么?这有帮助吗?不幸的是没有。我认为我的代码要干净得多,我宁愿继续处理表对象而不是范围。你不能将特殊格式从源行粘贴到新的目标行吗?通用示例:
Sheets(1).范围(“A1:A200”)。复制
然后
Sheets(2).范围(“B1”)。粘贴特殊XLPaste格式,如Marc所述。作为提示,如果您不知道如何在VBA/Excel中执行某些操作,只需记录一个新宏,手动执行您试图实现的操作,停止记录,然后执行ALT&F11,进入VBA编辑器中的模块,查看它生成的代码。作为第二个技巧,您可以通过不使用公共变量和,将sub更改为传递局部变量的函数,并返回您想要进一步操作的结果。您的
列表对象的当前
表样式是什么?@BarryBlade:您完成了吗?@BarryBlade:完成了吗?