Excel 无法在数组公式中实现间接()
我有一个名为Finder的工作表,在该工作表中我创建了一个工具来搜索其他工作表(名为#1、#2等)。我遇到的问题是,在某些情况下无法使用间接函数,如下所述:Excel 无法在数组公式中实现间接(),excel,excel-formula,array-formulas,Excel,Excel Formula,Array Formulas,我有一个名为Finder的工作表,在该工作表中我创建了一个工具来搜索其他工作表(名为#1、#2等)。我遇到的问题是,在某些情况下无法使用间接函数,如下所述: { = IF(Finder!$B$4 = 1, INDEX(INDIRECT("'#" & (ROW() - 5) & IF(MOD(COLUMN(), 3) = 0, "'!$A$2:$A$100", "'!$B$2:$B$100")), SMALL(IF(ISERROR(SE
{ = IF(Finder!$B$4 = 1,
INDEX(INDIRECT("'#" & (ROW() - 5) & IF(MOD(COLUMN(), 3) = 0, "'!$A$2:$A$100", "'!$B$2:$B$100")),
SMALL(IF(ISERROR(SEARCH(Finder!$F$4, '#1'!$B$2:$B$100)),
"",
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1),
INT(COLUMN() / 3)),
1),
IF(Finder!$B$4 = 2,
INDEX(INDIRECT("'#" & (ROW() - 5) & "'!" & IF(MOD(COLUMN(), 3) = 0, "$A$2:$A$100", "$B$2:$B$100")),
SMALL(IF(Finder!$F$4 = '#1'!$B$2:$B$100,
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1,
""),
INT(COLUMN() / 3)),
1),... }
概念形式:
{ = IF(Finder!$B$4 = 1,
INDEX(using INDIRECT to address a range in another sheet successfully,
SMALL(IF(ISERROR(SEARCH(cannot use INDIRECT here!)),
"",
Desired value),
Desired item),
1),
IF(Finder!$B$4 = 2,
INDEX(using INDIRECT to address a range in another sheet successfully,
SMALL(IF(cannot use INDIRECT here!,
Desired value,
""),
Desired item),
1),... }
我需要在另一张表格中说明一个范围,如下所示:
SMALL(IF(ISERROR(SEARCH(Finder!$F$4, '#1'!$B$2:$B$100)),...
SMALL(IF(Finder!$F$4 = '#1'!$B$2:$B$100,...
没关系,但我不能使用间接法使公式动态:
SMALL(IF(ISERROR(SEARCH(Finder!$F$4, INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))),...
SMALL(IF(Finder!$F$4 = INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"),...
提前谢谢
更新: 查找工具包含许多单元格。此图显示了为什么需要使用
ROW()
函数获取图纸名称
更新2:
Finder工作表中的组合框有四项,使用$B$4单元格:
1-近似搜索
2-精确搜索
3-完整索引
4-特定类别
以下是公式的完整代码:
= IF(ISERROR(IF(Finder!$B$4 = 1,
INDEX(INDIRECT("'#" & (ROW() - 5) & IF(MOD(COLUMN(), 3) = 0, "'!$A$2:$A$100", "'!$B$2:$B$100")),
SMALL(IF(ISERROR(SEARCH(Finder!$F$4, '#1'!$B$2:$B$100)),
"",
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1),
INT(COLUMN() / 3)),
1),
IF(Finder!$B$4 = 2,
INDEX(INDIRECT("'#" & (ROW() - 5) & "'!" & IF(MOD(COLUMN(), 3) = 0, "$A$2:$A$100", "$B$2:$B$100")),
SMALL(IF(Finder!$F$4 = '#1'!$B$2:$B$100,
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1,
""),
INT(COLUMN() / 3)),
1),
IF(Finder!$B$4 = 3,
IF(MOD(COLUMN(), 3) = 0,
20 * (ROW() - 6) + COLUMN() / 3,
INDIRECT(ADDRESS(INT(COLUMN() / 3) + 1, 2, 1, , "#" & (ROW() - 5)))),
INDEX(INDIRECT("'#" & (ROW() - 5) & "'!" & IF(MOD(COLUMN(), 3) = 0, "$A$2:$A$100", "$B$2:$B$100")),
SMALL(IF(Finder!$F$4 = '#1'!$I$2:$I$100,
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1,
IF(ISERROR(SEARCH(Finder!$F$4 & ",", '#1'!$I$2:$I$100)),
IF(ISERROR(SEARCH("," & Finder!$F$4, '#1'!$I$2:$I$100)),
IF(ISERROR(SEARCH(", " & Finder!$F$4, '#1'!$I$2:$I$100)),
"",
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1),
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1),
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1)),
INT(COLUMN() / 3)),
1))))),
" ",
IF(Finder!$B$4 = 1,
INDEX(INDIRECT("'#" & (ROW() - 5) & IF(MOD(COLUMN(), 3) = 0, "'!$A$2:$A$100", "'!$B$2:$B$100")),
SMALL(IF(ISERROR(SEARCH(Finder!$F$4, '#1'!$B$2:$B$100)),
"",
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1),
INT(COLUMN() / 3)),
1),
IF(Finder!$B$4 = 2,
INDEX(INDIRECT("'#" & (ROW() - 5) & "'!" & IF(MOD(COLUMN(), 3) = 0, "$A$2:$A$100", "$B$2:$B$100")),
SMALL(IF(Finder!$F$4 = '#1'!$B$2:$B$100,
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1,
""),
INT(COLUMN() / 3)),
1),
IF(Finder!$B$4 = 3,
IF(MOD(COLUMN(), 3) = 0,
20 * (ROW() - 6) + COLUMN() / 3,
INDIRECT(ADDRESS(INT(COLUMN() / 3) + 1, 2, 1, , "#" & (ROW() - 5)))),
INDEX(INDIRECT("'#" & (ROW() - 5) & "'!" & IF(MOD(COLUMN(), 3) = 0, "$A$2:$A$100", "$B$2:$B$100")),
SMALL(IF(Finder!$F$4 = '#1'!$I$2:$I$100,
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1,
IF(ISERROR(SEARCH(Finder!$F$4 & ",", '#1'!$I$2:$I$100)),
IF(ISERROR(SEARCH("," & Finder!$F$4, '#1'!$I$2:$I$100)),
IF(ISERROR(SEARCH(", " & Finder!$F$4, '#1'!$I$2:$I$100)),
"",
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1),
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1),
ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100")) - MIN(ROW(INDIRECT("'#" & (ROW() - 5) & "'!$B$2:$B$100"))) + 1)),
INT(COLUMN() / 3)),
1)))))
该问题是由于使用了
行
和列
功能造成的。即使只有一个值,例如{1}而不是1,这些函数也会返回“数组”。在某些情况下,这不是问题,但在其他情况下(如此处),excel在将{1}转换为1时出现问题,并且公式不起作用
一种可能的解决方案是将所有行
和列
函数封装在一个类似MAX
或SUM
的函数中,该函数将为您进行转换,例如代替
ROW()-5
使用
SUM(ROW())-5
但是一个更好的方法(我推荐的方法)是使用行
或列
函数(末尾带有“S”),因此如果第一个公式在Z6
中,请使用
行($Z$6:Z6)
或列($Z$6:Z6)
这两个参数在Z6本身中的值都是1,但当您向下或横向复制时,它们每次都会增加1(并且它们不会受到与
行
和列
相同的缺点)。无论如何,这是一个更好的解决方案,因为它消除了您的-5s,而且如果您删除或添加行或列,它不太容易出错谢谢@barry houndini。我添加了一张图片来演示为什么需要使用ROW()
函数来寻址工作表名称。事实上,我正在努力建立一个词汇库。所以我在#1,#2。。。被单。在这些表格中,每个单词都有一个唯一的数字,放在a列,单词在第二列。(B列)我尝试使用SUM()
和MAX()
解决问题,但没有解决问题。我再次更新了问题并添加了完整的代码。请看一看。谢谢,我理解你为什么要使用行,但正如我所说的那样,这会导致一个问题……但是你没有列在B列中的工作表编号,为什么你不能使用这些-这比行、行或任何其他方式都简单?我真的不知道如何使用列B。这个公式用于C6、D6、F6、G6、…、C7、D7、F7、G7等等。如何获取当前行?!您的公式在第6行中使用了ROW()-5,这样您就得到了1…但是在B6中您已经有了1,所以与其使用ROW()-5(这会给您带来问题),为什么不直接参考B6呢?在B列的其余部分,您似乎有2、3、4等,因此这将适用于每一行