仅选择过滤的单元格

时间:2015-09-04 15:13:10

标签: excel excel-vba vba

我正在尝试过滤有效的列上的颜色,然后我希望Excel选择所有已过滤的单元格。但是我不想让它选择第一行。如果过滤后为空,我希望Excel跳过复制,如果没有则继续。

到目前为止,我有以下内容(不同的R,G,B代码用于颜色过滤,Color是我可以输入的工作表的名称):

    Sub ColourWork(Colour As String, RCode As String, GCode As String, BCode As String)

        Dim rCopy As Range

        'Q1======

        Sheets("Combine").Select
        ActiveSheet.Range("$A:$AJ").AutoFilter

        ActiveSheet.Range("$A$1:$AJ$493").AutoFilter Field:=8, Criteria1:=RGB(RCode, GCode, BCode), Operator:=xlFilterCellColor

        'here is the issue! Because it cannot copy/select nothing! 

        On Error GoTo Error1
        Set rCopy = ActiveSheet.AutoFilter.Range.Offset(1, 0).Copy

        Sheets(Colour).Select

        If IsEmpty(Range("A1").Value) = True Then

            Range("$A$2").Select
            ActiveSheet.Paste

        Else

            Range("$A$2").Select
            Range(Selection, Selection.End(xlDown)).Select
            ActiveSheet.Paste

        End If

Point1:

Error1:

GoTo Point1

End Sub

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

你走了:

Sub ColourWork(Colour As String, RCode As String, GCode As String, BCode As String)
    Dim rCopy As Range
    Sheets("Combine").Select
    With [a:aj].AutoFilter(8, RGB(RCode, GCode, BCode), xlFilterCellColor)
        Set rCopy = .Range.Offset(1).SpecialCells(xlCellTypeVisible).Copy
        Sheets(Colour).Select
        [index(a:a,1+max(iferror(match({"*";9E+99},a:a,{-1;1}),1)))].Paste
    End With
End Sub

答案 1 :(得分:1)

使用Specialcells(xlcelltypevisible),例如

    Set rCopy = ActiveSheet.AutoFilter.Range.Offset(1, 0).Specialcells(xlcelltypevisible).Copy

如需了解更多信息,请查看我在特殊主题here上的博文。

答案 2 :(得分:0)

让我想起我刚才写的一些代码。它并不是专门为你所要求的(直接复制或作用于颜色)而量身定做的,但它对于处理滤镜行间隙的一般情况来说是一个非常方便的工具。

它的作用:填充名为" F"的字段。在工作表的第一个ListObject(表)中,如果隐藏行,则值为0;如果该行可见,则为1。如果没有列/字段" F"存在,一个被创建并添加在表的右端。然后它清除所有工作表过滤器,对列F进行排序,使所有可见行都到达顶部,然后重新过滤。结果是您将所有过滤后的值合在一起,两者之间没有间隙。第二个影响是,您可以通过重命名" F"来保存复杂的过滤器组合。列/场。

免责声明:我刚才写了这段代码,我确信还有改进的余地。虽然它符合我的目的,所以我还没有花时间。如果你想出更好的东西,请告诉我。

Sub Filter_By_Sorting()
Application.ScreenUpdating = False
Dim r As Double
Dim C As Double
Dim A As Worksheet
Set A = ActiveSheet
r = A.ListObjects(1).ListRows(1).Range.Row
On Error Resume Next
C = A.Range(ActiveSheet.ListObjects(1).Name & "[F]").Column
    If Err <> 0 Then
         C = A.ListObjects(1).ListColumns(A.ListObjects(1).ListColumns.Count).Range.Column + 1
         Columns(C).Select
         Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
         Cells(A.ListObjects(1).ListRows(1).Range.Row - 1, C) = "F"
    End If
On Error GoTo 0
Dim end_r As Double
end_r = A.ListObjects(1).ListRows.Count + A.ListObjects(1).ListRows(1).Range.Row - 1
Dim e() As Double
ReDim e(r To end_r, 0)
    Do Until r > end_r
        If A.Rows(r).EntireRow.Hidden = False Then
            e(r, 0) = 1
        Else
            e(r, 0) = 0
        End If
        r = r + 1
    Loop
    A.Cells(A.ListObjects(1).ListRows(1).Range.Row, _
    A.ListObjects(1).ListColumns(1).Range.Column).Select
    'Application.ScreenUpdating = True
    On Error Resume Next
    ActiveSheet.ShowAllData
        If Err <> 0 Then
            MsgBox "No Filter Detected, Macro Aborted"
            Exit Sub
        End If
    On Error GoTo 0
    'Application.ScreenUpdating = False
    Range(Cells(A.ListObjects(1).ListRows(1).Range.Row, C), Cells(end_r, C)) = e
    A.ListObjects.Item(1).Sort.SortFields.Clear
    A.ListObjects.Item(1).Sort.SortFields. _
        Add Key:=Range(A.ListObjects.Item(1).Name & "[F]"), SortOn:=xlSortOnValues, Order:=xlDescending _
        , DataOption:=xlSortNormal
    With A.ListObjects.Item(1).Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
   'A.Range(ActiveSheet.ListObjects(1).Name & "[F]").AutoFilter Criteria1:="1"
   A.ListObjects(1).Range.AutoFilter Field:=C, Criteria1:="1"
End Sub