Скопировать ячейку из отфильтрованного диапазона, где находится только одна строка - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь скопировать данные из столбца в отфильтрованном диапазоне. Количество отфильтрованных строк всегда разное. Первая строка - заголовок.

Я использую это

ThisWorkbook.Sheets(1).Range("N2:N" & ThisWorkbook.Sheets(1).Range("N" & ThisWorkbook.Sheets(1).Rows.Count).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Copy

Это прекрасно работает, когда количество фильтруемых строк больше 1. Но когда есть только одна фильтрованная строка (и это должно быть N2: N2), он скопирует весь используемый диапазон.

Спасибо за совет.

Ответы [ 2 ]

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

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

Sub FilterRange()

    Dim rngTable As Range    '//Holds: header + data
    Dim rngData As Range     '//Holds: only data
    Dim rngFiltered As Range '//Holds: filtered range

    '// Our range (data + header)
    Set rngTable = [N1:N100]

    '// Get data only
    With rngTable
        Set rngData = .Offset(1).Resize(.Rows.Count - 1)
    End With

    '// Filter range
    rngTable.AutoFilter Field:=1, Criteria1:="1"

    '// Catch error if no values are filtered
    On Error Resume Next
    Set rngFiltered = rngData.SpecialCells(xlCellTypeVisible)

    '// Check if filtering was successful
    If Err = 0 Then
        '// Do some actions (for instance, copy to Sheet2)
        rngFiltered.Copy Sheets("Sheet2").Cells(1)
    Else
        '// No filtered range
    End If

    '// Get back to error raising
    On Error GoTo 0

End Sub
0 голосов
/ 07 января 2020

Перед копированием диапазона вы можете проверить, чтобы было больше видимых строк, чем в строке заголовка. Установите диапазон в переменную, затем посчитайте количество видимых ячеек в диапазоне, чтобы убедиться, что есть строки для копирования. Кроме того, как указал JvdV, вы должны использовать N1 в качестве начала. При копировании видимых ячеек в диапазоне вы всегда должны использовать Offset, чтобы не копировать строку заголовка, и Resize, чтобы не копировать пустую ячейку внизу из-за смещения. Вот базовый c пример того, как выполнить sh вашу задачу.

Dim rng As Range
Set rng = ThisWorkbook.Sheets(1).Range("D1:D" & ThisWorkbook.Sheets(1).Range("D" & ThisWorkbook.Sheets(1).Rows.Count).End(xlUp).Row)
    If rng.SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
        rng.Resize(rng.Cells.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Copy
    End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...