Excel 构建选定图纸名称的动态列表

Excel 构建选定图纸名称的动态列表,excel,excel-formula,Excel,Excel Formula,这是我们的后续问题 最终目标是有一个定义的名称,比如“Sheetnames”,用于数据验证选择列表。Sheetnames应该是所有图纸名称的列表,但带有设置信息的两张图纸除外。目前它们被称为“主索引”和“进度”。我试图避免使用VBA,但如果必须,我会求助于它 我尝试过的 Defined Name "Sheetnames" =TRANSPOSE(GET.WORKBOOK(1,'Master Index'!$E$4)&T(NOW())) 这显然是一些旧的内置VBA代码,可以动态地将工作表中

这是我们的后续问题

最终目标是有一个定义的名称,比如“Sheetnames”,用于数据验证选择列表。Sheetnames应该是所有图纸名称的列表,但带有设置信息的两张图纸除外。目前它们被称为“主索引”和“进度”。我试图避免使用VBA,但如果必须,我会求助于它

我尝试过的

Defined Name "Sheetnames"
=TRANSPOSE(GET.WORKBOOK(1,'Master Index'!$E$4)&T(NOW()))
这显然是一些旧的内置VBA代码,可以动态地将工作表中的工作表名列表拉入工作簿。转置将水平数组转换为垂直数组,并且是完全可选的。now()是一个volatile函数,每当添加、删除或重命名工作表时,都会重新计算公式

sheetnames的当前输出是一个如下所示的数组:

[DRAWING LIST work in progress.xlsm]Master Index
[DRAWING LIST work in progress.xlsm]Progress
[DRAWING LIST work in progress.xlsm]Highway
[DRAWING LIST work in progress.xlsm]Structural
[DRAWING LIST work in progress.xlsm]Hydrology
[DRAWING LIST work in progress.xlsm]Electrical
我玩弄了一个数组公式(不是我的强项),并使用以下方法将其简化为图纸名称:

=RIGHT(Sheetnames,LEN(Sheetnames)-LEN(Workbook_Name)-2)
它给出了一个很好的列表,如下所示:

Master Index
Progress
Highway
Structural
Hydrology
Electrical
因此,我最初试图假设书中的前两页是未使用的两页,并尝试使用索引和偏移量来定义名称,但不幸失败

由于有可能会重新排列图纸,使讨论中的两个不是前两个,并且可以将它们重命名为其他名称,因此我使用以下命令来提取讨论中图纸的图纸名称。我在每张纸上重复这个公式一次

=MID(CELL("address",Progress!A:Z),FIND("]",CELL("address",Progress!A:Z))+1,FIND("'",CELL("address",Progress!A:Z),2)-1-FIND("]",CELL("address",Progress!A:Z)))
在上述情况下,我得到:

Progress
由于我使用索引/偏移量将一部分工作表名称定义为名称列表的想法在我脸上破灭了,我脑子里出了个屁,无法思考如何将工作表名称列表自动转换为定义的名称以用于数据验证

因为我试图自动完成这项工作,所以我试图绕过将公式向下复制X行的步骤。再说一次,如果这是我走那条路的唯一途径的话。只是想避开它

包含示例数据的列表应如下所示:

Highway
Structural
Hydrology
Electrical
更新:

我正在使用的当前公式,不确定使用它的方向或正确路径是:

=AGGREGATE(14,6,ROW(INDEX(A:A,1,1):INDEX(A:A,COUNTA(Sheetnames),1))/(RIGHT(Sheetnames,LEN(Sheetnames)-LEN(Workbook_Name)-2)<>MID(CELL("address",Progress!A:Z),FIND("]",CELL("address",Progress!A:Z))+1,FIND("'",CELL("address",Progress!A:Z),2)-1-FIND("]",CELL("address",Progress!A:Z)))),ROW(INDEX(A:A,1,1):INDEX(A:A,COUNTA(Sheetnames)-1,1)))
然后又卡住了

更新II

我让它工作了

 =RIGHT(INDEX(Sheetnames,AGGREGATE(14,6,ROW(INDEX(A:A,1,1):INDEX(A:A,COUNTA(Sheetnames),1))/(RIGHT(Sheetnames,LEN(Sheetnames)-LEN(Workbook_Name)-2)<>MID(CELL("address",Progress!A:Z),FIND("]",CELL("address",Progress!A:Z))+1,FIND("'",CELL("address",Progress!A:Z),2)-1-FIND("]",CELL("address",Progress!A:Z)))),ROW(INDEX(A:A,1,1):INDEX(A:A,COUNTA(Sheetnames)-1,1)))),LEN(INDEX(Sheetnames,AGGREGATE(14,6,ROW(INDEX(A:A,1,1):INDEX(A:A,COUNTA(Sheetnames),1))/(RIGHT(Sheetnames,LEN(Sheetnames)-LEN(Workbook_Name)-2)<>MID(CELL("address",Progress!A:Z),FIND("]",CELL("address",Progress!A:Z))+1,FIND("'",CELL("address",Progress!A:Z),2)-1-FIND("]",CELL("address",Progress!A:Z)))),ROW(INDEX(A:A,1,1):INDEX(A:A,COUNTA(Sheetnames)-1,1)))))-LEN(Workbook_Name)-2)
更新的“Sheetnames”现在是:


现在我陷入了困境,因为我无法让它进行数据验证

如果可以重命名或移动工作表,Excel如何知道要从列表中排除哪些工作表?工作表中是否有一个单元格应包含为“Include”或“X”或其他内容,以便让Excel知道?如果没有这一点,我不确定这是否可行。@tigeravatar是的,这个公式指向工作表上要排除的单元格,并提取其名称:=MID(单元格(“地址”,进度!a:Z),FIND(“]),cell(“地址”,进度!a:Z))+1,FIND(“”),cell(“地址”,进度!a:Z),2)-1-FIND(“”,cell(“地址”,进度!a:Z)))所以我重复了两次,在每张纸上硬编码一个要排除的位置。哇,为什么这么头痛?使用VBA,您已经启用了…@A.S.H,因为我在VBA方面非常弱。如果我能记住我的turbo pascal,我就可以在EXCEL中使用它了!正如我在某个地方说过的,我将使用VBA,但我希望得到一个公式解。我理解。但在我看来,你绝对应该缩短时间,使用VBA解决方案。这不仅简单明了,而且可以避免您最终陷入难以维护、修改、演变等的复杂公式的混乱。如果可以重命名或移动工作表,Excel如何知道要从列表中排除哪些工作表?工作表中是否有一个单元格应包含为“Include”或“X”或其他内容,以便让Excel知道?如果没有这一点,我不确定这是否可行。@tigeravatar是的,这个公式指向工作表上要排除的单元格,并提取其名称:=MID(单元格(“地址”,进度!a:Z),FIND(“]),cell(“地址”,进度!a:Z))+1,FIND(“”),cell(“地址”,进度!a:Z),2)-1-FIND(“”,cell(“地址”,进度!a:Z)))所以我重复了两次,在每张纸上硬编码一个要排除的位置。哇,为什么这么头痛?使用VBA,您已经启用了…@A.S.H,因为我在VBA方面非常弱。如果我能记住我的turbo pascal,我就可以在EXCEL中使用它了!正如我在某个地方说过的,我将使用VBA,但我希望得到一个公式解。我理解。但在我看来,你绝对应该缩短时间,使用VBA解决方案。这样做不仅简单明了,而且可以避免您最终陷入难以维护、修改、发展等的复杂公式的混乱。
 =RIGHT(INDEX(Sheetnames,AGGREGATE(14,6,ROW(INDEX(A:A,1,1):INDEX(A:A,COUNTA(Sheetnames),1))/(RIGHT(Sheetnames,LEN(Sheetnames)-LEN(Workbook_Name)-2)<>MID(CELL("address",Progress!A:Z),FIND("]",CELL("address",Progress!A:Z))+1,FIND("'",CELL("address",Progress!A:Z),2)-1-FIND("]",CELL("address",Progress!A:Z)))),ROW(INDEX(A:A,1,1):INDEX(A:A,COUNTA(Sheetnames)-1,1)))),LEN(INDEX(Sheetnames,AGGREGATE(14,6,ROW(INDEX(A:A,1,1):INDEX(A:A,COUNTA(Sheetnames),1))/(RIGHT(Sheetnames,LEN(Sheetnames)-LEN(Workbook_Name)-2)<>MID(CELL("address",Progress!A:Z),FIND("]",CELL("address",Progress!A:Z))+1,FIND("'",CELL("address",Progress!A:Z),2)-1-FIND("]",CELL("address",Progress!A:Z)))),ROW(INDEX(A:A,1,1):INDEX(A:A,COUNTA(Sheetnames)-1,1)))))-LEN(Workbook_Name)-2)
Defined Name "Sheetnames" (Characters 56)
=TRANSPOSE(GET.WORKBOOK(1,'Master Index'!$E$4)&T(NOW()))

Defined Name "Workbook_Name" (Characters 41)
=MID(Sheetnames,2,FIND("]",Sheetnames)-2)

Defined Name "Department_Index" (Characters 178)
=AGGREGATE(14,6,ROW(INDEX($A:$A,1,1):INDEX($A:$A,COUNTA(Sheetnames),1))/((Sheetnames<>exclude1)*(Sheetnames<>exclude2)),ROW(INDEX($A:$A,1,1):INDEX($A:$A,COUNTA(Sheetnames)-1,1)))

Defined Name "Departments" (Characters 103)
=RIGHT(INDEX(Sheetnames,Department_Index),LEN(INDEX(Sheetnames,Department_Index))-LEN(Workbook_Name)-2)
Defined Name "wbFilename"
=MID(CELL("filename",PROJ_NAME),FIND("[",CELL("filename",PROJ_NAME))+1,FIND("]",CELL("filename",PROJ_NAME))-FIND("[",CELL("filename",PROJ_NAME))-1)

Defined Name "PROJ_NAME"
='Master Index'!$B$1
Defined Name "Sheetnames"
=TRANSPOSE(GET.WORKBOOK(1,wbFilename)&T(NOW()))