excel 如何在一张图纸上取得档案中所有图纸的清单?

dbf7pr2w  于 2022-12-14  发布在  其他
关注(0)|答案(6)|浏览(158)

是否有方法以列表形式查找所有工作表的名称?
我可以通过以下公式找到放置公式的工作表的工作表名称:

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

这适用于放置公式的工作表。如何在一个工作表上获得文件中所有工作表的列表(假设在单元格A1:A5中,如果我有5个工作表)?
我想让它这样,当有人改变一个工作表名称的宏继续工作。

o0lyfsai

o0lyfsai1#

顺便说一句,在vba中你可以通过名称或对象引用工作表。见下面,如果你使用第一种方法引用你的工作表,它将始终与任何名称一起工作。

qzwqbdag

qzwqbdag2#

我会保留一个非常隐藏的工作表,其中包含您引用每个工作表时使用的公式。
Workbook_NewSheet事件触发时,将创建一个指向新工作表的公式:

  • 创建一张图纸,并给予其 * 代号 * 指定为shtNames
  • 为工作表指定SheetNames的 * 选项卡名称 *。
  • shtNames的单元格A1中添加一个标题(我刚刚使用了“Sheet List”)。
  • 在工作表的 * 属性 * 中,将 * 可见 * 更改为 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所说,使用用户不能更改的工作表代码名称,无论工作表标签名称如何,您的代码都将继续工作。

c7rzv4ha

c7rzv4ha3#

@Mischa Urlings与下面的代码,你得到的消息框中的消息如下:
1.图纸名称
1.工作表位置

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
vsnjm48y

vsnjm48y4#

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"
v1uwarro

v1uwarro5#

创建定义的名称(公式、名称管理器):named:YourSheetNames字段中的名称表示您的位置:

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

在表格中,您将A1:A5:

=INDEX(YourSheetNames,ROW())

这将为您提供(只要计算设置为xlautomatic)一个实际列表

vybvopom

vybvopom6#

以下VBA宏函数将所有工作表名称作为数组返回:

Function GetWorksheets() As Variant
    
    Dim ws As Worksheet
    Dim x As Integer
    Dim WSArray As Variant
    ReDim WSArray(1 To Worksheets.Count)

    x = 1
    For Each ws In Worksheets
        'Sheets("Sheet1").Cells(x, 1) = ws.Name
        WSArray(x) = ws.Name
        x = x + 1
    Next ws
    
    'Output Array
    GetWorksheets = WSArray
End Function

添加到VBA模块后,您可以在工作簿中的任何位置调用它,方法与调用常规Excel公式相同。
第一次
此VBA函数可用作以下Excel 4.0(XLM)宏的更安全的替代方法:

=REPLACE(GET.WORKBOOK(1);1;FIND("]";GET.WORKBOOK(1));"")

相关问题