我有一个名为 Finder 的工作表,我在其中创建了一个工具来搜索其他工作表(名为 #1、#2 等)。我遇到的问题是在某些情况下我无法使用 INDIRECT 函数,如下所述:
{ = 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,...
没关系,但我不能使用 INDIRECT 使公式动态化:
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"),...
提前致谢
更新:
Finder 工具包含许多单元格。图片显示了为什么我需要使用 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)))))
最佳答案
问题是由于使用ROW
和COLUMN
函数引起的。即使只有一个值,这些函数也会返回“数组”,例如{1} 而不是 1。在某些情况下这不是问题,但在其他情况下(如此处),excel 在将 {1} 转换为 1 时出现问题并且公式不起作用。
一个可能的解决方案是将所有 ROW
和 COLUMN
函数包含在一个类似 MAX
或 SUM
的函数中,这样将为您转换,例如而不是
ROW() - 5
使用
SUM(ROW()) - 5
但更好的方法(也是我推荐的方法)是使用 ROWS
或 COLUMNS
函数(末尾带有 "S" ), 所以如果第一个公式在 Z6
中使用
ROWS($Z$6:Z6)
或 COLUMNS($Z$6:Z6)
它们都会在 Z6 本身中为您提供 1 的值,但是当您向下或横向复制时,它们每次都会递增 1(并且它们不会像 ROW
和 列
)。无论如何,这是一个更好的解决方案,因为它消除了你的 -5s,并且如果你删除或添加行或列,它更不容易出错
关于excel - 无法在数组公式中实现 INDIRECT(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20309517/