如何从包含(部分)每日数据的工作表中获取最终月度数据
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并将其放在第二项工作中,请牢记以下内容。
如果某月只有部分数据,最后输入的那个月的日期就是我需要的(后面的都是空白的)。例如,截至今天(2 月 7 日),第一个作品中最后填充的行 sheet 是 2 月 6 日,因为这只狗今天还没有完成它的(神话般的)攻击性行为。
同样,三月 没有 数据,因为显然我们还没有开始。对于这种情况,第二个 sheet 上的月份条目应该为空。
我不能只对一个月中每一天的值求和来在第二个 sheet 中创建一行。虽然看起来我想要的数字是累加的,但不是简单的加法。我真的需要从每日 table.
中提取特定的累加器行
我试过使用 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。
就是这样,不是世界上最漂亮的代码,但肯定是有用的代码(包括不需要手动重新计算)。
好的,一个给 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并将其放在第二项工作中,请牢记以下内容。
如果某月只有部分数据,最后输入的那个月的日期就是我需要的(后面的都是空白的)。例如,截至今天(2 月 7 日),第一个作品中最后填充的行 sheet 是 2 月 6 日,因为这只狗今天还没有完成它的(神话般的)攻击性行为。
同样,三月 没有 数据,因为显然我们还没有开始。对于这种情况,第二个 sheet 上的月份条目应该为空。
我不能只对一个月中每一天的值求和来在第二个 sheet 中创建一行。虽然看起来我想要的数字是累加的,但不是简单的加法。我真的需要从每日 table.
中提取特定的累加器行
我试过使用 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。
就是这样,不是世界上最漂亮的代码,但肯定是有用的代码(包括不需要手动重新计算)。