Excel 从筛选范围复制单元格,其中只有一行

Excel 从筛选范围复制单元格,其中只有一行,excel,vba,Excel,Vba,我正在尝试从筛选范围内的列复制数据。过滤的行数总是不同的。第一行是标题 我在用这个 ThisWorkbook.Sheets(1).Range("N2:N" & ThisWorkbook.Sheets(1).Range("N" & ThisWorkbook.Sheets(1).Rows.Count).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Copy 当过滤的行数大于1时,这种方法可以正常工作。但是当只有一个过滤行(应该是N2:

我正在尝试从筛选范围内的列复制数据。过滤的行数总是不同的。第一行是标题

我在用这个

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)时,它将复制整个使用范围


感谢您的建议。

为了正确处理过滤后的数据,您应该遵循以下模式:

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

在复制范围之前,可以进行测试以确保有比标题行更多的可见行。将范围设置为变量,然后计算范围内可见单元格的数量,以确保有行要复制。此外,正如JvdV指出的,您应该使用
N1
作为开始。在一个范围内复制可见单元格时,应始终使用<代码> Office < /Cord>以确保不复制标题行,以及<代码> Resiths< /Cord>,以确保由于偏移,不会在底部复制空白单元格。下面是一个如何完成任务的基本示例

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

AutoFilter
在没有点击的情况下无法正常工作(您应该从
N1
>中进行筛选,假设它是标题)。也许这篇文章给了你们一些启示。但若我只想从一列复制数据呢?(表示一个单元格,因为它将只过滤一行)@sproust如果需要筛选范围中的第一个单元格,则可以调用:
Set rngFirstCell=rngFiltered(1)
(如果有一列)。@sproust如果有五列,则需要从第三列中获取第一个单元格,然后:
Set rngFirstCell=rngFiltered.Cells(1,3)
。在我的情况下效果更好。也谢谢你。