从条件格式中选择所有彩色单元格

时间:2017-09-11 08:31:53

标签: excel vba excel-vba excel-2016

我的工作表“摘要”中有一系列单元格(K6:M200),我需要使用宏来选择所有基于条件格式设置着色的单元格。有以下条件:

  1. 有色细胞将从K6连续,直到任何行不符合条件。
  2. 并非所有细胞都是相同的颜色。
  3. 我是VBA和宏的新手,所以我希望有人可以帮我弄清楚如何做到这一点。我已经尝试了一些公式但它没有用。

3 个答案:

答案 0 :(得分:2)

我建议这样的事情:

Sub selectCFColours()
    Dim cell As Range
    Dim selRange As Range

    For Each cell In Range("K6:M200")
        If cell.DisplayFormat.Interior.Color <> cell.Interior.Color Then
            If selRange Is Nothing Then
                Set selRange = cell
            Else
                Set selRange = Union(selRange, cell)
            End If
        End If
    Next

    If Not selRange Is Nothing Then selRange.Select
End Sub

答案 1 :(得分:0)

以下代码适用于通用FindAll代码。这也可以通过设置Application.FindFormat来使用,以便它可以与条件格式一起使用。

Sub FindBlack()
    Dim FoundRange As Range

    With Application.FindFormat
        .Clear
        .Interior.Color = RGB(0, 0, 0)
    End With
    Set FoundRange = FindAll("", LookIn:=xlFormulas, SearchWhat:=Range("K6:M200"), SearchFormat:=True)

    If Not FoundRange Is Nothing Then Debug.Print FoundRange.Address
End Sub

Function FindAll(What, _
    Optional SearchWhat As Variant, _
    Optional LookIn, _
    Optional LookAt, _
    Optional SearchOrder, _
    Optional SearchDirection As XlSearchDirection = xlNext, _
    Optional MatchCase As Boolean = False, _
    Optional MatchByte, _
    Optional SearchFormat) As Range

    'LookIn can be xlValues or xlFormulas, _
     LookAt can be xlWhole or xlPart, _
     SearchOrder can be xlByRows or xlByColumns, _
     SearchDirection can be xlNext, xlPrevious, _
     MatchCase, MatchByte, and SearchFormat can be True or False. _
     Before using SearchFormat = True, specify the appropriate settings for the Application.FindFormat _
     object; e.g. Application.FindFormat.NumberFormat = "General;-General;""-"""

    Dim SrcRange As Range
    If IsMissing(SearchWhat) Then
        Set SrcRange = ActiveSheet.UsedRange
    ElseIf TypeOf SearchWhat Is Range Then
        Set SrcRange = IIf(SearchWhat.Cells.Count = 1, SearchWhat.Parent.UsedRange, SearchWhat)
    ElseIf TypeOf SearchWhat Is Worksheet Then
        Set SrcRange = SearchWhat.UsedRange
    Else: SrcRange = ActiveSheet.UsedRange
    End If
    If SrcRange Is Nothing Then Exit Function

    'get the first matching cell in the range first
    With SrcRange.Areas(SrcRange.Areas.Count)
        Dim FirstCell As Range: Set FirstCell = .Cells(.Cells.Count)
    End With

    Dim CurrRange As Range: Set CurrRange = SrcRange.Find(What:=What, After:=FirstCell, LookIn:=LookIn, LookAt:=LookAt, _
        SearchDirection:=SearchDirection, MatchCase:=MatchCase, MatchByte:=MatchByte, SearchFormat:=SearchFormat)

    If Not CurrRange Is Nothing Then
        Set FindAll = CurrRange
        Do
            Set CurrRange = SrcRange.Find(What:=What, After:=CurrRange, LookIn:=LookIn, LookAt:=LookAt, _
            SearchDirection:=SearchDirection, MatchCase:=MatchCase, MatchByte:=MatchByte, SearchFormat:=SearchFormat)
            If CurrRange Is Nothing Then Exit Do
            If Application.Intersect(FindAll, CurrRange) Is Nothing Then
                Set FindAll = Application.Union(FindAll, CurrRange)
            Else: Exit Do
            End If
        Loop
    End If
End Function

答案 2 :(得分:0)

我意识到,因为我知道第一个值,并且我的宏的一部分先前选择了将被着色的整个范围,所以我可以使用这两个值来构建一个范围。

所以我做了:

Dim r1 As Range, r2 As Range
Set r1 = Selection
Set r2 = ActiveSheet.Range("K6")
Range(r2, r1).Select

它有效。我只是接近这个错误。