没有VBA的Excel排列表
是否有可能在Excel中生成一个排列表,而不使用VBA,也没有使用任何“帮手”表或行/列?
对于N列,会有N! 行。
例如,N = 3的表格如下所示:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
打开一个空白工作表并将下面的公式粘贴到单元格A1中。 (为了便于阅读,我join了换行符。)
= IF(ROW()<=FACT(COLUMN()-1),COLUMN(), INDIRECT(ADDRESS(ROW()-FACT(SUMPRODUCT(((ROW()-1)>=FACT(ROW($A$2:$A$10)))+0)+1), IF(COLUMN()=(SUMPRODUCT(((ROW()-1)>=FACT(ROW($A$2:$A$10)))+0)+2),1,COLUMN()+1))))
简单地把这个公式拖到N列然后下来N! 行以便生成N的完整排列表。
有几件事要注意:
-
因为阶乘增长很快,所以上面的公式只适用于N <= 10。 但是,这不是一个限制,因为10! = 3,628,800,这是超过Excel 2010中的最大行数(1,048,576)的数字。 因此,Excel无法生成N = 10的置换表。
-
如果要将表格的左上angular设置为A1以外的单元格,则可以手动修改该公式以考虑此移位。 例如,如果您希望表开始于A2而不是A1,则使用
(ROW()-1)
replace上面公式中的每个ROW()
实例。 -
排除第一行(列出数字升序)和最后一行(列出数字降序),排列在此表中列出的顺序与原始问题中列出的顺序不同,但排列仍然是确定性的。 请参阅下面的使用这个公式的排列表的屏幕截图,使用条件格式可以很容易地发现排列顺序随着行数的增加而变化的模式。
编辑:
除了以不同的顺序生成排列之外,所有与上述相同的属性的另一解决scheme如下:
= IF(ROW()<=FACT(COLUMN()-1),COLUMN(), INDIRECT(ADDRESS(ROW()-FACT(SUMPRODUCT(((ROW()-1)>=FACT(ROW($A$2:$A$10)))+0)+1),COLUMN())) +IF(ROW()<=FACT(COLUMN()),-1, IF(INDIRECT(ADDRESS(ROW()-FACT(SUMPRODUCT(((ROW()-1)>=FACT(ROW($A$2:$A$10)))+0)+1),COLUMN())) =INDIRECT(ADDRESS(ROW(),(SUMPRODUCT(((ROW()-1)>=FACT(ROW($A$2:$A$10)))+0)+2))),1,0)))
此公式显然比第一个公式更长,但它通常还是完成相同的事情:打开一个空白工作表并将此公式粘贴到单元格A1中。 然后将公式拖过N列然后向下N! 行以便生成N的完整排列表。
然而,如前所述,与之前的解决scheme相比,排列的顺序发生了变化。 在这个解决scheme中排列的顺序可以说比第一个解决scheme更好,因为每一列总是包含相同大小的数字“块”。 请参阅下面的使用这个公式的排列表的屏幕截图,使用条件格式可以很容易地发现排列顺序随着行数的增加而变化的模式。