有没有办法连接Excel中的两个数组没有VBA?
我想创build一个公式,返回两个不同长度数组的连接。 我需要这个连接的另一个公式的一部分,我想避免“帮手”行,如果可能的话。
看下面的例子数据。
目标是产出{10;11;12;13;20;21;22}
。 当然,这可以很容易地被硬编码到公式中,但是这些值是dynamic的,所以这不是一个选项。
我尝试了以下内容:
{A1:A4;B1:B3}
但是这显然是无效的Excel语法。
有解决scheme吗?
Excel不能以你描述的方式直接连接数组(也就是简单地把它们连接起来)。然而,没有使用辅助函数,这个问题有一个(复杂的)解决scheme。
基本上你需要做的是将{10;11;12;13}
为{10;11;12;13;0;0;0}
,并将{20;21;22}
转换为{0;0;0;0;20;21;22}
。 一旦你有了这个结果,你可以添加两个长度为7的数组来得到想要的结果。
那么如何将零添加到数组的开头或结尾呢?
答案是以一种聪明的方式使用matrix乘法( MMULT
Excel内置函数)。
我不会解释为什么这是结果的所有math,因为我认为它是从编程太离题,但最终以下matrix乘法方程给你所需的结果:
[1 0 0 0] [10] [10] [0 1 0 0] * [11] = [11] [0 0 1 0] [12] [12] [0 0 0 1] [13] [13] [0 0 0 0] [ 0] [0 0 0 0] [ 0] [0 0 0 0] [ 0]
或者在Excel中,您可以input以获得结果:(为了提高可读性,我添加了换行符。)
= MMULT({1,0,0,0; 0,1,0,0; 0,0,1,0; 0,0,0,1; 0,0,0,0; 0,0,0,0; 0,0,0,0},A1:A4)
如果在单元格中突出显示此公式并按F9键,则应注意到它会给出{10;11;12;13;0;0;0}
的所需结果。
同样,下面的公式会得到你想要的结果{0;0;0;0;20;21;22}
:
= MMULT({0,0,0; 0,0,0; 0,0,0; 0,0,0; 1,0,0; 0,1,0; 0,0,1},B1:B3)
将这两个数值相加得到所期望的最终结果,即{10;11;12;13;20;21;22}
。
注意
在这一点上,这可能是足够的信息为您的需要/需求。 但是,对于大型数组,将这些1和0的matrix硬编码到公式中可能太麻烦。 如果是这种情况,请继续阅读,告诉您如何自动生成1和0的matrix,而不是对它们进行硬编码。
我们如何自动生成上面显示的这些1和0的大matrix?
再一次没有解释“为什么”,因为我认为讨论会太长,而且无关紧要,下面是一个产生第一个1和0的matrix的公式:
= (ROW(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(ROWS(A1:A4)+ROWS(B1:B3),1))) =COLUMN(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(1,ROWS(A1:A4)))))+0
1和0的第二个matrix的公式略有不同:
= (ROW(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(ROWS(A1:A4)+ROWS(B1:B3),1))) =(COLUMN(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(1,ROWS(B1:B3))))+ROWS(A1:A4)))+0
最终的公式
连接两个(垂直)数组的最后一个公式如下所示:(为了提高可读性,添加了多个换行符)
= MMULT( (ROW(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(ROWS(A1:A4)+ROWS(B1:B3),1))) =COLUMN(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(1,ROWS(A1:A4)))))+0, A1:A4) +MMULT( (ROW(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(ROWS(A1:A4)+ROWS(B1:B3),1))) =(COLUMN(INDIRECT(ADDRESS(1,1)&":"&ADDRESS(1,ROWS(B1:B3))))+ROWS(A1:A4)))+0, B1:B3)
最后的注意事项/思路
使用这个公式的好处是它允许数组连接而不使用VBA。 缺点是这种连接数组的方法只能使用数字,而不能使用文本。 (这是因为MMULT
需要数字。)