【问题标题】:Counting cells based on their colour and other criteria根据颜色和其他标准对细胞进行计数
【发布时间】:2014-05-27 06:32:26
【问题描述】:

我正在使用 Excel 中的一些排班功能,其基础是我们需要为工作排班的人数有限,涵盖多个站点的轮班

在规划花名册时,我们使用一组简单的彩色单元格来填写人们在白班、夜班、未花名册、年假等的时间。鉴于我们计划有多个站点,我需要有一个快速公式可以检查该个人是否已被安排在多个站点同时轮班(显然不可能),因此我们可以在计划阶段轻松识别何时存在冲突。该公式需要返回 TRUE 或值(例如,count >1 表示该人有多个分配),以便我可以使用条件格式或 VBA 突出显示单元格/行并引起对冲突的注意

我尝试做的是对使用几种 VBA 方法着色的单元格进行求和/计数:

Function ISFILLED(MyCell As Range)
    If MyCell.Interior.colorIndex > 0 Then
        Result = True
    Else
        Result = False
    End If
    ISFILLED = Result
End Function

和/或:

Function ColorFunction(rColor As Range, rRange As Range, Optional SUM As Boolean)
    Dim rCell As Range
    Dim lCol As Long
    Dim vResult
    lCol = rColor.Interior.ColorIndex
    If SUM = True Then
        For Each rCell In rRange
            If rCell.Interior.ColorIndex = lCol Then
                vResult = WorksheetFunction.SUM(rCell, vResult)
            End If
        Next rCell
    Else
        For Each rCell In rRange
            If rCell.Interior.ColorIndex = lCol Then
                vResult = 1 + vResult
            End If
        Next rCell
    End If
    ColorFunction = vResult
End Function

这些都可以单独工作,但我无法将其与 SUMIFS/COUNTIFS 样式函数结合起来,仅计算当该人的姓名出现在该分配中时着色的单元格的数量。

如果您查看花名册中的示例图片,您会发现 Joe Bloggs 4Site 1 都被分配了班次站点 2 于 2014 年 5 月 21 日。我所追求的本质上是计算行中彩色单元格的数量,如果符合条件的个人姓名与这些单元格相反。对于这个例子,如果是

=COUNTIFS(C8:AQ8, "Joe Bloggs 4", C12:AQ12, *Cell is Coloured*)

单元格的颜色无关紧要(因此第一个函数 ISFILLED 更好,因为我不需要参考单元格进行填充),因为它只是一个意义检查。

感谢任何帮助/指针,事实上,我被卡住了!

【问题讨论】:

  • 你应该学会正确缩进你的代码;这使其他人(和您自己)更容易阅读。这次为你做了。
  • 谢谢-草率的复制/粘贴,将零碎的碎片拼凑在一起,试图获得不同的结果,对不起。我会记住的
  • 我建议在这些单元格中使用有价值的东西,让您的生活更轻松(如果可能的话)。即使是与背景颜色相同的空格或 1 也不会显示,您使用 Excel 函数就足够了
  • @xificurC 如果我不能让它通过颜色工作,那将是解决方案 - 谢谢。在实践中,名单在计划期间被砍掉/改变了很多,我试图保持简单,以便航班/住宿。人们可以继续使用他们习惯的日程安排颜色

标签: excel function vba


【解决方案1】:

您将无法为此使用 SUMIFSCOUNTIFS。你需要这些方面的东西:

Function IsFilledArr(rng As Range) As Variant
    Dim i As Long, j As Long
    Dim v As Variant
    ReDim v(1 To rng.Rows.Count, 1 To rng.Columns.Count)
    For i = 1 To rng.Rows.Count
        For j = 1 To rng.Columns.Count
            v(i, j) = rng.Cells(i, j).Interior.ColorIndex > 0
        Next j
    Next i
    IsFilledArr = v
End Function

这个UDF可以称为数组公式,即选择一个单元格区域,在左上角的单元格中键入公式(整个区域仍然被选中),然后按Ctrl -Shift-Enter。然后您可以对返回的数组进行操作,例如SUM它。

示例用法:

-- 双减号将布尔 TRUE/FALSE 值(不可求和)转换为 1 和 0(可求和)。

我会让你调整它以适应你的特殊要求。

编辑:你想要更多:

计算 C 列中填充单元格的数量,其中 B 列中有一个相邻的填充单元格 - 在这种情况下,C4 将是唯一符合该条件的单元格。

这个公式可以解决问题(作为数组公式输入):

=SUM(IF(IsFilledArr(B2:B7)+IsFilledArr(C2:C7)>1,1))

注意使用SUM(IF(...,1)) 来模仿COUNT。这就是处理数组公式时的方法。

在此处阅读更多信息:http://www.cpearson.com/excel/ArrayFormulas.aspx

您要求帮助/指点;这应该足以让你摆脱困境。您可以调整此方法以满足您的确切需求。

【讨论】:

  • 这很好用,我需要检查的唯一情况是单元格是否已填充,但需要对 sumifs/countifs 样式函数有多个标准。在上面的示例中,我希望 C11 中的公式计算 C 列中填充单元格的数量,其中 B 列中有一个相邻的填充单元格 - 在这种情况下,C4 将是唯一的符合该条件的单元格。在我的情况下,我不是检查相邻单元格是否已填充,而是检查相邻单元格是否包含文本“Joe Bloggs X”
  • @Jadyn:我已经扩展了答案。现在由你来带球奔跑。
  • 感谢额外的信息,这一点澄清帮助我让它工作。标记为答案,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多