Excel 根据颜色和其他标准对细胞进行计数

Excel 根据颜色和其他标准对细胞进行计数,excel,function,vba,Excel,Function,Vba,我正在用Excel开发一些排班功能,其基础是我们需要排班的人数有限,涵盖多个地点的轮班 在规划名册时,我们使用一组简单的彩色单元格来填充人们上白班、夜班、没有名册的年假,等等。鉴于我们计划了多个地点,我需要有一个快速公式来检查该人员是否已在多个地点同时轮班,这显然是不可能的,因此我们可以很容易地确定在规划阶段何时存在冲突。公式需要返回一个TRUE,或值,例如count>1意味着该人员有多个赋值,以便我可以使用条件格式或VBA突出显示单元格/行,并提请注意冲突 我尝试的是对使用一些VBA方法着色的

我正在用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 4在2014年5月21日被分配到了站点1和站点2的班次。我要做的基本上是计算行中彩色单元格的数量,如果符合条件的个体名称与这些单元格相对应。对于这个例子,如果

=COUNTIFS(C8:AQ8, "Joe Bloggs 4", C12:AQ12, *Cell is Coloured*)
单元格的颜色无关紧要,因此第一个函数ISFILLED更好,因为我不需要填充参考单元格,因为它只是一个感官检查

感谢您的帮助/指点,因为我被卡住了

您将无法使用SUMIFS和COUNTIFS进行此操作。你需要这样的东西:

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
此自定义项可以作为数组公式调用,即选择一个单元格区域,在左上角单元格中键入公式,同时整个区域仍处于选中状态,然后按Ctrl-Shift-Enter键。然后可以对返回的数组进行操作,例如求和

用法示例:

其中-double减号将不可求和的布尔真/假值转换为可求和的1和0

我会让你根据你的特殊要求来调整

编辑:您想要更多:

计算C列中填充单元格的数量,其中B列中有一个相邻的填充单元格-在这种情况下,C4将是唯一满足该标准的单元格

此公式将执行作为数组公式输入的技巧:

=SUM(IF(IsFilledArr(B2:B7)+IsFilledArr(C2:C7)>1,1))
注意使用SUMIF…,1来模拟计数。这就是处理数组公式时的方法

请在此处阅读更多信息:


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

你应该学会正确地缩进你的代码;这使别人和你自己更容易阅读。这一次是为你做的。谢谢-为了得到不同的结果,把零碎的东西切碎在一起,造成了草率的复制/粘贴。对不起。我会记住的,我建议在这些细胞中使用有价值的东西,如果可能的话,让你的生活更轻松。即使是一个与背景颜色相同的空格或1也不会显示,您可以使用Excelfunctions@xificurC这将是解决方案,如果我不能让它通过颜色工作-谢谢。实际上,在计划过程中,花名册被砍掉了/改变了很多,我试图保持它的简单,以便航班/住宿能够正常进行。人们可以继续使用他们习惯的调度颜色,这很好,我需要检查的唯一情况是单元格是否已填充,但需要为sumifs/countifs样式函数设置多个条件。在上面的示例中,我希望C11中的公式能够计算C列中填充单元格的数量,其中B列中有一个相邻的填充单元格,在这种情况下,C4将是唯一满足该标准的单元格。在我的例子中,我不是检查相邻单元格是否已填充,而是检查相邻单元格是否包含文本Joe BloggsX@Jadyn当前位置我已经扩展了答案。现在就看你带球跑动了。感谢你提供的额外信息,这一点澄清帮助我让它工作起来。标记为答案,谢谢