Копирование строки в таблице до конца той же таблицы - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь скопировать строку в таблицу и вставить ее в конец той же таблицы.Я надеюсь, что смогу щелкнуть любую ячейку в этой строке, а затем нажать кнопку, которой я назначил макрос, и она скопирует всю строку в следующую доступную строку.Я нашел код в Интернете, но он копирует только скрытые ячейки, и я ищу, чтобы скопировать всю строку, включая скрытые столбцы.

Это код, который я могу использовать для этого, пожалуйста?

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

1 Ответ

0 голосов
/ 24 сентября 2019

Приведенный выше код копирует только скрытые ячейки из-за этой одной строки:

mySel.SpecialCells(xlCellTypeVisible).Copy

Если бы это был просто "mySel.Copy", он скопировал бы весь диапазон.

IЯ не собираюсь делать экспертизу по незакомментированному коду, не имея представления о том, для каких данных он был предназначен, но этот код, кажется, делает гораздо больше, чем вы упоминаете - он ищет символ звездочки (*), чтобы найти целистола.Если вы просто хотите сделать то, что вы сказали - скопируйте строку внизу «CurrentRegion» вокруг выбранной ячейки - код может быть намного проще.

Предполагая, что вы видите таблицу, которую хотите добавитьдо, выбранный, когда вы нажимаете CTRL- * вручную после щелчка внутри нужной строки, это очень легко.CTRL- * выбирает «текущий регион», в основном все ячейки, в которые вы могли бы «пройти» из своей ячейки, не наступая на пустую ячейку.В простой таблице, окруженной пустыми строками и столбцами, это таблица.Если ваша таблица представляет собой более сложную вещь, такую ​​как «ListObject», упомянутую в коде, который вы предоставили, то она менее проста, вам нужно «изменить размер» этой вещи ListObject.Или даже если в вашей таблице есть строка итогов внизу, и вы хотите добавить свою строку выше этих итогов, то это тоже более сложно.

Объект Range, который воплощает таблицу, просто: selection.currentregion

Тогда выражение для первой строки этой таблицы будет иметь вид:

selection.currentregion.rows(1)

Выбранная вами строка будет иметь следующий вид:

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

Я знаю, что последний был уродливым, но "row (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)

Есть ли шанс, что остальное может быть упражнением для студента?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...