【问题标题】:Sheets Formula - ArrayFormula and CountIf表格公式 - ArrayFormula 和 CountIf
【发布时间】:2018-05-13 04:06:59
【问题描述】:

找不到合适的解决方案,因此发了这篇文章。

有 2 张表 - 出勤和工资单,其中出勤以旋转方式填写(参见示例)。

对于给定的日期范围,我想计算员工“缺席”的天数。下面的非数组公式(在薪资列“缺席”中)可以做到这一点。注意:带有员工 ID 的 A 列是一个动态列表,尽管它在示例中是固定的。

这个公式的工作原理:

  1. 将工资单人员匹配到出勤列标题人员 使用 MATCH
  2. 工资单 B1、B2 单元格中给出的日期范围
  3. 设置!$B$13 包含根据 (2) 的列范围
  4. OFFSET (3) by MATCH 以获得员工出勤率
  5. COUNTIF 员工出勤范围内“缺席”条目的数量 - 正确
  6. 当工资单人员“A5”更改为“A5:A15”时,ArrayFormula 确实不起作用

注意:不能保证 payroll-staffids 顺序和attence-header-staffids 的顺序相同 -> 这就是每个staffid 映射为 MATCHed 和 OFFSET 的原因。

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

样本表here

【问题讨论】:

    标签: google-sheets


    【解决方案1】:
    =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) { } 用于将工作人员 ID 添加到 2 行矩阵的“缺席”计数。

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

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

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


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

    在本例和其他情况下,我已就此向 Google 发送了反馈,这是一个类似于“命名范围”的功能请求“命名公式”,用于标准公式。这无需求助于 GAS。当公式变大时,这不是奢侈品,而是必需品。如果读者觉得这样的功能有用,请向 Google 发送反馈。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-29
      • 2017-09-28
      • 2020-09-19
      • 1970-01-01
      • 2021-09-22
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多