我正在研究Excel中的一些排班功能,其基础是我们的人数有限,需要在工作中填写,涵盖多个站点的轮班
在规划名单时,我们会使用一套简单的彩色单元格来填补人们在日班,夜班,没有名册,年假等时的情况。鉴于我们计划有多个站点,我需要有一个快速的公式,检查该个人是否已在多个站点同时轮班(显然不可能),所以我们可以很容易地确定计划阶段何时发生冲突。公式需要返回一个TRUE或值(例如,count> 1表示该人的多个赋值),这样我就可以使用条件格式或VBA来突出显示一个单元格/行并引起对冲突的注意< / p>
我尝试做的是对使用几种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 已在网站1 和分配了一个班次2014年5月21日的网站2 。如果符合条件的个人姓名与这些单元格相对应,那么我所追求的基本上是计算行上有色单元格的数量。对于这个例子,如果是
=COUNTIFS(C8:AQ8, "Joe Bloggs 4", C12:AQ12, *Cell is Coloured*)
细胞的颜色并不重要(因此第一个功能ISFILLED更好,因为我不需要填充的参考单元),因为它只是一种感觉检查。
感谢任何帮助/指针,因为它,我被卡住了!
答案 0 :(得分:0)
您将无法使用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
可以将此UDF称为数组公式,即选择一系列单元格,在左上角的单元格中键入公式(同时仍然选择整个范围),然后按 Ctrl - 移 - 输入。然后你可以操作返回的数组,例如SUM
它。
使用示例:
其中--
double减去将布尔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
你问了帮助/指针;这应该足以让你脱离困境。您可以调整此方法以满足您的确切需求。