Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в 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 по тематическим разделам со ссылками на все статьи.

    15 комментариев для “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")

    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 работает и мусорные листы не остаются. Спасибо.

    Добавить комментарий

    Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора.