Как я могу получить список всех листов, которые находятся в файле на одном листе? - PullRequest
0 голосов
/ 10 декабря 2018

Есть ли способ найти имена всех листов в виде списка?

Я могу найти имя листа, в котором находится формула, по следующей формуле:

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

Это работает для листа, в который помещена формула. Как я могу получить список всех листов в файле на одном листе (скажем, в ячейке A1: A5, если у меня 5 листов)?

Я бы хотел, чтобы при смене имени листа макрос продолжал работать.

Ответы [ 5 ]

0 голосов
/ 10 декабря 2018

Я бы держал очень скрытый лист с формулой, которую вы использовали, ссылаясь на каждый лист.

Когда происходит событие Workbook_NewSheet, создается формула, указывающая на новый лист:

  • Создайте лист и присвойте ему Кодовое имя из shtNames.
    • Дайте листу имя вкладки из SheetNames.
    • В ячейку A1 из shtNames добавьте заголовок (я только что использовал "Список листов"),
    • В Свойства для смены листа Видимый на 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  

Создайте именованный диапазон в NameМенеджер :

  • Я назвал это SheetList.
  • Используйте эту формулу:
    =SheetNames!$A$2:INDEX(SheetNames!$A:$A,COUNTA(SheetNames!$A:$A))

Затем можно использовать SheetList в качестве источника для списков проверки данных и элементов управления списками.

Две потенциальные проблемы, которые я еще не рассмотрел, - это перестановка листов и удаление листов.

, поэтому, когда кто-то меняет имя листа, макрос продолжает работать

Как сказал @SNicolaou - используйте кодовое имя листа, которое пользователь не может изменить, и ваш код будет работать независимо от имени вкладки листа.

0 голосов
/ 10 декабря 2018

@ Миша 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
    
0 голосов
/ 10 декабря 2018

функция 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"
0 голосов
/ 10 декабря 2018

Кстати, в VBA вы можете обратиться к рабочим листам по имени или по объекту.См. Ниже, если вы используете первый метод обращения к своим рабочим листам, он всегда будет работать с любым именем.enter image description here

0 голосов
/ 10 декабря 2018

Создайте определенное имя (формулы, менеджер имен): named: YourSheetNames в поле относится к вашему месту:

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

На вашем листе вы помещаете в A1: A5:

=INDEX(YourSheetNames,ROW())

это даст вам (пока расчет установлен на xlautomatic) фактический список

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...