我正在制作一份项目和资源分配报告。我需要帮助来生成公式以在报告的右侧部分显示摘要。
以下是我的报告的规格:
- A 列第 2 行至第 15 行代表为每个项目分配的资源(人员)
- B列、C列....代表每个项目每月分配的资源百分比
- A 列的每个资源合并到 2 个单元格,因为每个资源每月可以参与 1 个或 2 个项目
- 一个月内从事单个项目的资源将合并两个单元格。从事 2 个项目的资源将有 2 行代表该项目
- 每个项目都有一个数字,代表分配给该项目的资源百分比
以下是我的报告的截图:
在这里,在摘要中,我表示每个人将在每个项目上花费的总周数。为了简化计算,我假设每个月相当于正好 4 周。所以,
- 如果人员 A 在 2 月份全力投入项目 B。那么项目 B 的总结中需要考虑的总结数字应该是 4
- 同样,如果 A 在 1 月份分别在 2 个项目上工作,那么要考虑的总计时间应该是每个项目 2-2 周
一般来说,总结中要考虑的数字可以用数学表示为:
4 *[Percentage from column] / 100
以下是我想要实现的目标:
- 从单元格读取字符串(F1 - J1)
- 在两行(B2,C2 ...)和(B3,C3 ...)的人员列中进行查找以获取以项目字符串开头的单元格
- 从上述单元格中筛选数字(来自步骤 2)对数字求和,然后除以 100 并乘以 4(得到周数)
这是我针对类似问题创建的答案,作为参考这里:
=IFERROR((IFERROR(SUM(--((TRIM(RIGHT(SUBSTITUTE(FILTER($B2:$C2,ISNUMBER(SEARCH(J$1,$B2:$C2)))," ",REPT(" ",99)),99))))), 0) + IFERROR(SUM(--((TRIM(RIGHT(SUBSTITUTE(FILTER($B3:$C3,ISNUMBER(SEARCH(J$1,$B3:$C3)))," ",REPT(" ",99)),99))))), 0))*4, "")
这给了我项目 B 的 6。有没有办法简化这个?我觉得我在这里做了很多多余的操作。此外,如果未找到项目,它会返回 0。我更喜欢用空字符串代替它
如果有更好的方法来执行此计算,请随时提出建议。
笔记:
- 对于合并两个单元格的列,该人仅应考虑一次计算。
- 我的摘要计算基于两行数据
- 这里我使用人员名称(“人员 A”、“人员 B”等)和项目名称(“项目 A”、“项目 B”等)字符串作为占位符文本。在实际报告中,这些将变为带有随机字母的实际值。
PS:这与我之前的问题类似,我在单列上生成摘要,其中列内的两个单元格可以合并:Excel - 根据起始字符串过滤行,从过滤后的行中读取数字并执行算术运算以生成列摘要。但是,这里我计算了两行来得到汇总。合并行单元格只需要考虑一次即可计算。
答案1
也许,尝试一下这个更短的公式建议。
1] 在 中F2
,横向和纵向复制公式:
=SUMPRODUCT(4*TEXT(SUBSTITUTE($B2:$C3,F$1,""),"0%;;;\0"))
2]你之前的问题也可以用这个公式来解决,我把它放在了A19:C23中。
在 中B19
,横向和纵向复制公式:
=SUMPRODUCT(0+TEXT(SUBSTITUTE(B$2:B$15,$A19,""),"0%;;;\0"))
和,
编辑
删除 0
1]使用单元格格式:
所有公式单元格格式在>>“会计”>>“符号”,选择“无”>>“小数位”:点击“1”
2] 使用 IFERROR(1(/1.......),"") 添加到 F2 公式,变成 >>
=IFERROR(1/(1/SUMPRODUCT(4*TEXT(SUBSTITUTE($B2:$C3,F$1,""),"0%;;;\0"))),"")
答案2
解决方案更加复杂,因为要处理的范围是多维的。(在您之前的问题中,它只是一个维度)。
一种处理方法是将其转换为一维数组,可以使用TEXTJOIN
和 来完成FILTERXML
。有一个限制,即TEXTJOIN
函数生成的字符串不能超过32,767
字符。如果这会成为问题,那么 VBA 或 Power Query 解决方案可能会更好。
此外,FILTERXML
在 Mac 版本或 Excel Online 上不可用。
如果不适用这些限制,那么
F2: =IFERROR(4*SUM(FILTERXML("<t><s>" & SUBSTITUTE(FILTERXML("<t><s>" &TEXTJOIN("</s><s>",TRUE,$B2:$C3) & "</s></t>","//s[starts-with(.,'" & F$1 & "')]")," ","</s><s>") & "</s></t>","//s[last()]")),"")
向右和向下填充
我们首先创建一个
XML
(使用TEXTJOIN
)为每个单元创建一个单独的节点- 我们的参数仅返回第 1 行中的项目名称
xPath
的节点。start-with
- 然后我们使用
SUBSTITUTE
创建另一个XML
基于空格分隔的节点并xPath
返回最后一个节点。 - 进行数学运算。
- 我们的参数仅返回第 1 行中的项目名称
编辑:
如果你不是有FILTERXML
函数,试试这个公式(O365 Mac 或 Windows 和 Excel Online)它使用不同的方法将二维数组转换为一维数组进行处理:
=IFERROR(SUM(4*TRIM(RIGHT(
SUBSTITUTE(LET(
seq,IF(SEQUENCE(99)=1,1,(SEQUENCE(99)-1)*99),
x,TRIM(MID(TEXTJOIN(REPT(" ",99),TRUE,$B2:$C3),seq,99)),
y, FILTER(x,LEFT(x,LEN(F$1))=F$1),y),
" ",REPT(" ",99)),99))),"")
此公式仍受 32,767 个字符的限制。您是否会遇到这种情况主要取决于项目名称中有多少个空格。计算公式大致如下:
a = 单元格中的平均字符数
b = 单元格中的空格数
c = 细胞数量
(a+b*99) * c
例如,如果您有15
字符、5
空格和24
单元格,那么将会得到大约12,000
字符。