Excel vba номер листа по имени

Обращение к рабочим листам Excel из кода VBA. Переименование листов, скрытие и отображение с помощью кода VBA Excel. Свойства Worksheets.Name и Worksheets.Visible.

Обращение к рабочим листам

Рабочий лист (Worksheet) принадлежит коллекции всех рабочих листов (Worksheets) книги Excel. Обратиться к листу можно как к элементу коллекции и, напрямую, по его уникальному имени.

Откройте редактор VBA и обратите внимание на вашу книгу в проводнике, где уникальные имена листов указаны без скобок, а в скобках — имена листов, отображаемые на ярлычках в открытой книге Excel. Уникальные имена листов отсортированы по алфавиту и их расположение по порядку не будет соответствовать их индексам (номерам), если листы перемещались по отношению друг к другу. Индексы листов смотрите по порядку расположения ярлычков в открытой книге. Переместили листы — изменились их индексы.

Обращение к рабочему листу в коде VBA Excel:

‘По уникальному имени

УникИмяЛиста

‘По индексу

Worksheets(N)

‘По имени листа на ярлычке

Worksheets(«Имя листа»)

  • УникИмяЛиста — уникальное имя листа, отображаемое в проводнике редактора VBA без скобок, с помощью кода VBA изменить его невозможно.
  • N — индекс листа от 1 до количества всех листов в книге, соответствует порядковому номеру ярлычка этого листа в открытой книге Excel.
  • Имя листа — имя листа, отображаемое в проводнике редактора VBA в скобках, с помощью кода VBA изменить его можно.

Количество листов в рабочей книге Excel определяется так:

‘В активной книге

Worksheets.Count

‘В любой открытой книге,

‘например, в «Книга1.xlsm»

Workbooks(«Книга1.xlsm»).Worksheets.Count

Переименование листов

В VBA Excel есть некоторые особенности в наименовании листов, так как у рабочего листа есть два свойства, связанных с именем: (Name) и Name. Откройте окно «Properties» в редакторе VBA, нажав клавишу «F4», и выделите любой лист в проводнике. Вы увидите, что в окне «Properties» свойству (Name) в скобках соответствует в проводнике уникальное имя листа без скобок, а свойству Name без скобок соответствует изменяемое имя листа в скобках. Оба имени в окне «Properties» можно редактировать.

С помощью кода VBA Excel можно редактировать только имя листа Name, отображаемое на ярлычке листа и в проводнике без скобок. Для этого используется свойство рабочего листа Worksheets.Name со следующим синтаксисом:

expression.Name

где expression — переменная, представляющая собой объект Worksheet. Смена имени осуществляется путем присвоения нового значения свойству Worksheets.Name.

Допустим, у нас есть лист с уникальным именем (Name) — Лист1, индексом — 1 и именем Name — МойЛист, которое необходимо заменить на имя — Реестр.

Лист1.Name = «Реестр»

Worksheets(1).Name = «Реестр»

Worksheets(«МойЛист»).Name = «Реестр»

Скрытие и отображение листов

Для скрытия и отображения рабочих листов в VBA Excel используется свойство Worksheet.Visible со следующим синтаксисом:

expression.Visible

где expression — переменная, представляющая собой объект Worksheet. Свойству Worksheet.Visible могут присваиваться следующие значения:

  • False — лист становится невидимым, но он будет присутствовать в списке скрытых листов, и пользователь сможет его отобразить с помощью инструментов рабочей книги Excel.
  • xlVeryHidden — лист становится супер невидимым и его не будет в списке скрытых листов, пользователь не сможет его отобразить. Актуально для Excel 2003-2016.
  • True — лист становится видимым.

Аналоги присваиваемых значений:

  • False = xlHidden = xlSheetHidden = 1
  • xlVeryHidden = xlSheetVeryHidden = 2
  • True = xlSheetVisible = -1 (константа xlVisible вызывает ошибку)

Примеры:

Лист1.Visible = xlSheetHidden

Лист2.Visible = 1

Worksheets(Worksheets.Count).Visible = xlVeryHidden

Worksheets(«МойЛист»).Visible = True

Как создать, скопировать, переместить или удалить рабочий лист с помощью кода VBA Excel, смотрите в этой статье.

 

Limos

Пользователь

Сообщений: 102
Регистрация: 14.01.2014

#1

05.07.2017 14:56:55

Добрый день!

Подскажите как правильно получить следующую информацию.
Нужно получить индекс листа при неполном указании названия этого листа. Есть следующий код.

Код
MsgBox Worksheets("Лист_номер*").Index

Звездочка означает, что неважно какие символы будут дальше.
Как это правильно сделать?

Заранее спасибо.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

В цикле проверяйте наличие фрагмента в имени листа.

 

Limos

Пользователь

Сообщений: 102
Регистрация: 14.01.2014

Каким образом, подскажите приблизительно.

 

_Boroda_

Пользователь

Сообщений: 1496
Регистрация: 27.07.2013

Контакты см. в профиле

#4

05.07.2017 15:15:03

Приблизительно так

Код
Sub tt()
    Dim sh_ As Worksheet, shi_
    For Each sh_ In ThisWorkbook.Worksheets
        If InStr(sh_.Name, "Лист_номер") = 1 Then
            shi_ = sh_.Index
            Exit For
        End If
    Next sh_
    MsgBox shi_
End Sub

Изменено: _Boroda_05.07.2017 15:15:11

Скажи мне, кудесник, любимец ба’гов…

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#5

05.07.2017 15:17:45

Код
Sub ShName()
Dim sh As Worksheet
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name Like "Лист_номер*" Then
            MsgBox sh.Index
            Exit For
        End If
    Next sh
End Sub
 

Limos

Пользователь

Сообщений: 102
Регистрация: 14.01.2014

#6

05.07.2017 15:34:42

Спасибо большое)
Но есть одно но….

Я это находил чтобы обновить источник данных для сводной таблицы, вот код

Код
Sub Refresh_SourceData_PivotTables()

    Dim sh As Worksheet
    Dim DataArea As Range
    
    For Each sh In ThisWorkbook.Worksheets
        If sh.Name Like "Реестр RSh*" Then
            MsgBox sh.Index
            Range("A1").Select
            Selection.CurrentRegion.Select
            DataArea = "Sheet" & sh.Index & "!R1C1:R" & Selection.Rows.Count & "C" & Selection.Columns.Count
            MsgBox DataArea
            
            Exit For
        End If
    Next sh
    
    Worksheets("Свод").PivotTables("СводнаяТаблица4").ChangePivotCache ActiveWorkbook. _
            PivotCaches.Create(SourceType:=xlDatabase, SourceData:=DataArea, _
            Version:=xlPivotTableVersion14)

End Sub

Но, гад выдает ошибку Run-time error ’91’ Object variable or With block variable not set
Что может быть не так?

Изменено: Limos05.07.2017 15:46:01

Как узнать текущий номер листа книги?

Если у вас в книге несколько листов, есть ли у вас какие-нибудь хорошие идеи, чтобы получить текущий номер листа, кроме того, чтобы пересчитывать их по одному? В этой статье я расскажу о простом трюке, с помощью которого вы сможете вернуть номер активного рабочего листа по мере необходимости.

Получить текущий номер рабочего листа книги с кодом VBA


стрелка синий правый пузырь Получить текущий номер рабочего листа книги с кодом VBA

С помощью следующего простого кода VBA вы можете быстро получить номер активного рабочего листа по своему усмотрению, сделайте следующее:

1. Активируйте рабочий лист, которому вы хотите вернуть его порядковый номер.

2. Удерживайте ALT + F11 ключи, и он открывает Окно Microsoft Visual Basic для приложений.

3. Нажмите Вставить > Модулии вставьте следующий код в Окно модуля.

Код VBA: получить текущий номер листа

Sub GetActiveSheetIndex()
MsgBox ActiveSheet.Index
End Sub

4, Затем нажмите F5 ключ для запуска этого кода, и вы получите порядковый номер текущего рабочего листа во всплывающем окне сообщения, как показано на следующем снимке экрана:

документ-получить-текущий-лист-номер-1


Статьи по теме:

Как быстро вставить названия листов в ячейки в Excel?

Как посчитать количество листов в рабочей тетради?


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (3)


Оценок пока нет. Оцените первым!

Номера листов

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Номера листов

Необходимо узнать настоящие номера, листов….

в VBA, но как это сделать программно?

Public Sub jop1()

For i = 1 To Worksheets.Count

Sheets(«Номера_листов»).Activate

Cells(i, 1) = i

Cells(i, 2) = Sheets(i).Name

Next i

End Sub


RayShade
Scarmarked
Scarmarked
Аватара пользователя

 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg
  • Сайт
  • ICQ

Сообщение RayShade » 26.03.2003 (Ср) 15:51

For i = 1 To Worksheets.Count

Sheets(«Номера_листов»).Activate

Cells(i, 1) = Sheets(i).Index

Cells(i, 2) = Sheets(i).Name

Next i


Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol
  • ICQ

Сообщение Calvin » 26.03.2003 (Ср) 15:58

Ну вообще в этом примере i — является индексом, а так вообще

ActiveSheet.index

или

Sheets(«gfdghfdhgf»).index


sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 26.03.2003 (Ср) 16:08

Ну а если листов много, и хочется составить в цикле ОТЧЕТ?

Можно ли это сделать?


RayShade
Scarmarked
Scarmarked
Аватара пользователя

 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg
  • Сайт
  • ICQ

Сообщение RayShade » 26.03.2003 (Ср) 16:30

Ответ в моем постинге. Выделен специально жирным :lol:


sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 27.03.2003 (Чт) 11:20

Не удовлетворена, Ваш код-это то как посмотреть номер на Активном листе, а вот как пробежаться по всем листам, и посмотреть индекс каждого?


corgi
ToyMan
ToyMan
 
Сообщения: 1367
Зарегистрирован: 01.10.2002 (Вт) 9:59
Откуда: Россия, Москва
  • ICQ

Сообщение corgi » 27.03.2003 (Чт) 11:28

это код как записать данные в активный лист с других :P


RayShade
Scarmarked
Scarmarked
Аватара пользователя

 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg
  • Сайт
  • ICQ

Сообщение RayShade » 27.03.2003 (Чт) 11:29

Ну неужели нельзя немного проявить фантазии и доделать его до нужной кондиции? :x

For i = 1 To Worksheets.Count

Sheets(1).Cells(i, 1) = Sheets(i).Index

Sheets(1).Cells(i, 2) = Sheets(i).Name

Next i


Calvin
Постоялец
Постоялец
 
Сообщения: 409
Зарегистрирован: 21.01.2003 (Вт) 12:13
Откуда: Sebastopol
  • ICQ

Сообщение Calvin » 27.03.2003 (Чт) 11:29

2 Sonata Ну вообще-то ответ на этот попрос ты сама себе дала еще в самом первом посте

Public Sub jop1()

For i = 1 To Worksheets.Count
Sheets(«Номера_листов»).Activate
Cells(i, 1) = i
Cells(i, 2) = Sheets(i).Name
Next i
End Sub

здесь можно даже Sheets(i).Index не использовать, так как i в данном случае и является индексом листа.

а во-вторых RayShade и я дополнили в довольно полной мере :wink:

ЗЫ Обрати внимание, что я в первом своем посте указывал индекс не только активного листа….


Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 27.03.2003 (Чт) 11:29

For i = 1 To Workbooks.Count

MsgBox Workbooks(i).Name + » индекс:» + CStr(i)

Next i

Действительно, Sonata, оказывается вы в своем вопросе дали ответ

Пардон, для нумеров листов нужно организовать второй цикл

For i = 1 To Workbooks.Count

K=3

cells(i,1).value=Workbooks(i).Name

cells(i,2).value= i

For j = 1 To Workbooks(i).worksheets.count

cells(i,k).value= Workbooks(i).worksheets(j).index

k=k+1

next j

Next i

Можно и одним циклом, но тогда выдадутся идексы листов только активной книги:

k = 1

For i = 1 To Sheets.Count

Cells(1, k).Value = Sheets(i).Index

k = k + 1

Next i


sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 27.03.2003 (Чт) 17:09

Не понимаю….

Мне кажется, что я вполне понятно все объяснила, чего мне нужно…

То, что в моей программе -i — это обычный счетчик, а не индекс листа …

Например У меня есть лист с названием «ВСЕ» у него счетчик -3(по счету 3-й от начала книги), а индекс -15…., так вот, в моей програме выдается 3-ка, а мне нужно, чтобы выдавалось 15….


RayShade
Scarmarked
Scarmarked
Аватара пользователя

 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg
  • Сайт
  • ICQ

Сообщение RayShade » 27.03.2003 (Чт) 17:15

Повторяю еще раз! :evil: Индекс листа — это проперть .Index! Она содержит именно тот индекс, которй тебе нужен! :evil:


Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 27.03.2003 (Чт) 18:11

Порядковый номер листа это и есть Index!

Sheets -работает с листами только активной книги. В любой книге первый лист имеет Index =1, второй Index =2 и т.д. !!!!!


sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 27.03.2003 (Чт) 18:19

Но тогда как понять следующую ситуацию:

1. Есть лист с именем «ВСЕ»

2. По вышеуказ. программе его index=3(и он 3-й по счету)

Но, когда я делаю Лист15.Activate, то активизируется именно он, и в коде VBA стоит число 15 в скобках …. Как это понять????

Или я совсем уже заучилась?


sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 27.03.2003 (Чт) 18:24

А, когда пишу

Sheets(3).Select

то выбирается совершенно другой лист, который по счету 8, и индекс у него 8. Но, мне кажется, что сдесь не всегда возможны совпадения…,

ведь листы иногда удаляются, добавляются новые….


Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 27.03.2003 (Чт) 18:37

Но, когда я делаю Лист15.Activate, то активизируется именно он, и в коде VBA стоит число 15 в скобках …. Как это понять????

Или я совсем уже заучилась?

Лист15 это не Лист с индексом 15, а лист с именем Лист15, т.к. Лист15 мог пользователь перетащить на другую позицию :mrgreen: , или удалить листы перед Лист15. По умолчанию Excel называет Лист1 первый порядковый лист в книги, но символ 1 в имени листа, это не его индекс! :evil:


RayShade
Scarmarked
Scarmarked
Аватара пользователя

 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg
  • Сайт
  • ICQ

Сообщение RayShade » 28.03.2003 (Пт) 10:27

У меня нет слов. Остались только буквы и впервые за последний год я плачу как ребенок :cry: !!! Может, ты все таки не дашь мне погибнуть в расцвете сил и почитаешь хелпник? :lol:

Это просто имя листа и все. Значит, в том цикле выводи проперть .Name и получишь имена листов.


Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 28.03.2003 (Пт) 13:06

RayShade — я надеюсь что вы поняли, что я отвечал на вопрос Sonata. :wink:

Именно я и объяснял что такое имя, и что такое индекс, что это разные свойства одного объекта никак не связанные друг-с-другом. :lol:


RayShade
Scarmarked
Scarmarked
Аватара пользователя

 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg
  • Сайт
  • ICQ

Сообщение RayShade » 28.03.2003 (Пт) 13:10

Да я, собственно, про вас ничего и не имел в виду, я обращался к Sonata, конечно же :)



Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Понравилась статья? Поделить с друзьями:
  • Excel vba описание переменных
  • Excel vba невозможно убрать перенос строк
  • Excel vba описание массива
  • Excel vba не работает функция
  • Excel vba операции со строками