经常看到有人出一些Excel的题,要求用公式解,然后注明一句:用函数,不允许增加辅助列!比如这种:
——怎么样?“还不算太难……哈哈”。
不过,说实话,我对“用函数,不允许增加辅助列”这句话特别,特别,特别的反感——因为,有很多问题,本来要求用函数解就很麻烦,然后还不允许增加辅助列——以我的智商,很多时候真是写不出来嘛!
那怎么办?——该加辅助列加辅助列啊,该用Power Query用Power Query啊……本来就很简单的事,为什么要搞那么复杂?比如,这个问题用Power Query来做,分组、改个函数:
轻松,愉快,不用脑……
但是,大家其实知道我的重点是讲Power系列,所以,前面这个用Power Query轻松解决Excel中的基本问题的例子,并不是今天的重点——我今天真正想说的是,“用函数,不允许增加辅助列”这种问题,在Power Query本身的使用中,也需要注意。
比如下面这个例子,是群里一位PQ爱好者给出的,即要根据左表中同一“姓名”同一“工作单位”的“工作时间”逐月连续的数据进行分组,并得到“开始时间”和“结束时间”,如下图所示:
当然,作为一位Power Query爱好者,纯粹是为了研究、练手,并且直接给出了自己的“一个公式搞定”的解决方案,并自觉得比较复杂——这种分享精神,非常“抵赞”!
公式如下:
有兴趣的朋友可以研究一下(貌似由于微信文章的限制,超过一定的行数会出现代码):
代码语言:javascript复制=Table.Group(
Table.FillDown(
Table.FromColumns(
Table.ToColumns(a)
&{List.Transform(
{0..Table.RowCount(a)-1},
each if _=0 then 0
else if a[工作单位]{_}=a[工作单位]{_-1}
and a[工作时间]{_}=Date.AddMonths(a[工作时间]{_-1},1)
then null
else _)},
Table.ColumnNames(a)&{"分组"}),
{"分组"}),
{"姓名","分组","工作单位"},
{{"开始时间",each List.Min([工作时间])},
{"结束时间",each List.Max([工作时间])}}
)
我简单数了一下,这个公式大概用了10个不同的函数,再加上条件判断语句、以及对PQ数据引用的熟练运用——对于大多数的普通Excel用户来说,写出这个长公式,绝对不是一件容易的事——这也不是我推荐大家使用Power Query的初衷。
那么,对于普通用户,这个问题怎么解决呢?其实只要加个辅助列,然后要写的公式就比较简单了,具体过程如下:
Step 01添加索引列
Step 02借索引列写公式,确定到需要分组内容的第一行
代码语言:javascript复制
if [索引]=0
then [索引]
else if a{[索引]-1}[姓名]=[姓名]
and a{[索引]-1}[工作单位]=[工作单位]
and a{[索引]-1}[工作时间]=Date.AddMonths([工作时间],-1)
then null
else [索引]
看起来很长?不过理解起来和写起来容易多了,如果感觉还有难度,那回头看一下关于PQ表结构的文章《重要!很重要!非常重要!理解PQ里的数据结构(三、跨行引用)》。
Step 03填充
Step 04分组
结果就这样出来了:
到了这里,终于到谈谈感想的时候了。
除非你是因为爱好,为了练技能……在实际工作中,绝大多数的时候,无论你是在Excel里还是Power Query里,你并不需要去写一些复杂到可以“引以为傲”的公式,而是通过换一个方式,加个辅助列,哪怕甚至加个辅助表,那些看起来很麻烦的事情,实际就变得简单了很多。
同时,非常感谢各位爱好者、大神来为大家提供多种多样的问题解决思路和方法,只要不是这样的,我们无任欢迎!