【问题标题】:Reference named ranges in external workbook with formula criteria使用公式标准引用外部工作簿中的命名范围
【发布时间】:2020-01-31 23:23:39
【问题描述】:

在公式中的命名范围方面需要帮助

我有第二个工作簿 ('TEST.xlsx') 作为目标,在源工作簿 ('FLOW.xlsx') 中引用工作表范围的命名范围(12 列 X 75 行)。我想创建一个与查找值匹配的公式(在TEST 中输入单元格C3 的日期,如果匹配的命名范围/列中有2个或更多空白单元格,则返回匹配的命名范围,并且该组 12 列中剩余的命名范围/列具有 2+ 个空白单元格。源工作簿 ('FLOW') 中的 12 个单独的列按月、年和位置命名 (ex., "jan_2019_class.1","feb_2019_class.1", etc.),工作表列是 C, H, M, R, W, AB, AG, AL, AQ, AV, BA,和BF。行数为 80-155。我只能在我的 TEST 工作簿中创建一个简单的工作 COUNTBLANK 公式,例如:

=COUNTBLANK('[FLOW.xlsx]Class_1-Chart'!jan_2019_class.1)

但不适用于连续的列(具有不同的命名范围并且列是非顺序的);而且我无法弄清楚与此相结合的功能公式以获取上述条件返回的计数和数据。请不要使用 VBA/宏。

提前感谢您的帮助!

'TEST.xlsx' Screen Shot-RVSD

FLOW.xlsx- sample screenshot

【问题讨论】:

  • 感谢 Terry W 的回复!
  • Terry W:期望的结果是:在 TEST 的单元格 C3 中输入期望的开始日期(格式:jan_2020_class.1),该日期将引用(或匹配)源工作簿中该班级的工作表 FLOW 和在同一年确定是否:a) 12 个非连续列中的任何一个中有 2 个或更多空白单元格,并且 b) 2 个或更多列(月)中有 2 个或更多空白;然后返回 TEST 单元格 C6:C11 中第一列的命名范围。目标:通过在 TEST 中输入所需的开始月份和年份并在 FLOW 中根据标准确定命名范围,为开始的学生找到一个空缺。谢谢!!
  • Terry W:我还修改了测试表图像,并在上面的原始帖子中添加了 FLOW 表的示例照片(仅限 1 类)。谢谢!

标签: excel excel-formula match named-ranges


【解决方案1】:

有很多方法,但我个人更喜欢使用辅助行/列/单元格和命名范围。

在我的演示中,我使用了从 1 月到 6 月两个不同年份的两个班主任时间表,如下所示(在我的示例中,他们坐在 C 到 M 列):

如上所示,我在每个计划的顶部添加了两个辅助行。第一个辅助行用于查找每个月是否有 2 个或更多职位空缺,如果有则返回 TRUE。我为它们分别命名为 check.2019.class.1check.2021.class.5

第二个辅助行只是显示每个月的范围名称,例如jan_2019_class.1feb_2019_class.2 等。我给出了名称 NameRng.2019.class.1 NameRng.2021.class.5为他们每个人。

TEST 表上,我进行了以下设置:

单元格C3 中的查找值实际上由公式返回,因此用户可以“动态”更改它。请注意,在下面的公式中,我使用了一个名称 ClassNo,它本质上是来自单元格 B3 的值。

=B2&"_"&B1&"_class."&ClassNo

我还将单元格 C3 命名为 Start_MthYrClass,这将在我的以下公式中使用。

如果起始月份为jan_2019_class.1,则在2019中查找第一个可用月份的公式为:

=INDEX(NameRng.2019.class.1,MATCH(1,(TRANSPOSE(ROW($1:$11))>=MATCH(Start_MthYrClass,NameRng.2019.class.1,0))*Check.2019.class.1,0))

请注意这是一个数组公式,所以你必须Ctrl+Shift+Enter 完成公式栏中的公式,否则它们将无法正常工作。

逻辑是首先使用这个公式=TRANSPOSE(ROW($1:$11))>=MATCH(Start_MthYrClass,NameRng.2019.class.1,0)“过滤”范围NameRng.2019.class.1,其中ROW($1:$11)代表{1;2;3;4;5;6;7;8;9;10;11}TRANSPOSE 将把它变成{1,2,3,4,5,6,7,8,9,10,11}。此数字范围表示特定范围内的列索引,即 C 列到 M 列(在您的情况下,它将是 ROW($1:$56),因为您的数据位于 C 列到 BF 列中)。然后我使用 MATCH 返回查找月份的起始列索引jan_2019_class.1,它应该返回1,因为本月从 NameRng 范围内的第一个位置/列开始.2019.class.1。所以这就是我实际比较的:{1,2,3,4,5,6,7,8,9,10,11}>=1,它会返回{TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE}

然后我将上面的结果乘以 Check.2019.class.1 范围,它本质上是{FALSE,0,FALSE,0,TRUE,0,FALSE,0,TRUE,0,TRUE}。然后我会得到{0,0,0,0,1,0,0,0,1,0,1}。仅供参考,在 Excel 中 TRUE=1FALSE=0,所以 TRUE x FALSE = 0TRUE x TRUE = 1

最后,我使用 MATCH 找出上述结果中第一个1 的位置,即第 5 位/列,然后使用 INDEX 来从范围 NameRng.2019.class.1 中返回对应的值,即mar_2019_class.1

这是一个更通用的公式,它允许您在第一个单元格C6 中输入它并将其向下拖动以全面应用,如果您以与我已经证明了

=IFERROR(INDEX(INDIRECT("NameRng."&B6&".class."&ClassNo),MATCH(1,(TRANSPOSE(ROW($1:$11))>=MATCH(Start_MthYrClass,INDIRECT("NameRng."&B6&".class."&ClassNo),0))*INDIRECT("Check."&B6&".class."&ClassNo),0)),"")

这也是一个数组公式,所以你必须Ctrl+Shift+Enter 完成公式栏中的公式。

它本质上与第一个公式相同,但我添加了 IFERROR 以在不匹配时返回空白单元格,并且我使用 INDIRECT 来引用根据所选年份和班级编号动态命名范围。

现在,如果我将查找条件更改为 mar_2021_class.5,以下是更新后的结果:

如果您有任何问题,请告诉我。干杯:)

【讨论】:

  • Terry W,您能否澄清一下您在通用公式中“转置”的行?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多