我正在研究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已在21/05/2014的站点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
此UDF可以作为数组公式调用,即选择一系列单元格,在左上角的单元格中键入公式(同时仍然选择整个范围),然后按Ctrl-Shift-Enter。然后你可以操作返回的数组,例如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
你问了帮助/指针;这应该足以让你脱离困境。您可以调整此方法以满足您的确切需求。