cell+多维引用+n(if(1,))+mmult置换2列数据
小伙伴们好。昨天说了mmult置换2列数值或2列文本的方法,并且在最后给大家留了个思考题,如何置换1列文本和1列数值呢?今天就来说说这个问题。其实大体的思路和昨天的差不多,只是在降维处理的方式上有所不同。我们昨天对文本降维用的t函数,但是一列数值和一列文本,再用t降维就不行了,会把数字丢失。当然用n函数也是不行的,会把文本丢失。那就要用到cell这个函数。
还是先看例子吧,下图左表A列是出生日期,B列是姓名。现在要置换为右表所示,就是I和J2列。和昨天的方法一样,把数据区域转换为行列结合的2列数字,然后用mmult置换2列数字,接下来用text转为文本型的单元格地址,再用indirect转为多维引用,最后用cell取得对应的内容。
mmult的第1参数ROW(3:10)/1%+COLUMN(A:B)返回的结果如下图①所示,用A3:B10这个区域的行号乘以100再加上列号。第2参数还是1-munit(2),如下图②所示。
=MMULT(ROW(3:10)/1%+COLUMN(A:B),1-MUNIT(2))返回的结果如下图④所示,这样就把2列数字置换了。接下来就要用text转为文本型单元格地址,也就是R1C1的样式。
=TEXT(MMULT(ROW(3:10)/1%+COLUMN(A:B),1-MUNIT(2)),"R0C00")这部分就把上一步的数值转为R1C1样式的文本型单元格地址,如下图灰色部分所示。
下图的公式用indirect返回引用,形成了多维引用;然后用t函数降维,昨天也是这么做的,但得到的结果如下图所示。发现只有姓名,没有日期。其实是t函数把数字(日期就是数字)变为空文本了,这样的话就把数字丢失了。所以这种方法就不行了。
那么我们为了解决这个问题,就要用到cell+多维引用+t/n(if(1,))这个搭档。t或n(if(1,))把一个数组在时间和空间上整合在了一起,这话具体什么意思,我现在也不懂,会用就行了。把它看作一个常量数组或者一个整体就可以了。比如vlookup的第1参数不支持数组的运算,当用了t/n(if(1,))结构后就支持了。
=CELL("contents",INDIRECT(TEXT(N(IF(1,MMULT(ROW(3:10)/1%+COLUMN(A:B),1-MUNIT(2)))),"R0C00"),))这部分就得到了置换后的效果,虽然下图显示的是错误值,但选中公式按F9就可以看到结果。为什么放在单元格中是错误值呢?据说是易失性函数和多维引用的结果不能直接输出在单元格中。如果想要输出结果,外面可以套个index函数,如下第2图所示,得到的数字就是日期。
再来简单说一说上面的公式,我在mmult的前面加上了n(if(1,)),那么它返回的结果可以看作一个整体。因为mmult返回的结果是数字,所以用n+if;如果返回的是文本可以用t+if,比如你可以在text的前面放置t+if。形成一个整体后参与到多维引用中,这样的方式形成的多维引用和普通的多维引用有所差别,而用cell函数正好和它结合使用。现在的我对这方面的理解也很有限,所以也说不清楚,主要还是靠体验,多练习你就会有自己的理解。
cell是一个信息函数,它可以返回引用中第1个单元格的一些信息,比如地址,行号,列号,内容,格式,文件名等。函数语法结构为CELL(info_type, [reference]) ,有2个参数。第1个参数是个文本值,指定要返回的信息类型;第2参数是可选参数,必须是单元格引用,不能是数组。
下图是cell第1参数指定的一些单元格信息类型,常用的有地址,列号,内容,文件名,格式,行号,宽度等。
下面看几个简单的示例。输入公式=CELL("contents",A1:C3),返回的结果是A。第1参数"contents"代表内容,也就是单元格的值。第2参数的区域是A1:C3。值得注意的是:它不是返回A1:C3整个区域的内容,而是返回这个区域第1个单元格的内容,也就是左上角单元格的内容。左上角单元格是A1,所以返回它的内容A。同样的,公式=CELL("row",A1:C3)返回A1单元格的行号,当然是1;公式=CELL("width",A1:C3)返回A1单元格的宽度8。
总结一下cell的特征,第2参数只能是引用,并且只能返回引用区域左上角单元格的信息。这就是它为什么和多维引用结合使用的理由,多维引用当然是引用,符合第2参数的特性;但是它也只能返回多维引用的第1个值。而用了t/n(if(1,))后就能返回多维引用的多个值了。你可以把置换那个公式中的n(if(1,))去掉,看看cell返回的结果是什么。今天的文章需要有多维引用的基础。
利用这些函数得到了置换后的数组,就可以用vlookup逆向查询了。在M3单元输入公式
=VLOOKUP(L3,CELL("contents",INDIRECT(TEXT(N(IF(1,MMULT(ROW(3:10)/1%+COLUMN(A:B),1-MUNIT(2)))),"r0c00"),)),2,),完成。
文件链接:
https://pan.baidu.com/s/10Dc1GJ4iXIX5oQrnICnWug
提取码:c1ao