要更详细地了解数组公式的工作原理(@Jacob 的公式在某些情况下似乎有点错误,例如“A1A”为 0),所以这是我认为的工作版本,为了便于使用而扩展阅读。请让我知道它不起作用的任何示例。
=IF(
LEN(A1)=0
,0
,MIN(
IF(
ISNUMBER(
1*MID(
A1,
ROW(INDIRECT("A1:A"&LEN(A1))),
1
)
),
ROW(INDIRECT("A1:A"&LEN(A1))),
LEN(A1)+1
)
)
)
- 其核心是 row() 函数,它在数组模式下对范围 a1:a*n* 中的每个单元格进行一次评估,其中n是单元格 A1 中字符串的长度,创建一个数组 { 1,2,..., n }。
- 该数组被传递给 MID 函数,该函数又生成一个数组 {*char_1*,*char_2*,...,*char_n*}。
- 数组乘以 1 以防止在后续步骤中将数字字符解析为文本。这也可以使用 VALUE() 来完成。
- 然后将其传递给 ISNUMBER() 函数,该函数输出一个逻辑值数组。
这是传递给 IF的条件数组。然后通过重复步骤 1 构建第二个数组,其中包含每个字符的位置。IF 函数在数组模式下产生一个输出数组。条件为 TRUE 的情况被设置为字符位置数组中的相应值,其余的都设置为 LEN(A1)+1,因此它们大于任何数字字符的任何可能位置值。
然后 MIN 函数计算 IF 输出的数组,返回最小值,即单元格 A1 中字符串中第一个数字字符的位置。如果单元格中没有文本,最外面的 IF 函数强制公式返回 0,而不是 1;否则,INDIRECT 返回 #REF!搜索单元格A0时出错,向上传播,IF返回FALSE条件,返回0+1=1。
要改为搜索第一个非数字字符的位置,您所要做的就是将第二个 2 个参数的顺序反转为 IF:
=IF(
LEN(A1)=0
,0
,MIN(
IF(
ISNUMBER(
1*MID(
A1,
ROW(INDIRECT("A1:A"&LEN(A1))),
1
)
),
LEN(A1)+1,
ROW(INDIRECT("A1:A"&LEN(A1)))
)
)
)