首页 > 解决方案 > 将表中的一行复制到同一个表的末尾

问题描述

我正在尝试复制表格中的一行并将其粘贴到同一张表格的末尾。我希望能够单击该行中的任何单元格,然后按下我分配宏的按钮,它将整行复制到下一个可用行。我在网上找到了一个代码,但它只复制未隐藏的单元格,我希望复制包括隐藏列在内的整行。

请问这是我可以用来实现此目的的代码吗?

Sub CopySelectionVisibleRowsEnd()
Dim ws As Worksheet
Dim mySel As Range
Dim lRow As Long
Dim lRowNew As Long
Dim lRowsAdd As Long
Dim myList As ListObject
Dim myListRows As Long
Dim myListCols As Long

Set ws = ActiveSheet
Set mySel = Selection.EntireRow
Set myList = ActiveCell.ListObject
myListRows = myList.Range.Rows.Count
myListCols = myList.Range.Columns.Count
lRow = ws.Cells.Find(What:="*", _
        SearchOrder:=xlRows, _
        SearchDirection:=xlPrevious, _
        LookIn:=xlValues).Row + 1

mySel.SpecialCells(xlCellTypeVisible).Copy
ws.Cells(lRow, 1).PasteSpecial Paste:=xlPasteAll

lRowNew = ws.Cells.Find(What:="*", _
        SearchOrder:=xlRows, _
        SearchDirection:=xlPrevious, _
        LookIn:=xlValues).Row + 1
lRowsAdd = lRowNew - lRow

With myList
    .Resize ws.Range(.Range.Resize(myListRows + lRowsAdd, myListCols).Address)
End With

Application.CutCopyMode = False
End Sub

标签: excelvba

解决方案


由于这一行,上面的代码只复制了未隐藏的单元格:

mySel.SpecialCells(xlCellTypeVisible).Copy

如果它只是“mySel.Copy”,它将复制整个范围。

我不会对未注释的代码进行取证,不知道它的用途是什么,但这段代码似乎比你提到的要多得多——它正在搜索星号 (*) 字符来查找桌子的末端。如果您只想按您说的做 - 将一行复制到所选单元格周围的“CurrentRegion”底部 - 代码可能会简单得多。

假设您看到要添加到的表,当您在所需的行内单击后手动按 CTRL-* 时选择该表,这非常容易。CTRL-* 选择“当前区域”,基本上是所有你可以从你的单元格“走到”而不踩到空白单元格的单元格。在一个由空白行和列包围的简单表格中,它就是表格。如果您的表格是一个更复杂的东西,例如您提供的代码中提到的“ListObject” - 那么它就不那么简单了,您必须“调整该 ListObject 东西的范围”。或者即使您的表格底部有一行总计,并且您想在这些总计上方添加您的行,那么这也更复杂。

体现表格的 Range 对象只是:selection.currentregion

该表第一行的表达式将是:

selection.currentregion.rows(1)

您选择的行将是:

selection.currentregion.rows(selection.row-selection.currentregion.rows(1).row+1)

我知道最后一个很难看,但是“rows(N)”返回的范围是表的第 N 行,而“row”返回一个整数:整个电子表格中的绝对行号。因此,您可以通过从您刚刚单击的行号中减去表的第 1 行的绝对行号来获得您所在的表的行号。并添加一个。

该表中的最后一行将是类似的:

selection.currentregion.rows(selection.currentregion.rows.count)

...其中“count”方法返回当前区域中有多少行。

如果所有这些都适用于您的问题,那么您的代码实际上是一个单一的、公认的长行:

selection.currentregion.rows(selection.row-selection.currentregion.rows(1).row+1).copy  selection.currentregion.rows(selection.currentregion.rows.count).offset(1,0)

...并且您可以通过分解它并使用一些命名良好的变量来使其更易于阅读,例如:

Dim WholeTable as Range, MyRow as Range, LastRow as Range
Dim FirstRowNumber as Integer

Set WholeTable=selection.currentregion
FirstRowNumber=WholeTable.Rows(1).Row
Set MyRow=WholeTable.Rows( Selection.Row - FirstRowNumber +1)

其余的任何机会都可以成为学生的练习吗?


推荐阅读