这是一个经常被问到和回答的问题:如何在 Excel 中生成所有排列:
2011 2016 2017 2017 超级用户 2018 2021
现在到了2022 年,在它作为重复项关闭之前没有得到答案,这是不幸的,因为LAMBDA确实改变了这个问题的回答方式。
我很少有同样的需求,并且因不得不重新发明一个复杂的轮子而感到沮丧。因此,我将重新提出问题并在下面给出我自己的答案。我不会将任何提交标记为答案,但会邀请好的想法。我确信我自己的方法可以改进。
我正在尝试仅使用公式在 Excel 中创建循环。我想要实现的目标如下所述。假设我有 3 列作为输入: (i) 国家/地区;(ii) 变量;(iii) 年份。我想从这些输入进行扩展,然后为这些参数分配值。
输入:
| 国家 | 多变的 | 年 |
|---|---|---|
| 国标 | 国内生产总值 | 2015年 |
| 德 | 区域 | 2016年 |
| CH | 区域 | 2015年 |
输出:
| 国家 | 多变的 | 年 |
|---|---|---|
| 国标 | 国内生产总值 | 2015年 |
| 国标 | 国内生产总值 | 2016年 |
| 国标 | 区域 | 2015年 |
| 国标 | 区域 | 2016年 |
| 德 | 国内生产总值 | 2015年 |
| 德 | 国内生产总值 | 2016年 |
| 德 | 区域 | 2015年 |
| 德 | 区域 | 2016年 |
如何使用 Excel 有效地做到这一点?
我有三列,每一列都有不同类型的主数据,如下所示:
现在,我想要这三个单元格的所有可能组合 …
自从我得知 Excel 现在是图灵完备的,我就明白我现在可以仅使用公式对 Excel 进行“编程”,因此排除任何 VBA 的使用。
我不知道我的结论是对还是错。事实上,我并不介意。
然而,令我满意的是,我已经能够在公式中“编程”程序流的两个最基本的结构:1-分支控制流(使用 IF 函数在 Excel 中没有秘密)和 2-循环(FOR、WHILE , UNTIL 循环)。
让我更详细地解释一下我的发现。(备注:因为我使用的是西班牙语版本的 Excel 365,所以公式中的字段分隔符是分号(“;”)而不是逗号(“,”)。
A- FOR 循环中的累加器
B- 阶乘(使用产品)
C-WHILE循环
D-UNTIL 循环
E- 内部/外部范围的概念
现在,我提问的时间到了:
我想使用一个实际上是公式数组的公式
我想对“元组”中的第一个数字使用累加器,而我想对元组中的第二个数字使用阶乘。所有这一切都使用一个 Excel 公式。我想我离成功已经不远了。
REDUCE 函数接受包含 2 个 LAMBDAS 而不是单个 LAMBDA 函数的 LET 函数。到这里为止,一切都很完美。然而,LET 函数似乎只返回一个“单个”函数而不是函数元组
我可以返回(在图中)函数“x”或函数“y”,但不能返回元组(x,y)。
我尝试过使用 HSTACK(x,y),但它似乎不起作用。
我知道这是一个复杂的问题,但我已尽力让自己被理解。
有人可以给我任何关于如何解决我的问题的线索吗?
冒着跑题的风险,我决定做一些问答,因为我对 MS 向 Excel365 引入的新功能感到非常兴奋;该LAMBDA()功能。如果普遍认为这是题外话,请告诉我,我可以删除问答。
该LAMBDA()函数基本上是您在 Excel 中创建自己的函数的方式。然后,您可以继续在整个工作簿中调用此函数。但是关于它的绝对伟大的事情(恕我直言)是它能够在函数内调用自己,因此是递归的!
SUBSTITUTE()如果必须交换多个字符,或者从某些字符甚至整个单词中清除字符串,我们都知道繁琐的嵌套函数。所以问题是:我们如何避免这种情况并利用LAMBDA()我们的优势?
目标是迭代字符表的行并用其替代字符替换每个字符。
本例中的字符表为={"&","&";"<","<";">",">";"'","'";"""","""}, 或:

*(旁注:"&","&"在这种情况下,必须位于列表的最后,否则它将替换之前替换中的其他出现,因为我们将从最后到第一个进行。)
公式:
=LAMBDA(XML,Pos,
LET(
Cls,{"&","&";"<","<";">",">";"'","'";"""","""},
Row,IF(ISOMITTED(Pos),ROWS(Cls),Pos),
Crf,INDEX(Cls,Row,1),
Crr,INDEX(Cls,Row,2),
Sub,SUBSTITUTE(XML,Crf,Crr),
IF(Row=0,XML,ENCODEXML(Sub,Row-1))
))
Run Code Online (Sandbox Code Playgroud)
预期结果=ENCODEXML("sl < dk & jf")是sl < dk & jf
我收到#VALUE!错误。
我有一个关于多维数组UNIQUE中随机数生成函数的问题。
正如您所看到的,我尝试在 5X5 数组内生成一个随机且唯一的数字为 1->100 的数组。
我尝试了两者MAKEARRAY,RANDARRAY希望UNIQUE它可以生成随机数,但它仍然产生重复的数字(以红色突出显示)。
以下是使用的公式:
=UNIQUE(MAKEARRAY(5,5,LAMBDA(row,col,RANDBETWEEN(1,100))),,TRUE)
=MAKEARRAY(5,5,LAMBDA(row,col,UNIQUE(RANDBETWEEN(1,100),,TRUE)))
=UNIQUE(RANDARRAY(5,5,1,50,TRUE))
Run Code Online (Sandbox Code Playgroud)
是否有任何解决方法(或 Excel 中任何未知的隐藏函数)?