2016-07-27 3 views
0

У меня есть отфильтрованная таблица, из которой я хочу скопировать последние 160 записей. Мои коды для фильтрации таблицы отлично работают, но следующие коды копируют все 160 строк. Мне нужны последние 160 строк из столбца B в S. Кроме того, могу ли я выбрать последние отфильтрованные 160 строк (ранее отфильтрованных с конкретными критериями), а не последние последние 160 строк? Например: последние 160 строк могут содержать номера строк от 90 до 100 с другими критериями.Выбор диапазона из последних 160 строк

Благодарим за помощь. Мои коды являются следующие:

Sub FilterRows() 

Dim LastRow As Long, x As Long 

LastRow = Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row 

x = 160 

Range(LastRow - x + 1 & ":" & LastRow).Copy 

End Sub 

ответ

0

Это скопирует ячейки B: S из последних 160 видимых строк данных.

Sub CopyLastXNumberVisibleRows() 
    Const MaxRows = 160 
    Dim count As Long, lastRow As Long, x As Long 
    Dim SourceRange As Range 

    lastRow = Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row 

    For x = lastRow To 2 Step -1 
     If Not Rows(x).Hidden And Cells(x,"A") = "Some Criteria" Then 
      count = count + 1 

      If SourceRange Is Nothing Then 
       Set SourceRange = Range(Cells(x, "B"), Cells(x, "S")) 
      Else 
       Set SourceRange = Union(SourceRange, Range(Cells(x, "B"), Cells(x, "S"))) 
      End If 

      If count = MaxRows Then Exit For 
     End If 
    Next 

    If Not SourceRange Is Nothing Then 

     SourceRange.Copy Destination:=Sheet1.Range("A2") 

    End If 

End Sub 
+0

@Robert Я обновил свой ответ. Дайте мне знать, как это работает для вас. –

+0

Я, наверное, что-то не так. Я вставляю коды, как показано ниже, но ничего не делает. – Robert

+0

Sub FilterRows() дим rSource В Диапазон On Error Resume Next Набор rSource = Интерсект. (ActiveSheet.UsedRange, Диапазон ("В2: S65536" & Rows.Count)) SpecialCells (xlCellTypeVisible) On Error GoTo 0 Если не rSource ничего после этого rSource.Copy Destination: = Sheet1.Range («АА2») End If End Sub – Robert

0

Вам придется настроить, где вы хотите, чтобы вывод должен быть скопирован, но попробовать это ниже, используя эту часть кода Cells(1, 1)

Sub test() 
    Sheets("Sheet1").Cells(2, 14).Resize(160, 17).Value = Cells(Cells(Rows.Count, _ 
       2).End(xlUp).Row - 159, 2).Resize(160, 17).Value 
End Sub 
+0

Спасибо. Сори был настолько новым в VBA. Должен ли я скопировать код и вставить его следующим образом: – Robert

+0

Sub FilterRows() Dim rSource Как Диапазон On Error Resume Next Set rSource = Intersect (ActiveSheet.UsedRange, Range ("B2: S65536" & Rows.Count)) .SpecialCells (xlCellTypeVisible) On Error GoTo 0 Если не rSource ничего после этого rSource.Copy Destination: = Sheet1.Range ("АА2") Cells (1, 1) .Resize (160, 17) .Value = Cells (Cells (Rows.Count, _ 2) .END (xlUp) .Row - 159, 2) .Resize (160, 17) .Value End If End Sub – Robert

+0

эта линия будет копировать все строки сюда m в последней строке до 160, вам больше ничего не нужно. Каков диапазон, на который вы хотите скопировать данные? т.е. «Листы» («Лист1»). Диапазон («A1») – KyloRen

0

Вы можете думать по-другому. Просто скопируйте все отфильтрованные данные на новый лист, а затем используйте цикл while, чтобы удалить дополнительные данные.

Sub LastRows() 
Dim row As Integer 

Sheets.Add after:=Sheets(Sheets.Count) 
Sheets("Sheet1").Cells(1, 1).CurrentRegion.Copy ActiveSheet.Cells(1, 1) 

row = Range(Cells(1, 1), Cells(1, 1).End(xlDown)).Rows.Count 

If row > 161 Then 'including the title 
    Rows("2:" & (row - 160)).Delete 
End If 
End Sub 

Пожалуйста, измените "Лист1" с названием Технического паспорта в

+0

Я попробую этот подход, спасибо за предоставление второго варианта. – Robert

0

вы могли бы использовать такую ​​функцию:

Function FilteredRows(nRowsToCopy As Long, rng As Range, firstCol As String, lastCol As String) As Range 
    Dim firstRow As Long: firstRow = 2 

    With rng 
     With .Offset(1, .Parent.UsedRange.Columns.Count).Resize(.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible).Offset(, .Parent.UsedRange.Columns.Count) 
      .FormulaR1C1 = "=max(R1C:R[-1]C)+1" 
      If WorksheetFunction.Max(.Cells) > nRowsToCopy Then firstRow = .Find(what:=WorksheetFunction.Max(.Cells) - nRowsToCopy + 1, lookat:=xlWhole, LookIn:=xlValues).Row 
      .Clear 
     End With 
     Set FilteredRows = Intersect(.SpecialCells(xlCellTypeVisible), .Parent.Columns(firstCol & ":" & lastCol), .Parent.Rows(firstRow).Resize(.Rows(.Rows.Count).Row - firstRow + 1)) 
    End With 
End Function 

будет эксплуатируемой в основном коде, как следующий образом:

FilteredRows(nRowsToCopy, dataRng, "B", "S").Copy 

, где

  • nRowsToCopy является (максимальным) число последних отфильтрованных строк скопировать
  • datarng является диапазоном со всеми вашими данными (заголовки включен)
  • "B" и "S" являются первыми и последними столбцами, которые будут копироваться
+0

Спасибо Пользователь 3598756! Ваш ответ не в моих силах! Должен ли я вставлять коды функций в другой макрос и копировать коды «FilteredRows (nRowToCopy, dataRng,« B »,« S »). Скопировать« в мои основные коды? Нужно ли устанавливать nRowsToCopy на 160? Нужно ли мне называть мою таблицу «datarng»? Еще раз спасибо – Robert

+0

место 'FilteredRows()' в любом модуле. Затем в Sub, где вам нужно получить последние 160 видимых строк, вы 1) либо определяете, либо устанавливаете переменную 'dataRng' типа' Range' ('Dim dataRng as Range',' Set dataRng = ActiveSheet.Range («A1: Z "и ActiveSheet.Cells (ActiveSheet.Rows.Count," A "). End (xlUp) .Row)') или канал, которые находятся непосредственно в вызове функции ('FilteredRows (nRowsToCopy, ActiveSheet.Range (" A1: Z «& ActiveSheet.Cells (ActiveSheet.Rows.Count,« A »). End (xlUp) .Row),« B »,« S »). Copy') 2) вы можете определить и установить' nRowsToCopy' (' Dim nRowsToCopy as Long', 'nRowsToCopy = 160') или подать 160 – user3598756

+0

Еще раз спасибо Пользователь 3598756! – Robert