Дублируйте последний ряд определенных листов - PullRequest
1 голос
/ 13 января 2020

У меня есть книга Excel с большим количеством листов.

Я пытаюсь скопировать последнюю строку с содержимым в следующую пустую строку на определенных листах.

Например, мои листы называются Hoja1, Hoja2, Hoja3, ..., Hoja20, но Мне просто нужно сделать это в листах Hoja1, Hoja3, Hoja4. Hoja12, Hoja13 и Hoja20.

Это мой код:

Sub sale()

Sheets(Array("Hoja1", "Hoja3", "Hoja4", "Hoja12", "Hoja13")).Select
Sheets("Hoja20").Activate
Range("A50000").End(xlUp).Select
Range(Selection, Selection.End(xlToRight)).Copy
Range("A50000").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste

End Sub

Иногда последняя строка удаляется, и в Hoja3, когда копируется последняя строка, удаляется последняя ячейка, в которой в исходной строке есть данные.

Я попробовал эту альтернативу:

Sub copylastrow()

Sheets(Array("Hoja1", "Hoja3", "Hoja4", "Hoja12", "Hoja13")).Select
Sheets("Hoja20").Activate

Range("A" & Rows.Count).End(xlUp).EntireRow.Copy
Range("A" & Rows.Count).End(xlUp).Offset(1).EntireRow.PasteSpecial

End Sub

Копирует последнюю строку только в Hoja20.

1 Ответ

1 голос
/ 13 января 2020

Я бы разделил это на функцию, которая выполняет копирование, и клиентскую подпрограмму, которая создает коллекцию листов и проходит по ним, вызывая функцию копирования.

Option Explicit

Public Sub CopyLastRow(xlSheet As Worksheet)

    xlSheet.Activate
    xlSheet.Range("A" & Rows.Count).End(xlUp).EntireRow.Copy
    xlSheet.Range("A" & Rows.Count).End(xlUp).Offset(1).EntireRow.PasteSpecial

End Sub

Sub DoWork()
    Dim arrSheets As Object
    Dim xlSheet As Worksheet

    '// Turn off screen updating
    Application.ScreenUpdating = False

    '// Establish the collection of sheets
    Set arrSheets = Sheets(Array("Hoja1", "Hoja3", "Hoja4", "Hoja12", "Hoja13"))

    '// Loop through each sheet and copy the last row
    For Each xlSheet In arrSheets
        CopyLastRow xlSheet
    Next xlSheet

    '// Turn screen updating back on
    Application.ScreenUpdating = True
End Sub

В качестве примечания, если вы не нужно копировать форматирование последней строки, может быть лучше просто присвоить значение диапазона, а не использовать методы объекта Range * .Copy и .PasteSpecial. Вы бы сделали это так:

Public Sub CopyLastRowFaster(xlSheet as Worksheet)

    xlSheet.Range("A" & Rows.Count).End(xlUp).Offset(1).EntireRow.Value = xlSheet.Range("A" & Rows.Count).End(xlUp).EntireRow.Value

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