这一节课主要讲解如何使用 List.Range 函数从一个列表中提取一部分连续的元素(子列表),并结合之前学过的 Table 和 List 函数,详细演示一个制作“累加值(YTD)”的实战案例。
一、 核心函数:List.Range
- 功能:从列表中截取一段连续的元素,返回一个新的列表。
- 语法:
List.Range(列表, 偏移量(起始下标), [截取个数])
- 参数详解:
- 列表 (List):你要操作的那个源列表。
- 偏移量 (Offset):从哪个下标开始截取(注意:下标是从 0 开始的(计算机都是从0开始数数))。
- 截取个数 (Count):可选参数。如果不填,默认截取后面所有的;如果填了,就截取指定数量。
- 示例:
- 比如有一个列表:
{1, 2, 3, 4, 5} List.Range({1..5}, 2, 3)-> 从下标2(即数字3)开始,取3个数 -> 返回{3, 4, 5}。List.Range({1..5}, 0, 1)-> 从头开始,取1个数 -> 返回{1}。
二、 实战案例 :计算累加值 (YTD)
这是一个财务和数据分析中非常经典的需求:计算截止到当前的累计收入。
解决思路:
- 添加索引列:我们需要知道当前是第几行(下标),以便告诉
List.Range截取多少个数。- 操作:添加列 -> 索引列 -> 从0开始。
- 在使用
List.Range之前,我们先要使用List.把待提取的列,也就是预算实际发生数列表和预算数列表提取出来,分别命名为:ListActual和ListBudget。(这个List.Buffer它的主要作用是从上一个步骤的表格中提取出一列数据转换成“列表(List)”,并将其加载到内存中以提升后续计算的性能。)ListBudget = List.Buffer( 重排序的列[#"当月预算(Budget)"])ListActual = List.Buffer( 重排序的列[#"当月实际(Actual)"]) - 动态截取:对于每一行,截取从列表开头(下标0)到当前行(下标=索引)的所有数字。
- 公式:
List.Range(ListActual, 0, [索引] + 1) - 解释:
[索引]是从0开始的,所以截取个数要是[索引] + 1。
- 公式:
- 求和:把截取出来的这个子列表求和。
- 公式:
List.Sum(List.Range(预算实际发生数列表, 0, [索引] + 1))
- 公式:
详细介绍一下List.Buffer这个函数
这是一段 Power Query (M语言) 的函数。它的主要作用是从上一个步骤的表格中提取出一列数据转换成“列表(List)”,并将其加载到内存中以提升后续计算的性能。
1. 代码拆解:List.Buffer( 重排序的列[#"当月预算(Budget)"])
重排序的列:
这是指代 Power Query 中的上一个步骤的名称。表示这段代码是在名为“重排序的列”的步骤生成的数据基础上进行操作的。[#"当月预算(Budget)"]: 这是 Power Query 中提取单列数据的标准语法。- 它从“重排序的列”这个表格中,提取了名为
当月预算(Budget)的这一列。 - 在 M 函数中,
表名[列名]这种写法,会把这一列的数据从“表(Table)”结构转换成“列表(List)”结构 #""这个符号是因为列名中包含了中文字符和括号等非标准英文字母,所以需要用它包裹起来。
- 它从“重排序的列”这个表格中,提取了名为
List.Buffer(...):
这是这段代码的核心函数。Buffer的意思是“缓冲”。它的作用是将括号里的这个列表完整地读取并缓存在电脑的内存(RAM)中。
2. 为什么要用 List.Buffer?(核心意义)
Power Query 默认采用的是“延迟计算(Lazy Evaluation)”机制。也就是说,它只在绝对必要的时候才计算数据。
如果后续的步骤中需要多次重复引用这个“当月预算”列表(比如用来做复杂的条件判断、VLOOKUP式的跨表匹配、或者自定义列的循环计算),如果不加 List.Buffer,Power Query 可能会在每次用到它时,都把前面的步骤重新跑一遍来获取这个列表,这会导致刷新极度缓慢。
加上 List.Buffer 后,相当于告诉系统:“把这个列表固定在内存里,后面不管用多少次,直接从内存拿,不要再去重新计算了。” 这是一种非常重要且常见的 Power Query 性能优化手段。
3. 总结当前函数运行后的状态
通过这行代码,成功把“重排序的列”步骤里的“当月预算(Budget)”这一列提取了出来,变成了一个缓存在内存中的一维数组(列表)。后续的步骤就可以高速地调用这个列表了。
进阶:计算占比
- 有了累加值后,可以计算当前累加值占总发生数的比例。
- 公式:
[累加预算实际发生数] / [累加预算数],从而算出预算实现率,是超比例完成还是进度未达成?
三、 关键知识点总结
List.Range的本质:它是列表的“切片刀”。- 利用索引控制范围:在做累加、移动平均等计算时,
索引是控制切片范围的关键变量。 - 数据重组思维:制作固定资产卡片的过程,其实是把表格拆解成最基本的“积木”(Record),按照新的规则(表头+资产)重新拼装,最后再组装回表格的过程。这是 Power Query 处理复杂格式报表的核心心法。
💡 核心逻辑解释(请对照着视频课件以及Excel示例文件查看以下内容)
- 关于 ListActual:它只是一个中间变量(存放在内存里的一个清单),我们用它来做计算素材,但不能把它作为最终结果输出来。
![图片[1]-EP023 跨行计算和结构重组的利器List.Range(以计算YTD指标应用示例)-小微之家 | 汪斌带你开公司 | 老汪洞察](https://xiaoweihome-img.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/2026/03/20260318160621343.png)
- 关于 Table.AddColumn:
- 它的第一个参数必须是 表。所以我们要越过中间的 List 步骤,回头去抓 重排序的列。
- 它的计算逻辑里,用到了 ListActual 这个中间变量。
![图片[2]-EP023 跨行计算和结构重组的利器List.Range(以计算YTD指标应用示例)-小微之家 | 汪斌带你开公司 | 老汪洞察](https://xiaoweihome-img.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/2026/03/20260318161127952.png)










暂无评论内容