构建选择工作表名称的动态列表

时间:2017-08-09 16:20:35

标签: excel excel-formula

这是this one

的后续问题

最终目标是拥有一个已定义的名称,例如" 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

所以我最初试图假设书中的前两张将是未使用的两张,并试图使用INDEX和OFFSET来定义名称,但却失败了。

由于有可能重新排列纸张以使前两个不是前两个,并且可以将它们重命名为其他内容,我使用以下内容来拉出相关纸张的纸张名称。我为每张纸重复了一次公式。

=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

由于我使用INDEX / OFFSET将SHEETNAMES的一部分定义为名字列表的想法在我脸上爆炸,我有一个脑屁并且无法想到如何将工作表名称列表自动转换为已定义的用于数据验证的名称。

因为我正在尝试自动执行此操作,所以我试图绕过将公式复制到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)))

目前我只是在排除进度表的情况下进行测试。目前,这导致6是最大的数组条目,其中包含的名称不等于&#34; Progress&#34;

基本思维过程

AGGREGATE(大或小,忽略错误,生成数字索引并除以案例不等于排除的工作表名称,索引编号从1到1 **小于工作簿中的工作表数量。)< / p> 当两张纸被排除在外时,

**将增加到2。

我没有得到6的结果,而是希望{1,3,4,5,6},{6,5,4,3,1}或其他一些数字的排列。

然后我可以转身并转储到定义的名称

INDEX(SHEETNAMES,{1,3,4,5,6})
再次陷入困境。

更新II

我让它工作SORTA

 =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)

神圣丑陋但作为CSE公式,它有效!但是......如何在定义的名称中输入CSE公式?

更新III

我让它在电子表格中工作,但我不能让它在定义的名称中工作

到目前为止,我的工作是:

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)

更新IV

我没有意识到我有一个坐在E4的公式。我现在已经将E4中的公式定义为:

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

和更新&#34; Sheetnames&#34;现在是:

Defined Name "Sheetnames"
=TRANSPOSE(GET.WORKBOOK(1,wbFilename)&T(NOW()))

现在我陷入困境,因为我无法使用数据验证

0 个答案:

没有答案
相关问题