Excel查找矩阵内数字位置遇TEXTJOIN报错及替代方案咨询
Excel 2019中TEXTJOIN报错问题分析与替代方案
问题原因:不是列数限制,而是TEXTJOIN的字符数上限
Excel 2019中TEXTJOIN()函数拼接后的字符串最大长度为32767个字符,当拼接结果超出这个限制时就会返回#VALUE!错误。
你测试的8×1118矩阵,元素是1-8与1-1118的乘积(最大为8944,占4位字符),总字符数累加后超过了32767;而100×90矩阵的元素乘积最大为9000(同样4位),但总字符数刚好未触及上限,所以能正常执行。
替代方案
方案1:直接定位元素(推荐,无需拼接字符串)
跳过TEXTJOIN(),直接在矩阵中查找包含"7"的元素位置,避免字符数限制。使用数组公式(Excel 2019需按Ctrl+Shift+Enter确认输入):
=INDEX(ROW(1:8), MIN(IF(ISNUMBER(FIND("7", MMULT(ROW(1:8), TRANSPOSE(ROW(1:1118))))), ROW(1:8))))&", "&INDEX(COLUMN(1:1118), MIN(IF(ISNUMBER(FIND("7", MMULT(ROW(1:8), TRANSPOSE(ROW(1:1118))))), COLUMN(1:1118))))
用LET()函数简化(Excel 2019支持),可读性更强:
=LET( mat, MMULT(ROW(A1:A8), TRANSPOSE(ROW(A1:A1118))), has_seven, ISNUMBER(FIND("7", mat)), row_num, MIN(IF(has_seven, ROW(mat))), col_num, MIN(IF(INDEX(has_seven, row_num, ), COLUMN(mat))), "行: "&row_num&", 列: "&col_num )
方案2:分块拼接查找
将矩阵拆分为多个小块,分别用TEXTJOIN()拼接后依次查找,找到后计算对应位置。示例(拆分前500列和剩余列):
=LET( mat, MMULT(ROW(A1:A8), TRANSPOSE(ROW(A1:A1118))), first_chunk, INDEX(mat,,1:500), first_match, MATCH(TRUE, ISNUMBER(FIND("7", first_chunk)), 0), IF(ISNUMBER(first_match), "行: "&INT((first_match-1)/500)+1&", 列: "&MOD(first_match-1,500)+1, second_chunk, INDEX(mat,,501:1118), second_match, MATCH(TRUE, ISNUMBER(FIND("7", second_chunk)), 0), "行: "&INT((second_match-1)/618)+1&", 列: "&500+MOD(second_match-1,618)+1 ) )
方案3:VBA自定义函数
编写简单的VBA代码遍历矩阵,直接返回第一个包含"7"的元素位置:
- 按
Alt+F11打开VBA编辑器,插入模块,粘贴以下代码:
Function FindSevenInMatrix(rngRows As Range, rngCols As Range) As String Dim rowArr As Variant, colArr As Variant Dim i As Long, j As Long Dim val As String rowArr = rngRows.Value colArr = rngCols.Value For i = LBound(rowArr) To UBound(rowArr) For j = LBound(colArr) To UBound(colArr) val = CStr(rowArr(i, 1) * colArr(j, 1)) If InStr(val, "7") > 0 Then FindSevenInMatrix = "行: " & i & ", 列: " & j Exit Function End If Next j Next i FindSevenInMatrix = "未找到" End Function
- 返回Excel,在单元格中输入
=FindSevenInMatrix(A1:A8, A1:A1118)即可获取结果。
内容的提问来源于stack exchange,提问作者Rasec Malkic
相关产品推荐
相关产品推荐

