Excel之PowerQuery 谈“优化”需先从义务回答问题开始
网友提问:

网友做的文件我已经上传到评论区大家可以自行观看
做的没问题,不要总拿程序员标准要求自己(“优化”二字当自身能力达到一定水平时才能触碰,在照猫画虎的阶段建议结果为王,速度都是浮云),我不理解为何不用奥运冠军的标准要求自己呢?
专业和非专业有本质区别,不用太纠结。
回答网友问题:
我不侧重优化,一是优化后的代码不好讲(需要有一定基础的人才能听懂),而且你下次做的时候不容易想到这样的方法。
二是现在2022年第4季度民间已经普及4090显卡了(我从全网评论区看到的),虽然显卡对我们的软件无帮助,但是4090显卡基本上配i9 13代 + 32G 及以上内存 + PCIE4.0 7000m/s 固态,面对如此高级的配置,我侧重优化怕大家笑话我穷,说我买不起4090
以下是我回答网友问题,我平时不优化的 :)
优化最基础的想法就是避开反复计算。
1、导入数据

2、选中“日期”,“厂家”,“备注” 三列,转换~逆透视列~逆透视其他列

3、直接完成,但是需要分步思考
【1】考虑逆透视后的表格每3行为一组

我们使用循环构建表先把每组的开始下标找到,如下所示,

我们遍历这个列表,配合List.Range使用
现在列表中的每个List里面有3个小List 这三个小List分别是那三行数据
现在你一定要把代码复制或敲出来点进去看一下那3个小List
因为你是在听我讲,这并不是你自己发现的,知识和语言不同之处就是,自己发现的知识规律更易于举一反三。

接下来我们再分析一下,如下图所示,红方框代表列表中的每个大List(以第1个List为例)
蓝方框和黄方框分别代表每个大List中的三个小List,最终网友的需求取蓝色方框+红圈列转行得到的数据

接下来我们先取蓝色方框
刚才我们已知下图红框代码列表中的每个List,我们要取第一个List

我们只需要使用{0} 来取每个List中的第一个小List , 现在我们想取每个List中的前4项,换句话说就是删除最后一项

我们使用List.RemoveLastN函数搞定,这些函数在107集PowerQuery中都有讲
建议复制代码或敲代码新自测试一下

解决完蓝色方框,下面我们处理红圈部分,那就简单了
就是把刚才 List.Range( Table.ToRows(逆透视的其他列) , x , 3 ) 返回的每个大List中的每个小List取最后一个值,我们就遍历 每个大List,然后利用List.LastN取最后一个值,再用List.Combine合并列表

最后换行转表,加上表头,最终代码如下

我只用了两步,一步逆透视,一步代码

本文章配套的文件我会发到评论区。

题外话,先能做到任何需求都把代码写出来,才能谈优化。
"优化"可能根本不存在,您们可以到游戏区看看,网友大多认为索尼和微软的游戏主机所谓的“优化”都是假的,就是降低画质。那咱们个人的水平,能和索尼和微软比吗?如果人家都是假4K 棋盘4K 你做为个人写代码谈“优化”...... :)
再说现在电脑都这么强了,咱们不会还在用几年前的电脑吧:)如果全网4090不是开玩笑的话,现在主流配置已经是i9 13代 + 32G + 7000m/s Pcie4.0了 如果你低于这个配置,要么就是有人说谎要么就是你该升级电脑了:)
如果想做到任何需求都把代码写出来最简单的办法是在B站上义务回答网友问题,你发视频称能帮网友义务回答问题,肯定有人找你,回答问题的UP有多少都不会有人嫌多。如果有人说你误导人,那他一定是怕你进步的,不要理他。
所以,我个人认为,凡是跟我谈“优化”二字的,一定是在网上做义务回答问题的(方向给你了而且利人利己),加油!

PowerQuery教程:https://www.bilibili.com/video/BV1oa4y1j75e