按颜色评估条件格式化单元格中的数据以返回列中的数据

时间:2014-11-21 19:11:27

标签: excel-vba excel-2007 conditional-formatting vba excel

我使用条件格式设置在名为“Loops_1000”的保存范围内将单元格设为红色,这些范围具有重复值。为了便于讨论,范围是A1:Z100。所以现在我可能有100个单元格,其中包含各种标记数据(例如C-03012034)。格式为常规。我想搜索范围并找到所有红色单元格(背景红色= 3我相信)并将它们中的数据按升序返回到单个空列(AA)。

我使用名称管理器在此站点上查找了一个解决方案,以创建一个名为CellColor的函数。它看起来像这样:

=GET.CELL(63,INDIRECT("rc",FALSE))

然后在一个单元格中我使用了以下内容:

=IF(CellColor=3,"EXISTING","NOT USED") as a test.  

它返回“未使用”并且没有返回“现有”(即使我尝试了各种颜色。对于一个简单的测试,我将调色板上的红色= 3并将"=CellColor"放入因此,我的红细胞返回值“3”。

我需要更多帮助来搜索范围,找到所有红色单元格并在每个红色单元格中给出值,并按升序将这些值返回到单个列中(或者我可以在获取数据后进行排序以简化功能)。

所以更大的问题是宏或VBA是否可以解释条件格式=重复值的单元格背景颜色

2 个答案:

答案 0 :(得分:1)

我确信有一种更有效的方式对此进行编码,但这可能对您有用。这假设第1行包含标题:

Sub Macro1()
'
' Macro1 Macro
'

'clears out the destination
    Range("B1:B100").ClearContents
'filters by color
    Rows("1:1").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$2:$A$100").AutoFilter Field:=1, Criteria1:=RGB(255, 0, _
        0), Operator:=xlFilterFontColor
'copies the visible area
    Range("A2:A100").Select
    Selection.SpecialCells(xlCellTypeVisible).Select
    Selection.Copy
'pastes into next column starting below the header
    Range("B2").Select
    ActiveSheet.Paste
'removes filer
    Selection.AutoFilter
End Sub

答案 1 :(得分:0)

  

所以更大的问题是宏或VBA是否可以解释条件格式=重复值的单元格背景颜色

有时,但几乎总是不值得努力。通常更简单的是基于原始条件进行确定,该原始条件将打开或关闭规则,而不是检查单元格是否为红色'或不。一些困难:

  1. 为了确定单元格是否因CF规则而变红,您必须确定CF规则是否将单元格变为红色,然后确定CF规则的当前状态是否为ON。
  2. 一个单元格可以有多个CF规则。必须检查每个格式选项是否为.Interior.Color = 3.StopIfTrue状态也会生效,以确定是否应该检查更多CF规则。
  3. 有许多不同类型的规则,因此每个决定都必须为每种规则都有代码子集。
  4. 基于公式的CF规则使用R1C1样式公式,因为它们属于“适用于:范围”左上角的单元格。 Application.Evaluate需要A1单元格引用,因此您需要Application.ConvertFormula从R1C1到A1 RelativeTo:= 正在检查的单元格,而不是“适用于:m”中的第一个单元格。
  5. 某些类型的CF规则(其中.AddUniqueValues DupeUnique:=xlDuplicate)没有我知道可以在任何给定单元格上确定CF状态的属性或方法。
  6. 正如您所看到的,当您真正想要的是生成重复列表时,这很快就会成为一个漏洞。这是一个简短的宏,用于查找,计算和整理Range("Loops_1000")中的重复项。

    Sub Dupes_in_Loops_1000()
        Dim c As Range
        With ActiveSheet
            .Columns("AA").ClearContents
            .Cells(1, "AA").Resize(1, 2) = Array("dupes", "nmbr")
            For Each c In Range("Loops_1000")
                If Application.CountIf(Range("Loops_1000"), c.Value) > 1 _
                  And Not CBool(Application.CountIf(.Columns("AA"), c.Value)) Then
                    .Cells(Rows.Count, "AA").End(xlUp).Offset(1, 0) = c.Value
                    .Cells(Rows.Count, "AA").End(xlUp).Offset(0, 1) = _
                      Application.CountIf(Range("Loops_1000"), c.Value)
                End If
            Next c
            With .Columns("AA")
                .Cells.Sort key1:=.Columns(1), order1:=xlAscending, _
                            Orientation:=xlTopToBottom, Header:=xlYes
            End With
        End With
    End Sub
    

    大量使用Application.CountIf可能不是最优雅的代码,但评估每个单元格的CF规则会变得更加高效。