表格公式 - ArrayFormula和CountIf

时间:2018-05-13 04:06:59

标签: google-sheets

无法找到合适的解决方案,因此这篇文章。

有2张 - 出席和出席出勤率以薪资方式填写的薪资单(见样本)。

对于给定的日期范围,我想计算员工的“缺席”天数。下面的非数组公式(在薪资栏“缺席”中)就是这样做的。注意:带有人员ID的A列是动态列表,即使它已在样本中固定。

此公式的工作原理:

  1. 将payroll-staffid与出勤列-list-staffid相匹配 使用MATCH
  2. 单位工资单B1,B2
  3. 中给出的日期范围
  4. 设置!$ B $ 13包含按(2)
  5. 列的柱状范围
  6. OFFSET(3)由MATCH获得员工出勤
  7. 计算员工出勤范围内“缺席”条目的数量 - 正确
  8. 当工资单人员“A5”更改为“A5:A15”
  9. 时,ArrayFormula会 NOT 工作

    注意:无法保证payroll-staffids订单和attendence-header-staffid的顺序相同 - >这就是为什么每个staffid都映射MATCHed和OFFSET。

    =COUNTIF(OFFSET(INDIRECT(Settings!$B$13),0,MATCH(A5,Attendance!$B$1:$1,FALSE)),"Absent")
    

    样本表here

1 个答案:

答案 0 :(得分:0)

=ArrayFormula(VLOOKUP(A5:A15, TRANSPOSE({INDIRECT(AttHeader,FALSE);MMULT(TRANSPOSE(SIGN(ROW(INDIRECT(AttUnitMatrix)))),IF(INDIRECT(AttData,FALSE)="Absent",1,0))}),2,FALSE))

请参阅OP中的链接样本表。 对于定义的名称;请参阅“设置”表。所有范围都是单独计算的,以减小公式的大小。

1)开始以“阻止模式”运行,忽略职员ID的顺序。 “AttData”是数据块的字符串表示,如果“Absent”,则映射为1,否则为0。

IF(INDIRECT(AttData,FALSE)="Absent",1,0)

2)此矩阵乘以范围字符串“AttUnitMatrix”中的单位行矩阵

TRANSPOSE(SIGN(ROW(INDIRECT(AttUnitMatrix))))

3)MMULT返回的“缺席”计数

4){}用于将staff-id前置为2行矩阵的“Absent”计数。

{INDIRECT(AttHeader,FALSE);MMULT(...)}

5)由VLOOKUP(2列矩阵)访问TRANSPOSE结果

6)VLOOKUP通过将key-staff-id与生成的(staff-id / absent-count)对的行矩阵相匹配来处理无序的staff-id。

烟花......拍拍我的背:)

在这种情况下,以及其他人,我已经向Google发送了有关此问题的反馈,这是一个功能请求“命名公式”,类似于“命名范围”,用于标准公式。这是没有诉诸GAS。当公式变大时,这不是奢侈品,而是必需品。如果读者发现此功能有用,请将反馈发送给Google。

eg: UnitMatrix($1) => TRANSPOSE(SIGN(ROW(INDIRECT($1))))
MMULT(UnitMatrix(AttUnitMatrix),IF(INDIRECT(AttData,FALSE)="Absent",1,0))