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

时间:2016-02-07 02:26:17

标签: lookup gnumeric

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

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

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

实际上,如果你认识我的狗,你就知道她无法咬任何东西,但我不得不快速想到一些反击。

另一张表需要具有每月的最终累计值:

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

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

  1. 如果某个月只有部分数据,则该月的最后输入日期是我需要的日期(后续日期将全部为空白)。例如,截至今天(2月7日),第一张工作表中最后填充的行是2月6日,因为今天狗还没有完成它(神话般的)侵略行为。

  2. 同样,March有 no 数据,因为很明显,我们还没有开始。对于这种情况,第二张表上的月份条目应为空白。

  3. 我不能只计算一个月内每个日期的值来在第二张表格中创建一行。虽然看起来我想要的数字正在累积,但它不仅仅是一个简单的添加。我真的需要从日常表中提取特定的累加器行。

  4. 我已尝试使用vlookup但是,虽然可以找到列中的第一个空白单元格,但它并没有给我最后一个非空白单元格。我也无法弄清楚如何按月分组。

    我之后的事情是:

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

    其中:

    • 第一个参数是查找区域;
    • 第二个是要提取的列;和
    • 第三个是条件(非空白,月份是1月)。

1 个答案:

答案 0 :(得分:1)

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

所以我在摘要表中创建了几个列(另一个是详细信息表),一个用于保存月份编号,一个用于保存月份的最后一天,最后一个用于保存我在其中的行在源表中找到了该日期:

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$2),Bn+1,1)-1

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

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

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

使用match的优点是它会找到精确值或最小值小于或等于它。因此,如果3月的详细信息表中没有日期,它将为您提供2月份最后一段数据的行。

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

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

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

该语句中的条件检查行的日期单元格,该行被发现将其月份与我们正在查找的月份进行比较。如果它们不同,那么那个月没有明确的行(如前面提到的2月/ 3月的情况,如果找到3月底的最后一个日期实际上是2月,那么3月没有数据)。 / p>

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

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

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