如何获得一张纸上一个文件中所有纸的列表?

时间:2018-12-10 09:18:38

标签: excel vba excel-formula

是否可以找到所有工作表的名称作为列表?

我可以通过以下公式找到放置该公式的工作表的工作表名称:

=RIGHT(CELL("filename";A1);LEN(CELL("filename";A1))-SEARCH("]";CELL("filename";A1);1))

此方法适用于公式所在的工作表。如何获得一张工作表中文件中所有工作表的列表(如果我有5张工作表,请在A1:A5单元格中说)?

我想这样做,以便当有人更改工作表名称时,宏保持正常工作。

5 个答案:

答案 0 :(得分:3)

顺便说一句,在vba中,您可以按名称或按对象引用工作表。参见下文,如果您使用第一种引用工作表的方法,它将始终使用任何名称。 enter image description here

答案 1 :(得分:1)

我会保留一个非常隐藏的工作表,其中包含您引用每个工作表所使用的公式。

Workbook_NewSheet事件触发时,将创建一个指向新工作表的公式:

  • 创建工作表,并为其指定shtNames代号
    • 给工作表一个标签名 SheetNames
    • A1的单元格shtNames中添加标题(我刚刚使用了“ Sheet List”)。
    • 属性中将工作表更改为 Visible 更改为 2-xlSheetVeryHidden
      只有在至少剩下一个可见的工作表时,您才能执行此操作。
  • 将此代码添加到ThisWorkbook模块中:

Private Sub Workbook_NewSheet(ByVal Sh As Object)

    With shtNames
        .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Formula = _
            "=RIGHT(CELL(""filename"",'" & Sh.Name & "'!$A$1), " & _
            "LEN(CELL(""filename"",'" & Sh.Name & "'!$A$1))-" & _
            "FIND(""]"",CELL(""filename"",'" & Sh.Name & "'!$A$1),1))"
    End With

End Sub  

名称管理器中创建一个命名范围:

  • 我称之为SheetList
  • 使用以下公式:
    =SheetNames!$A$2:INDEX(SheetNames!$A:$A,COUNTA(SheetNames!$A:$A))

然后,您可以将SheetList用作数据验证列表和列表控件的来源。

我尚未研究的两个潜在问题是重新排列工作表和删除工作表。

  

因此,当有人更改工作表名称时,宏将继续工作

正如@SNicolaou所说-使用用户无法更改的工作表代码名称,无论工作表标签名称如何,您的代码都将继续工作。

答案 2 :(得分:0)

进行定义的名称(公式,名称管理器):命名:YourSheetNames 在该字段中是指您放置的位置:

=IF(NOW()>0,REPLACE(GET.WORKBOOK(1),1;FIND("]",GET.WORKBOOK(1)),""))

在工作表中,您放置在A1:A5中:

=INDEX(YourSheetNames,ROW())

这会给您(只要将计算设置为xlautomatic)实际列表

答案 3 :(得分:0)

VBA功能,例如:

Function SheetName(ByVal Index As Long, Optional ByVal Book as Range) as String
    Application.Volatile
    If Book Is Nothing Then Set Book = Application.Caller
    SheetName=Book.Worksheet.Parent.Sheets(Index).Name
End Function

将按索引返回工作表名称,例如Excel公式。示例:

=SheetName(1) 'returns "Sheet1"
=SheetName(3) 'returns "Sheet3"

使用另一本书中的可选范围,您可以获得其他书名:

=SheetName(1, [Some other book.xls]Sheet1!A1) 'returns "Sheet1"
=SheetName(2, [Some other book.xls]Sheet1!A1) 'returns "Sheet2"

答案 4 :(得分:0)

@Mischa Urlings,在消息框中显示以下消息,并带有以下代码:

  1. 工作表名称
  2. 工作表位置

    Option Explicit
    
    Sub test()
    
    Dim ws As Worksheet
    Dim str As String
    
    For Each ws In ThisWorkbook.Worksheets
        str = str & vbNewLine & "Sheet named " & ws.Name & " located in position " & ws.Index & "."
    Next
    
    'Get the names in a list in message box
    MsgBox str
    
    End Sub