Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Рабочий лист (обращение, переименование, скрытие)

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

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

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

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

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

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

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

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

    В 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 — МойЛист, которое необходимо заменить на имя — Реестр.

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

    Для скрытия и отображения рабочих листов в 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 вызывает ошибку)

    Примеры:

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


    Фразы для контекстного поиска: обращение к листу, скрыть лист, скрытие листа, переименование листа, переименовать лист.


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    21 комментарий для “VBA Excel. Рабочий лист (обращение, переименование, скрытие)”

    1. Уникальное имя листа, отображаемое в проводнике редактора VBA без скобок, с помощью кода VBA изменить невозможно. В статье «Кодовое имя листа — что это и зачем нужно? Какие плюсы и минусы?» приведён код, позволяющий это сделать.

    2. Здравствуйте!
      Хотел поделиться моментом, заслуживающим внимания, на мой взгляд:
      обратите внимание, что обращаться к листу можно и через переменную
      Worksheets(i).Activate
      но допустим, что мы пишем
      i = 2,
      а у нас в книге присутствуют несколько листов, в т.ч. лист с именем 2
      Каким же образом будет происходить обращение?
      Опытным путём я установил, что это зависит от типа переменной
      т.е. i будет использоваться в качестве имени листа, только если оно предварительно обозначено, как текстовая строка
      Dim i as String
      в других же случаях будет происходить переключение на второй лист (т.е. переменная считается индексом) если переменная никак не обозначена (при отключенном Option Explicit) или обозначена:
      Dim i или Dim i as Variant
      Dim i as Byte
      Думаю, и с другими числовыми форматами будет вести себя также.

    3. Добрый день!
      Нигде не могу найти информацию о максимально возможном количестве листов в Excel
      Спасибо за внимание

      1. Евгений

        Добрый день!
        На сайте разработчиков написано: «Количество листов в книге ограничено объемом доступной оперативной памяти». В скобках указано количество листов в новой книге по умолчанию.

    4. здравствовать.
      есть 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 ?

      1. Евгений

        Привет!
        Первые две строки от макрорекордера вам не нужны:

    5. Евгений ,
      Ячейке F3 на листе (1) = "Тест"
      этой ячейке присвоено имя "ns"
      надо последний лист назвать по содержимому ячейки

      Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count)
      Sheets(Sheets.Count).Name = ns

      такой вариант машине не нравится

      Sheets(Sheets.Count).Name = "ns"

      В этом случае лист называется "ns" ( а надо "Тест")
      такое решение меня не устраивает
      Как листу присвоить имя по значению в именной ячейке ?

      1. Евгений

        Попробуйте так:

        или так

        1. спасибо, так работает.
          но теперь новая закавыка

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

          1. Евгений

            Неверное имя листа, "ns" — это имя ячейки.

    6. Здравствуйте! У меня похожий случай с данным Вами примером:
      Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count)
      Sheets(Sheets.Count).Name = Sheets(1).Range("F3")

      В цикле перебираю листы, делаю нужные манипуляции и сохраняю с именем, определенным содержимого одного из ячеек.
      Но если уже в книге имеется лист с таким именем, то, естественно, появляется ошибка 1004.
      Пробовал по ходу дела найти и удалить такой лист, но безуспешно. Лист удаляется, но возникает другая ошибка, типа
      "ошибка автоматического...", на английском, точно не запомнил. Надо: Заменить/удалить уже существующий лист и записать текущий лист с нужным мне именем. Имя присвоено переменной NewName или из Sheets(1).Range("F3").
      Спасибо.

      1. Евгений

        Здравствуйте, Ислам!
        Ищем циклом лист с таким же именем, как в ячейке Sheets(1).Range("F3"), и удаляем его. После этого копируем последний лист и переименовываем его. Application.DisplayAlerts = False отменяет запрос на удаление листа.

    7. Здравствуйте, Евгений! Спасибо за помощь. Получается такая последовательность операций с каждым перебираемым листом:
      1) узнаем его будущее имя(НовИмя), его имя пока(ТекИмя). Большая вероятность, что в книге уже имеется лист именем как НовИмя, назовем его СтарИмя.
      2) Этот лист(СтарИмя) находим и удаляем.
      3) Текущий лист(ТекИмя) копируем и уже листу-копии даем нужное нам имя(НовИмя).
      А сам лист, с которым мы работали(ТекИмя) так и остается в книге, «дубликатом бесценного груза», и со временем их может накопиться много да и будут мешать дальнейшей обработке. Приходиться Сохранять такие имена в массив и удалять уже другим макросом. Хотелось покороче, например sh.Name=NewName, где sh-объектная переменная соответствующая текущему, активному листу. Но возникает ошибка: -2147221080(800401a8) Automation error. Но если не было нужды предварительно удалять лист, то код sh.Name=NewName работает и мусорные листы не остаются. Спасибо.

    8. Здравствуйте. Лист xls содержит Страницы. Страницы на Листе нумеруются и располагаются сначала вниз по вертикали, а затем рядом, начиная с первой страницы. Два вопроса:
      1. можно ли управлять расположением Страниц так, что бы они располагались только по вертикали, то есть прокрутка по Страницам проходила только вниз и вверх?;
      2. Как (можно ли) убрать с экрана наименование Страниц?

    9. Здравствуйте. Подскажите пожалуйста как нажатием кнопки открыть лист в другой книге .xls (открытой).

      1. Евгений

        Добрый день!

    10. Спасибо.
      Для информации. Без последней строки или с закомментированной строкой
      "Application.WindowState = xlNormal" , тоже работает и отражает лист.

    11. Здравствуйте. Подскажите пожалуйста, как кнопкой на листе xls открыть документ «word1.docx» находящийся в той же папке что и Excel файл.

    12. Здравствуйте. Подскажите пожалуйста, как кнопкой на листе xls открыть документ «word1.docx» находящийся в той же папке что и Excel файл.

      Спасибо. Получилось самому.

    Обсуждение закрыто.