1

好的,一个为 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. 同样,3 月份也没有数据,因为显然我们还没有从那里开始。在这种情况下,第二张纸上的月份条目应该是空白的。

  3. 我不能仅仅将一个月中每一天的值相加来在第二张表中创建一行。虽然看起来我想要的数字是在累积,但并不是简单的加法。我真的需要从每日表中提取特定的累加器行。

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

我追求的是:

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

在哪里:

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

1 回答 1

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 月没有数据)。

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

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

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

于 2016-02-24T05:32:54.123 回答