Создание, копирование, перемещение и удаление рабочих листов Excel с помощью кода VBA. Методы Sheets.Add, Worksheet.Copy, Worksheet.Move и Worksheet.Delete.
Создание новых листов
Создание новых рабочих листов осуществляется с помощью метода Sheets.Add.
Синтаксис метода Sheets.Add
expression.Add [Before, After, Count, Type]
где expression – переменная, представляющая собой объект Sheet.
Компоненты метода Sheets.Add
- Before* – необязательный параметр типа данных Variant, указывающий на лист, перед которым будет добавлен новый.
- After* – необязательный параметр типа данных Variant, указывающий на лист, после которого будет добавлен новый.
- Count – необязательный параметр типа данных Variant, указывающий, сколько листов будет добавлено (по умолчанию – 1).
- Type – необязательный параметр типа данных Variant, указывающий тип листа: xlWorksheet** (рабочий лист) или xlChart (диаграмма), по умолчанию – xlWorksheet.
*Если Before и After не указаны, новый лист, по умолчанию, будет добавлен перед активным листом.
**Для создания рабочего листа (xlWorksheet) можно использовать метод Worksheets.Add, который для создания диаграмм уже не подойдет.
Примеры создания листов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
'Создание рабочего листа: Sheets.Add Worksheets.Add ThisWorkbook.Sheets.Add After:=ActiveSheet, Count:=2 Workbooks("Книга1.xlsm").Sheets.Add After:=Лист1 Workbooks("Книга1.xlsm").Sheets.Add After:=Worksheets(1) Workbooks("Книга1.xlsm").Sheets.Add After:=Worksheets("Лист1") 'Создание нового листа с заданным именем: Workbooks("Книга1.xlsm").Sheets.Add.Name = "Мой новый лист" 'Создание диаграммы: Sheets.Add Type:=xlChart 'Добавление нового листа перед 'последним листом рабочей книги Sheets.Add Before:=Worksheets(Worksheets.Count) 'Добавление нового листа в конец Sheets.Add After:=Worksheets(Worksheets.Count) |
- Лист1 в After:=Лист1 – это уникальное имя листа, указанное в проводнике редактора VBA без скобок.
- Лист1 в After:=Worksheets(«Лист1») – это имя на ярлыке листа, указанное в проводнике редактора VBA в скобках.
Создаваемый лист можно присвоить объектной переменной:
1 2 3 4 5 6 7 8 9 10 |
Dim myList As Object 'В активной книге Set myList = Worksheets.Add 'В книге «Книга1.xlsm» Set myList = Workbooks("Книга1.xlsm").Worksheets.Add 'Работаем с переменной myList.Name = "Listok1" myList.Cells(1, 1) = myList.Name 'Очищаем переменную Set myList = Nothing |
Если создаваемый лист присваивается объектной переменной, он будет помещен перед активным листом. Указать дополнительные параметры невозможно.
Копирование листов
Копирование рабочих листов осуществляется с помощью метода Worksheet.Copy.
Синтаксис метода Worksheet.Copy
expression.Copy [Before, After]
где expression – переменная, представляющая собой объект Worksheet.
Компоненты метода Worksheet.Copy
- Before* – необязательный параметр типа данных Variant, указывающий на лист, перед которым будет добавлена копия.
- After* – необязательный параметр типа данных Variant, указывающий на лист, после которого будет добавлена копия.
*Если Before и After не указаны, Excel создаст новую книгу и поместит копию листа в нее. Если скопированный лист содержит код в проекте VBA (в модуле листа), он тоже будет перенесен в новую книгу.
Примеры копирования листов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
'В пределах активной книги '(уникальные имена листов) Лист1.Copy After:=Лист2 'В пределах активной книги '(имена листов на ярлычках) Worksheets("Лист1").Copy Before:=Worksheets("Лист2") 'Вставить копию в конец: Лист1.Copy After:=Worksheets(Worksheets.Count) 'Из одной книги в другую Workbooks("Книга1.xlsm").Worksheets("Лист1").Copy _ After:=Workbooks("Книга2.xlsm").Worksheets("Лист1") 'Один лист активной книги в новую книгу Лист1.Copy 'Все листы книги с кодом в новую книгу ThisWorkbook.Worksheets.Copy |
Если рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.
Перемещение листов
Перемещение рабочих листов осуществляется с помощью метода Worksheet.Move.
Синтаксис метода Worksheet.Move
expression.Move [Before, After]
где expression – переменная, представляющая собой объект Worksheet.
Компоненты метода Worksheet.Move
- Before* – необязательный параметр типа данных Variant, указывающий на лист, перед которым будет размещен перемещаемый лист.
- After* – необязательный параметр типа данных Variant, указывающий на лист, после которого будет размещен перемещаемый лист.
*Если Before и After не указаны, Excel создаст новую книгу и переместит лист в нее.
Примеры перемещения листов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
'В пределах активной книги '(уникальные имена листов) Лист1.Move After:=Лист2 'В пределах активной книги '(имена листов на ярлычках) Worksheets("Лист1").Move Before:=Worksheets("Лист2") 'Размещение после последнего листа: Лист1.Move After:=Worksheets(Worksheets.Count) 'Из одной книги в другую Workbooks("Книга1.xlsm").Worksheets("Лист1").Move _ After:=Workbooks("Книга2.xlsm").Worksheets("Лист1") 'В новую книгу Лист1.Move |
Если рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.
Удаление листов
Удаление рабочих листов осуществляется с помощью метода Worksheet.Delete
Синтаксис метода Worksheet.Delete
expression.Delete
где expression – переменная, представляющая собой объект Worksheet.
Примеры удаления листов
1 2 3 4 5 6 7 8 9 10 11 |
'По уникальному имени Лист1.Delete 'По имени на ярлычке Worksheets("Лист1").Delete 'По индексу листа Worksheets(1).Delete 'В другой книге Workbooks("Книга1.xlsm").Worksheets("Лист1").Delete |
Если рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.
Как обратиться к рабочему листу, переименовать, скрыть или отобразить его с помощью кода VBA Excel, смотрите в этой статье.
А как удалить листы не указывая постоянно их название?:
Привет, Мон!
Можно удалить все листы, кроме указанных в условии, с помощью цикла For Each … Next:
Если по крупному
нет Проверки наличия Листа в книге
нет Переименования Листа
Привет, Сергей!
Переименование листов есть в статье VBA Excel. Рабочий лист (обращение, переименование, скрытие).
Добавил статью VBA Excel. Проверка существования листа.
Добрый день! не могу сделать в макросе – чтобы сделанному скопированному листу присваивалось свое имя, которое при новом запуске макроса новому листу будет присваивать новое имя из этой книги (переменное)
Добрый день, Эдуард!
Я правильно понял вопрос: нужно, чтобы макрос при каждом запуске создавал копию листа и присваивал ему новое имя, отличное от имени по умолчанию? Если так, то по каким правилам должно создаваться новое имя?
Здравствуйте. Не могу найти макрос может кто поможет.
Задача состоит в том что бы макрос читал все листы книги после чего делал копию этих листов и вставлял в эти же листы данные как значения. Т.е. фактически разрывал связи методом копи паст но на всех листах книги (колличество листов в книге может быть каждый раз разное.
Добрый день! Возможно ли полное копирование листа на нужный мне лист? В январе заполняются данные каждый день и надо чтобы за каждый день создавалась копия на заранее созданные 31 лист по дням?
Добрый день, Эдуард!
Это можно сделать двумя строками, но перед копированием следует проверить, не был ли исходный лист сегодня уже сохранен под новым именем:
Спасибо за помощь! Нашел другое решение более мне подходящее но не знаю как сделать чтобы созданые листы вставлялись по порядку нумерации 1,2,3 и т.д. после активного листа? Не поможете вот код
Спасибо все работает!
Еще вопрос, можно ли скопировать лист не в конец книги а между листами, есть 12 месяцев в книге ексель чтобы копировалось после января, февраля?
И может еще чтобы кнопка с макросом не копировалась а создавалась гипперссылка обратно на лист?
Я добавил код перемещения нового листа относительно исходного листа с именем текущего месяца и удаления ненужного нового листа, который создается при повторном вводе одного и того же числа:
Евгений огромное спасибо это то что и требовалось весьма признателен за Вашу помощь!!!
Эдуард, представленный выше код будет работать только с одним месяцем. Excel не даст создать в одной книге несколько листов с одним именем (одно и то же число, но разных месяцев). Вам придется как-то изменить наименование листов, например: 1.01-31.01, 1.02-28.02. Тогда для перемещения новых листов придется использовать другой алгоритм или по окончании одного месяца, все его листы переименовать, например так:
Я понял этого и не требуется по окончанию месяца листы будут сохранены отдельно.
А вот по предедущему коду нельзя ввести произвольное число т.е не по порядку 1,2,3 а сразу например 17 пропустив с 1 по 16?
Можно и так, если указать имя листа, перед которым вставлять перемещаемый (вместо всего блока If … End If):
В таком виде все работает как задумывалось – может кому то пригодится. Спасибо огромное Евгению за помощь!
Помогите с мелочью никак не пойму куда вставить умножить на 2,1 и на 1,9 чтобы не считалось +_ 20% в этой формуле?
=ДВССЫЛ(АДРЕС(СТРОКА();СТОЛБЕЦ()-1;1;1))
Эдуард, может быть у вас для ячейки с формулой установлен формат «Процентный»?
Нет числовой. условное форматирование со стрелками вверх вниз и вправо
=ДВССЫЛ(АДРЕС(СТРОКА();СТОЛБЕЦ()-1;1;1*2,6)) для стрелки вверх
=ДВССЫЛ(АДРЕС(СТРОКА();СТОЛБЕЦ()-1;1;1*2,4)) для стрелки вправо
но не работает может я не туда вставляю *2,6
Синтаксис функции АДРЕС:
АДРЕС(номер_строки;номер_столбца;[тип_ссылки];[A1];[имя_листа])
Там, где вы умножаете, должно быть логическое значение [A1]: ИСТИНА или ЛОЖЬ (1 или 0).