如何从包含(部分)每日数据的工作表中获取最终月度数据

How to get final monthly data from a worksheet containing (partial) daily data

好的,一个给 Gnumeric 专家的。我认为这个问题没问题,因为有很多与 Excel 公式有关的问题,尽管事实上我不确定应该将其视为编程本身。

我有一个包含两个 sheet 的工作簿,第一个包含一年中每一天的一行,并且有一列在一年中累积了某个值:

Date         TimesMyDogHasBittenMe   Cumulative
----------   ---------------------   ----------
2016-01-01                       4            4
2016-01-02                       1            5
:
2016-01-31                       7           92
2016-02-01                       3           95
:

实际上,如果你认识我的狗,你就会知道她不会咬人任何东西,但我必须尽快想出一些对策。

另一个sheet需要每个月的最终累计值:

Month   MonthlyBites
-----   ------------
Jan               92
:

所以问题是,如何在第一项工作中提取每个给定月份的最后一行sheet并将其放在第二项工作中,请牢记以下内容。

  1. 如果某月只有部分数据,最后输入的那个月的日期就是我需要的(后面的都是空白的)。例如,截至今天(2 月 7 日),第一个作品中最后填充的行 sheet 是 2 月 6 日,因为这只狗今天还没有完成它的(神话般的)攻击性行为。

  2. 同样,三月 没有 数据,因为显然我们还没有开始。对于这种情况,第二个 sheet 上的月份条目应该为空。

  3. 我不能只对一个月中每一天的值求和来在第二个 sheet 中创建一行。虽然看起来我想要的数字是累加的,但不是简单的加法。我真的需要从每日 table.

  4. 中提取特定的累加器行

我试过使用 vlookup 但是,虽然它可以找到列中的第一个空白单元格,但它没有给我最后一个非空白单元格。我也不知道如何按月分组。

我追求的是:

=lastif("a2:c999","c","c!= '' and month('a') = 1")

其中:

好的,这就是我最终的做法。它有点复杂,所以我仍然对其他解决方案持开放态度。最初,我添加了 Python 插件并编写了一些定制代码来执行此操作,但这似乎存在问题,因为如果不使用 F9[=51 进行手动更新操作,它就不会更新=].

所以我在摘要中创建了几列sheet(另一列是详细信息sheet),一列用于保存月份,一列用于保存月份的最后一天,最后一个保留我在源 table:

中找到该日期的行
Month    Month#    LatestDate    Row    Cumulative
-----    ------    ----------    ---    ----------
Jan           1       31/1/16     36            92
Feb           2       29/2/16     57            95
Mar           3       31/3/16     57

月份数是一个简单的递增值,但如果需要,您可以根据月份名称计算它 - 我选择了最简单的方法。

当月的最晚日期是公式:

=date(year(detail!$A),Bn+1,1)-1

其中 detail!$A 是详细信息 sheet 上的第一个日期单元格(仅用于获取当前年份 - 我每年都有一个单独的价差 sheet)。本例中的 n 是上面给出的数据行。此公式获取下个月的第一天并减去一个以获得所需月份的最后一天。

该行在包含日期的详细数据范围内使用查找函数:

=match(Cn,detail!$A:$A9,1)

使用match的好处是它会找到精确值或小于或等于它的最高值。因此,如果详细信息 sheet 中没有三月份的日期,它将为您提供二月份最后一条数据的行。

这里有点复杂。 Gnumeric 有一个 indirect 函数,当给定一个表示单元格的字符串时,该函数将 return 该单元格的内容。

因此 =evaluate("A3") 等价于 =A3。在那个特定情况下不是很有用,但是 vital 如果我们想动态构建单元格地址然后引用该单元格的内容。因此 Cumulative 个单元格的表达式为:

=if(month(indirect(concatenate("detail!a",fixed(Dn,0,TRUE))))=Bn,
    indirect(concatenate("detail!c",fixed(Dn,0,TRUE))),
    "")

该语句中的条件检查找到的行的日期单元格,以将其月份与我们要查找的月份进行比较。如果它们不同,则该月份没有详细信息行(如前面提到的 February/March 案例,如果查找三月底时找到的最后一个日期实际上是在二月,则三月没有数据) .

在这种情况下,单元格设置为空字符串。

否则,我们从给定的详细信息行中提取相关列并在摘要中使用它 sheet。

就是这样,不是世界上最漂亮的代码,但肯定是有用的代码(包括不需要手动重新计算)。