如何获取另一个工作表中的所有工作表名称(添加新工作表名称时自动更新)

How to get all sheet names in another sheet (automatic update when add new sheetnames)

提问人:Hellihansen 提问时间:11/16/2023 更新时间:11/16/2023 访问量:95

问:

我有一个带有主工作表的 excel 文件,然后是多个工作表。我需要像这样在我的主表上显示多个工作表的所有名称;enter image description here

我该怎么做?

胜过

评论

0赞 Notus_Panda 11/16/2023
您什么时候需要它?当它处于活动状态/打开工作簿时/立即?
1赞 Mayukh Bhattacharya 11/16/2023
与你一起,将需要宏,否则使用或.也就是说,使用宏,在名称管理器中输入此公式,定义为 --> 并在 excel 的前端使用 or for 可以使用或代替 can useExcel FormulaExcel 4.0VBAPower QueryExcel 4.0SHEETNAMES=REPLACE(GET.WORKBOOK(1),1,FIND("]",GET.WORKBOOK(1)),"")=INDEX(SHEETNAMES, ROWS(A$1:A1))SHEETNAMES=TEXTAFTER(GET.WORKBOOK(1),"]")INDEX()=TOCOL(SHEETNAMES)
0赞 Hellihansen 11/16/2023
我应该在哪里编写此代码?我是 Excel 新手
0赞 user11222393 11/16/2023
@MayukhBhattacharya我相信 ROWS(A$1:A1) 只返回当前工作表名称。虽然 =INDEX(SHEETNAMES, 0) 将返回所有工作表的列表。此外,在“重新输入”公式之前,它不会更新。部分但不是最好的解决方法是使用某种易失性公式进行堆叠,以便在对任何其他单元格进行更改时更新它
1赞 Solar Mike 11/16/2023
您@Hellihansen按照解释定义了“sheetnames”这个名字?

答:

1赞 Solar Mike 11/16/2023 #1

这是一个简单的方法,但基于每个工作表的命名,如您的示例“sheetXX”:

enter image description here

在每张纸上,单元格 B1 中都有以下内容:

CELL("filename",A1)

你可以把它放在其他地方或隐藏它,将其格式化为白色等

因此,使用 mid() 仅获取工作表名称:

MID(INDIRECT("Sheet"&ROW()&"!B$1"),FIND("]",INDIRECT("Sheet"&ROW()&"!B$1"),1)+1,20)

评论

0赞 Mayukh Bhattacharya 11/16/2023
先生,由于只需要工作表名称,您能否在公式之前添加以仅获取所需的名称,否则它会显示桌面的完整文件路径TEXTAFTER(your_formula,"]")
0赞 Solar Mike 11/16/2023
@MayukhBhattacharya这就是为什么我用 mid() 显示版本来获取名称的原因 - 没有使用 textafter(),因为这在许多版本的 Excel 中并不常见,并且 OP 没有明确说明正在使用哪个版本,所以我构建了它以更广泛地使用。Textafter()、Textbefore()、split() 等非常有用,但:)
0赞 Mayukh Bhattacharya 11/16/2023
啊,好吧,明白了!
0赞 Solar Mike 11/16/2023
@MayukhBhattacharya我喜欢你的风格,干杯。
1赞 Ron Rosenfeld 11/16/2023 #2

使用 VBA:

  • 在您希望获得结果的工作表上 _ 右键单击底部的工作表选项卡
    • 选择View Code
    • 将下面的代码粘贴到打开的窗口中
  • 每当您选择该工作表时,该列表都会更新
    • 请注意,当您添加或删除工作表时,该工作表将变为活动状态,并且当您重新选择显示该列表的工作表时,更改将反映在您的列表中。
  • 如果需要,可以添加例程对列表进行排序,和/或排除包含列表的工作表名;或省略代号(实际上仅在 VBA 中有用)
Option Explicit
Private Sub Worksheet_Activate()
    Dim WS As Worksheet
    Dim V() As Variant
    Dim I As Long
    
With ThisWorkbook
    ReDim V(0 To .Worksheets.Count, 1 To 2)
    V(0, 1) = "Sheet Name"
    V(0, 2) = "Code Name"
    I = 0
    For Each WS In .Worksheets
        I = I + 1
        V(I, 1) = WS.Name
        V(I, 2) = WS.CodeName
    Next WS
End With

With Cells(1, 1).Resize(rowsize:=UBound(V, 1) + 1, columnsize:=UBound(V, 2))
    .EntireColumn.ClearContents
    .Value = V
    
'Can omit the next line
'The Style name might be different if your Excel is not English
    .Style = "Output"
    .EntireColumn.AutoFit
End With
    
End Sub