我将用逗号分隔的单词数组的结果转换为具有索引公式的可用数据。
索引正确列出了所有数据。但是,如果索引列表超过33个字,则会出现Value错误,并且无法再处理索引数据。
为什么限制为33个字?我该如何超越呢?
Array formula: =TEXTJOIN(", ",TRUE,IF($B$2:$B$50000=1,$A$2:$A$50000, ""))
Index formula: =Index([Array],1)
Listing Index formula: =TRIM(MID(SUBSTITUTE([Index],",",REPT(" ",999)),(ROW(1:1)-1)*999+1,999))
期望的结果:生成一个列列表,其中包含无限数量的结果(当前最多可处理33个结果)
实际结果: 数组公式从长单词列表中生成匹配单词的逗号分隔列表(有效) Index公式将此列表转换为我可以操纵(工作)的字符串 列表索引公式将逗号分隔的列表转换为列列表(如果索引列表为<= 33则有效)
答案 0 :(得分:0)
您已超过SUBSTITUTE可以返回的最大字符数。 SUBSTITUTE只能产生32,567个字符的字符串。
=SUBSTITUTE([Index], ",", REPT(" ", 999))
以上返回#VALUE!如果生成的扩展字符串长于32,567,则为带符号的短整数的最大值。即使没有实际的文字,33×999也等于32,967。
顺便说一句,您要用,<space>
作为分隔符进行连接,但是将连接的字符串除以,
。您应该选择其中一个。
btw²,如果您的 array 字符串少于32,567的一半,则您应该可以使用嵌套的SUBSTITUTE函数或SUBSTITUTE / REPLACE组合来超过33个项目的限制,但是仍然会有限制。您不能将工作表公式用于“无限数量的结果”;您需要更长的字符串的VBA。
以下内容通过将特定实例(SUBSTITUTE的第四个参数)更改为单个“非法”字符(可在原始字符串的其余部分中轻松定位)来最大程度地减少了原始字符串的扩展。
=TRIM(REPLACE(REPLACE([index], FIND(CHAR(9), SUBSTITUTE([index], ", ", CHAR(9), ROW(1:1))), LEN([index]), ""), 1, IFERROR(FIND(CHAR(9), SUBSTITUTE([index], ", ", CHAR(9), ROW(1:1)-1)), 0), ""))
CHAR(9)是制表符,虽然最终有可能将制表符强制插入单元格,但通常将其视为“非法”单元格内容,因此将其用作唯一占位符非常安全。
以下用户定义函数将从几乎任何大小的字符串中分离出任何片段。
Option Explicit
Function getPiece(str As String, ndx As Long, _
Optional delim As String = ", ")
getPiece = Split(str, delim)(ndx - 1)
End Function
'usage on worksheet with default `comma><space>` as the delimiter
=getPiece([Index], row(1:1))
将以上内容放入标准的公共模块代码表中。使用Alt + F11打开VBE,然后使用Alt + I + M将模块代码表插入项目。