【发布时间】:2015-10-01 08:03:18
【问题描述】:
这个问题可以看作是几个小问题,但主要目的是唯一的。
TL;DR;
我想在工作表 N 上应用一个 excel 公式,该公式将考虑所有其他工作表中的所有相应列,同时对所有列应用一些相同的条件。
详情:
我的电子表格是一个非常简单和基本的费用会计,其中有许多按年份和日期命名的表格 2015.04、2015.05、2015.06 等。
第一行始终是标题(时间、日期、金额、项目、类别等)并且列始终是对应的(例如,在所有工作表中,列 H 将是类别,D 将是金额)
起始公式为:
=SUMIF('2015.07'.H2:H67;C20;'2015.07'.D2:D67)
// C20 is only a search condition like "travel", or "F&B"
它可以在这种简化的手动模式下工作,但是由于我们有电脑,而且我有一个程序员 M.O,我想稍微自动化一下,因此我的问题是:
1 - 如何将此公式应用于所有工作表,即使后来添加/删除了一些工作表,例如相当于“工作表通配符”
=SUMIF('*'.H2:H67;C20;'*'.D2:D67) // all sheets
或
=SUMIF('2015*'.H2:H67;C20;'2015*'.D2:D67) // all year
2 - 由于列的长度不同,应用手动范围似乎很愚蠢,所以我尝试了
=SUMIF('2015.07'.H:H;C20;'2015.07'.D:D)
但它给了我几个不同的错误。
3 - 我能理解的错误之一,那就是第一行 TITLE 不是数字,所以我尝试了
=SUMIF('2015.07'.H1:H67;C20;ISNUMBER('2015.07'.D1:D99) )// err 504
也试过了
=SUMIF('2015.07'.H1:H67;C20;IF(ISNUMBER('2015.07'.D1:D99) ))// err 509
和
=SUMIF('2015.07'.H1:H67;C20;sum(IF(ISNUMBER('2015.07'.D1:D99)) ))// err 508
现在,我知道我可以采用简单的工作起始公式,将其放在每一页中,选择不带标题的确切范围,然后在最后一个摘要页面引用所有其他的 - 但说真的,我也可以使用ABACUS,这不是为什么发明像 excel 这样的工具的原因。还是我认为这个工具太多了?就这么原始吗?我不知何故拒绝相信它,只是责备自己没有像我应该知道的那样了解它。
我也知道我可以编写一个VBA 宏,但是在这一点上,我将花费更少的精力和时间来花费some PHP excel 库编写一些PHP 行,将所有内容转储到SQL 中并正确执行。但又一次 - 是我的错(可能)还是 excel 的错??
附注>。如果这很重要,请使用 OpenOffice Calc,但也尝试在 excel 中更改语法和不同的错误代码。
编辑我 - 解决方案
查看@Axel Richards 的答案后,即使它不能完全帮助我解决问题,但它确实帮助我找到了方法。
首先,我发现我遇到的错误是由于工作表本身的命名造成的。
显然,像2005.07(点)这样的名称将给出err 501,而2005-07(连字符)将给出err 502。这让我明白我之前的一些尝试实际上是正确的——但是命名方案造成了错误。
所以对我有用的最终公式是 .
请注意,这是一个数组公式,因此需要输入 CTRL+SHIFT+ENTER 而不仅仅是 ENTER ,它会产生大括号(我之前不知道..)
{=SUMIF((INDIRECT("20150"&COLUMN(C$1:I$1)&".H"&ROW(A$1:A$500)));$J16;INDIRECT("20150"&COLUMN(C$1:I$1)&".D"&ROW(A$1:A$500)))}
没有通配符的事实只对了一半,因为解决方案是定义一个开始时间段和结束时间段,公式将计算中间的所有工作表。就我的目的而言,这是某种通配符。
像这样:
{=SUMIF((INDIRECT("start"&".H"&ROW(A$1:A$500)));$J16;INDIRECT("END"&".D"&ROW(A$1:A$500)))}
COLUMN(C$1:I$1) 的使用实际上是创建一个数组 (3-9),ROW(A$1:A$500) 告诉你公式要考虑 500 行的所有内容。
这不是一个灵活或优雅的解决方案,但它确实有效。
【问题讨论】:
-
一种方法是编写一个小宏来检查工作簿中的所有可用工作表,然后更新公式以包含所有工作表。因此,如果有人稍后添加新工作表,宏将检测到它,并在手动运行或加载工作簿时更新公式
-
@Ahmad 好的,但是公式本身呢?如何选择一整列并验证条件(例如 ISNUMBER 和 C20)
-
@Jerry - 即使在问题中复制的范围是错误的(应该是
D2:D67- 谢谢现在更正)它仍然应该工作,条件用人类语言说sum from D2 to D67 only if you find the string C20 inside H2 to H67所以如果范围是D2:D6它应该只对那个范围求和(不管我的计算是否错误:-)?另外-这就是问题的重点-如何将其应用于整列,而不管其长度如何.. -
好的,既然这个问题已经解决了,我首先要说的是(据我所知)没有可以为您提供文件中工作表列表的函数,也没有可以适应的函数添加/删除工作表。第二个问题可以通过使用
SUMPRODUCT获取条件来解决。您的公式将变为=SUMPRODUCT(('2015.07'.H1:H67=C20)*IF(ISNUMBER('2015.07'.D1:D97),'2015.07'.D1:D97,0))。 -
@Jerry,感谢您抽出宝贵时间解决这个问题。以上仍然给我错误,即使它不会
t - it does not resolve theD:D` 与Dx:Dn问题。如果是这样的话,我想我只需要手动完成所有操作
标签: excel excel-formula openoffice-calc