Есть ли в VBA способ скопировать последние N данных?

#excel #vba #copy

Вопрос:

Здравствуйте, у меня есть запрос VBA…

В настоящее время у меня есть некоторый код VBA, который, по сути, «отражает» /копирует определенный диапазон ячеек из другой книги/листа. (диапазон ячеек в основном состоит из ряда за рядом результатов теста).

Мой вопрос в том, есть ли способ скопировать последние 10 (или сколько угодно) строк данных вместо определенного диапазона?

Текущий Код:

Установить Dat1 = Рабочие книги(«Результаты теста.xlsm»).Рабочие листы(«Пример»).Диапазон(«AP31:AP15000»)

Raw1.Диапазон(«A3:A15000»).Изменение размера(Dat1.Строки.Количество, Дата 1.Столбцы.Граф).Ячейки.Значение = Dat1.Ячейки.Ценность

Таким образом, первая строка кода устанавливает Dat1 в качестве данных AP31:AP15000 из файла результатов теста.

Вторая строка в основном говорит о том, чтобы поместить значение Dat1 в Raw1 (что является моим пунктом назначения).

Как я уже сказал, я не уверен, смогу ли я все еще использовать этот же метод, скажем, для выбора последних 20 строк? Или мне нужно использовать другой метод?

Заранее спасибо, Том

Комментарии:

1. Вы можете попытаться найти последнюю использованную строку и изменить размер на 10 позиций вверх от этой ячейки.

2. Range("AP31:AP15000").Rows(Range("AP31:AP15000").Rows.Count - 10 amp; ":" amp; Range("AP31:AP15000").Rows.Count)

3. @Nathan_Sav Спасибо, я попробую это сделать…

4. @Nathan_Sav Будет ли это все еще работать, даже если AP15000 не является последней строкой данных? Т. е. в нормальных условиях мы не узнаем, есть ли последняя строка данных?? (возможно, следовало упомянуть об этом в моем вопросе)

Ответ №1:

Я бы посоветовал проверить, какой диапазон вам нужно скопировать и использовать Offset() , и Resize() :

 Sub Test()

Dim wb As Workbook: Set wb = Workbooks("Test Results.xlsm")
Dim ws As Worksheet: Set ws = wb.Worksheets("Example")
Dim rng As Range, lr As Long

lr = ws.Cells(ws.Rows.Count, 42).End(xlUp).Row
If lr > 11 Then
    Set rng = ws.Cells(lr, 42).Offset(-9).Resize(10)
ElseIf lr > 2 Then
    Set rng = ws.Range(ws.Cells(3, 42), ws.Cells(lr, 42))
End If

'Do whatever with the "rng" variable.

End Sub