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:完成了吗?