Обращение к рабочим листам Excel из кода VBA. Переименование листов, скрытие и отображение с помощью кода VBA Excel. Свойства Worksheets.Name и Worksheets.Visible.
Обращение к рабочим листам
Рабочий лист (Worksheet) принадлежит коллекции всех рабочих листов (Worksheets) книги Excel. Обратиться к листу можно как к элементу коллекции и, напрямую, по его уникальному имени.
Откройте редактор VBA и обратите внимание на вашу книгу в проводнике, где уникальные имена листов указаны без скобок, а в скобках — имена листов, отображаемые на ярлычках в открытой книге Excel. Уникальные имена листов отсортированы по алфавиту и их расположение по порядку не будет соответствовать их индексам (номерам), если листы перемещались по отношению друг к другу. Индексы листов смотрите по порядку расположения ярлычков в открытой книге. Переместили листы — изменились их индексы.
Обращение к рабочему листу в коде VBA Excel:
1 2 3 4 5 6 7 8 |
'По уникальному имени УникИмяЛиста 'По индексу Worksheets(N) 'По имени листа на ярлычке Worksheets("Имя листа") |
- УникИмяЛиста — уникальное имя листа, отображаемое в проводнике редактора VBA без скобок, с помощью кода VBA изменить его невозможно.
- N — индекс листа от 1 до количества всех листов в книге, соответствует порядковому номеру ярлычка этого листа в открытой книге Excel.
- Имя листа — имя листа, отображаемое в проводнике редактора VBA в скобках, с помощью кода VBA изменить его можно.
Количество листов в рабочей книге Excel определяется так:
1 2 3 4 5 6 |
'В активной книге 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 2 3 |
Лист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 2 3 4 |
Лист1.Visible = xlSheetHidden Лист2.Visible = -1 Worksheets(Worksheets.Count).Visible = xlVeryHidden Worksheets("МойЛист").Visible = True |
Как создать, скопировать, переместить или удалить рабочий лист с помощью кода VBA Excel, смотрите в этой статье.
Фразы для контекстного поиска: обращение к листу, скрыть лист, скрытие листа, переименование листа, переименовать лист.
Уникальное имя листа, отображаемое в проводнике редактора VBA без скобок, с помощью кода VBA изменить невозможно. В статье «Кодовое имя листа — что это и зачем нужно? Какие плюсы и минусы?» приведён код, позволяющий это сделать.
Отличная статья, спасибо!
Здравствуйте!
Хотел поделиться моментом, заслуживающим внимания, на мой взгляд:
обратите внимание, что обращаться к листу можно и через переменную
Worksheets(i).Activate
но допустим, что мы пишем
i = 2
,а у нас в книге присутствуют несколько листов, в т.ч. лист с именем 2
Каким же образом будет происходить обращение?
Опытным путём я установил, что это зависит от типа переменной
т.е. i будет использоваться в качестве имени листа, только если оно предварительно обозначено, как текстовая строка
Dim i as String
в других же случаях будет происходить переключение на второй лист (т.е. переменная считается индексом) если переменная никак не обозначена (при отключенном Option Explicit) или обозначена:
Dim i
илиDim i as Variant
Dim i as Byte
Думаю, и с другими числовыми форматами будет вести себя также.
Добрый день!
Нигде не могу найти информацию о максимально возможном количестве листов в Excel
Спасибо за внимание
Добрый день!
На сайте разработчиков написано: «Количество листов в книге ограничено объемом доступной оперативной памяти». В скобках указано количество листов в новой книге по умолчанию.
здравствовать.
есть Excel-документ
Листы:
"Sv","Янв","Фев" ..."Нояб"
Каждый месяц копируется предыдущий и вставляется в конец
макрорекордер записал следующее
Sheets(Sheets.Count).Select
ActiveSheet.Buttons.Add(525, 12, 126, 51).Select
Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count)
естественно новый лист имеет имя:
"Нояб(2)"
Вопрос:
Как последнему листу присвоить имя из ячейки F3, которая расположена на листе
Sheets(1) / "Sv"
?P.S.
что такое 525, 12, 126, 51 ?
Привет!
Первые две строки от макрорекордера вам не нужны:
спасибо, все работает
Евгений ,
Ячейке F3 на листе (1) =
"Тест"
этой ячейке присвоено имя
"ns"
надо последний лист назвать по содержимому ячейки
Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = ns
такой вариант машине не нравится
Sheets(Sheets.Count).Name = "ns"
В этом случае лист называется
"ns"
( а надо"Тест"
)такое решение меня не устраивает
Как листу присвоить имя по значению в именной ячейке ?
Попробуйте так:
или так
спасибо, так работает.
но теперь новая закавыка
Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count) 'Скопировать последн лист и разместить в конце
Sheets(Sheets.Count).Name = Sheets(1).Range("ns").Value ' присвоить имя
‘ команда «скрыть лист» работает правильно
ActiveWindow.SelectedSheets.Visible = False
Beep
Stop ' машина ругает на команду "отобразить"
Sheets(ns).Visible = True
Sheets("ns").Visible = True
Ей (машине) не нравятся оба варианта (
"Subscript out of range"
)Неверное имя листа,
"ns"
— это имя ячейки.Здравствуйте! У меня похожий случай с данным Вами примером:
Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = Sheets(1).Range("F3")
В цикле перебираю листы, делаю нужные манипуляции и сохраняю с именем, определенным содержимого одного из ячеек.
Но если уже в книге имеется лист с таким именем, то, естественно, появляется ошибка 1004.
Пробовал по ходу дела найти и удалить такой лист, но безуспешно. Лист удаляется, но возникает другая ошибка, типа
"ошибка автоматического..."
, на английском, точно не запомнил. Надо: Заменить/удалить уже существующий лист и записать текущий лист с нужным мне именем. Имя присвоено переменной NewName или изSheets(1).Range("F3")
.Спасибо.
Здравствуйте, Ислам!
Ищем циклом лист с таким же именем, как в ячейке
Sheets(1).Range("F3")
, и удаляем его. После этого копируем последний лист и переименовываем его.Application.DisplayAlerts = False
отменяет запрос на удаление листа.Здравствуйте, Евгений! Спасибо за помощь. Получается такая последовательность операций с каждым перебираемым листом:
1) узнаем его будущее имя(НовИмя), его имя пока(ТекИмя). Большая вероятность, что в книге уже имеется лист именем как НовИмя, назовем его СтарИмя.
2) Этот лист(СтарИмя) находим и удаляем.
3) Текущий лист(ТекИмя) копируем и уже листу-копии даем нужное нам имя(НовИмя).
А сам лист, с которым мы работали(ТекИмя) так и остается в книге, «дубликатом бесценного груза», и со временем их может накопиться много да и будут мешать дальнейшей обработке. Приходиться Сохранять такие имена в массив и удалять уже другим макросом. Хотелось покороче, например sh.Name=NewName, где sh-объектная переменная соответствующая текущему, активному листу. Но возникает ошибка: -2147221080(800401a8) Automation error. Но если не было нужды предварительно удалять лист, то код sh.Name=NewName работает и мусорные листы не остаются. Спасибо.
Здравствуйте. Лист xls содержит Страницы. Страницы на Листе нумеруются и располагаются сначала вниз по вертикали, а затем рядом, начиная с первой страницы. Два вопроса:
1. можно ли управлять расположением Страниц так, что бы они располагались только по вертикали, то есть прокрутка по Страницам проходила только вниз и вверх?;
2. Как (можно ли) убрать с экрана наименование Страниц?
Здравствуйте. Подскажите пожалуйста как нажатием кнопки открыть лист в другой книге .xls (открытой).
Добрый день!
Спасибо.
Для информации. Без последней строки или с закомментированной строкой
"Application.WindowState = xlNormal"
, тоже работает и отражает лист.Здравствуйте. Подскажите пожалуйста, как кнопкой на листе xls открыть документ «word1.docx» находящийся в той же папке что и Excel файл.
Здравствуйте. Подскажите пожалуйста, как кнопкой на листе xls открыть документ «word1.docx» находящийся в той же папке что и Excel файл.
Спасибо. Получилось самому.
Обсуждение закрыто.