Как переместить рабочие листы
На чтение 2 мин. Просмотров 2.5k.
Что делает макрос: Если вам часто нужно переместить рабочие листы, вот макрос, который может помочь.
Содержание
- Как макрос работает
- Код макроса
- Как работает код
- Как использовать
Как макрос работает
Когда вы хотите изменить порядок листов, используется метод Move обоих объектов листов или объект ActiveSheet. При использовании метода Move, вам нужно указать, куда переместить лист. Вы можете сделать это с помощью аргумента After, аргумента Before, или обоих.
Код макроса
Sub PeremestitListi() 'Переместить активный лист до конца ActiveSheet.Move After:=Worksheets(Worksheets.Count) 'Переместить активный лист в начало ActiveSheet.Move Before:=Worksheets(1) 'Переместите Лист 1 перед Листом 12 Sheets("Лист1").Move Before:=Sheets("Лист12") End Sub
Как работает код
Этот макрос делает три вещи:
Во-первых, он перемещает активный лист в конец. Ничто в VBA не позволяет указывать на «последний лист». Но вы можете найти максимальное количество рабочих листов, а затем использовать это число в качестве индекса для объекта листам. Это означает, что мы можем ввести что-то вроде Worksheets (3), чтобы оказаться на третьем листе в книге. Таким образом, вы можете использовать рабочий лист (Worksheets.Count), чтобы оказаться на последнем листе.
Далее, этот макрос перемещает активный лист к началу рабочей книги. Это просто. Мы используем Worksheets(1), чтобы указать на первый лист в книге, а затем переместить активный лист перед ним.
И, наконец, макрос показывает, что вы можете перемещать листы, просто называя их по именам. В этом примере, мы двигаем Лист1 перед Листом12.
Как использовать
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши personal.xlb в окне Project.
- Введите или вставьте код во вновь созданном модуле.
Создание, копирование, перемещение и удаление рабочих листов 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:=Sheets(Sheets.Count) ‘Добавление нового листа в конец Sheets.Add After:=Sheets(Sheets.Count) |
- Лист1 в After:=Лист1 — это уникальное имя листа, указанное в проводнике редактора VBA без скобок.
- Лист1 в After:=Worksheets(«Лист1») — это имя на ярлыке листа, указанное в проводнике редактора VBA в скобках.
Создаваемый лист можно присвоить объектной переменной:
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 21 22 23 |
‘В пределах активной книги ‘(уникальные имена листов) Лист1.Copy After:=Лист2 ‘В пределах активной книги ‘(имена листов на ярлычках) Worksheets(«Лист1»).Copy Before:=Worksheets(«Лист2») ‘Вставить копию в конец Лист1.Copy After:=Sheets(Sheets.Count) ‘Из одной книги в другую Workbooks(«Книга1.xlsm»).Worksheets(«Лист1»).Copy _ After:=Workbooks(«Книга2.xlsm»).Worksheets(«Лист1») ‘Один лист активной книги в новую книгу Лист1.Copy ‘Несколько листов активной книги в новую книгу* Sheets(Array(«Лист1», «Лист2», «Лист3»)).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:=Sheets(Sheets.Count) ‘Из одной книги в другую Workbooks(«Книга1.xlsm»).Worksheets(«Лист1»).Move _ After:=Workbooks(«Книга2.xlsm»).Worksheets(«Лист1») ‘В новую книгу Лист1.Move |
Если рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.
Перемещение листа «Лист4» в позицию перед листом, указанным как по порядковому номеру, так и по имени ярлыка:
Sub Peremeshcheniye() Dim x x = InputBox(«Введите имя или номер листа», «Перемещение листа «Лист4»») If IsNumeric(x) Then x = CLng(x) Sheets(«Лист4»).Move Before:=Sheets(x) End Sub |
Удаление листов
Удаление рабочих листов осуществляется с помощью метода Worksheet.Delete
Синтаксис метода Worksheet.Delete
expression.Delete
где expression — переменная, представляющая собой объект Worksheet.
Примеры удаления листов
‘По уникальному имени Лист1.Delete ‘По имени на ярлычке Worksheets(«Лист1»).Delete ‘По индексу листа Worksheets(1).Delete ‘В другой книге Workbooks(«Книга1.xlsm»).Worksheets(«Лист1»).Delete |
Если рабочие книги указаны как элементы коллекции Workbooks, в том числе ActiveWorkbook и ThisWorkbook, листы нужно указывать как элементы коллекции Worksheets, использование уникальных имен вызовет ошибку.
Как обратиться к рабочему листу, переименовать, скрыть или отобразить его с помощью кода VBA Excel, смотрите в этой статье.
Fotail 0 / 0 / 0 Регистрация: 03.03.2022 Сообщений: 6 |
||||
1 |
||||
Excel Макрос переноса строки на другой лист04.03.2022, 09:32. Показов 1389. Ответов 10 Метки excel, vba, макрос (Все метки)
Здравствуйте, специалисты! Задача:
0 |
малоболт 1143 / 442 / 193 Регистрация: 30.01.2020 Сообщений: 1,095 |
|
04.03.2022, 10:58 |
2 |
Перенос строки с первого листа по условию значения «100%» в диапазоне [G:G] на второй лист, затем удаление этой строки с первого листа. Вопросы:
0 |
0 / 0 / 0 Регистрация: 03.03.2022 Сообщений: 6 |
|
04.03.2022, 11:09 [ТС] |
3 |
Первый лист имеет название «Отдел ПТО»
0 |
Punkt5 малоболт 1143 / 442 / 193 Регистрация: 30.01.2020 Сообщений: 1,095 |
||||
05.03.2022, 08:09 |
4 |
|||
Fotail, Пробуйте
0 |
Fotail 0 / 0 / 0 Регистрация: 03.03.2022 Сообщений: 6 |
||||
05.03.2022, 09:46 [ТС] |
5 |
|||
Fotail, Пробуйте
Вы волшебник! Всё работает как надо, кажется. Как я понял, в этом коде я меняю только «Const HdrRows = 1 ‘Число строк заголовка — поставьте сюда СВОЁ»? Если одна строка заголовка, соответственно код без изменений. И «.Name = «ИТОГО» ‘название 2 страницы» изменяю «итого» на название второго листа? Название первого листа нигде не нужно прописывать? Добавлено через 25 минут Добавлено через 4 минуты Добавлено через 6 минут
0 |
Punkt5 малоболт 1143 / 442 / 193 Регистрация: 30.01.2020 Сообщений: 1,095 |
||||
05.03.2022, 09:51 |
6 |
|||
Название первого листа нигде не нужно прописывать? Не нужно. Но если есть вероятность, что он не первый, можно везде по тексту заменить Sheets(1) на Sheets(«Моё название нужного листа«)
Как я понял, в этом коде я меняю только «Const HdrRows = 1 ‘Число строк заголовка — поставьте сюда СВОЁ»? Если одна строка заголовка, соответственно код без изменений. И «.Name = «ИТОГО» ‘название 2 страницы» изменяю «итого» на название второго листа? Всё правильно. Желательно помнить, что если вторая страница уже есть, то форматы ячеек на неё не переносятся — считается, что при её создании форматы были заданы сразу по столбцам, чтобы не возиться с каждой ячейкой. Если же второй страницы ещё нет — то форматы переносятся кодом сразу на столбцы, при этом читаются они просто из первой же строки под заголовком на первом листе.
Возможно ли как-то добавить msgbox после переноса в архив с отображением количества перенесенных строк? Например «В архив перенесено 8 строк». Конечно. Перед End Sub вставьте строчку:
К этому моменту в nRows как раз число переносимых строк.
При нажатии кнопки при отсутствующих значениях «100%» с первого листа, макрос переносит все строки с любыми значениями на второй лист. Упс. Перенесите строки 43-47, чтобы они встали перед 42-й. Это что-то я торопился.
0 |
0 / 0 / 0 Регистрация: 03.03.2022 Сообщений: 6 |
|
05.03.2022, 10:12 [ТС] |
7 |
Упс. Перенесите строки 43-47, чтобы они встали перед 42-й. Это что-то я торопился. Извините, не совсем понимаю о чём речь. Это в код изменения вносить?
0 |
Punkt5 малоболт 1143 / 442 / 193 Регистрация: 30.01.2020 Сообщений: 1,095 |
||||
05.03.2022, 10:17 |
8 |
|||
РешениеFotail, Вот исправленный код:
1 |
0 / 0 / 0 Регистрация: 03.03.2022 Сообщений: 6 |
|
05.03.2022, 10:20 [ТС] |
9 |
При отсутствующих значениях 100% и нажатии кнопки стал писать «В архив перенесено 145 строк», однако ни одну новую строку не вижу на втором листе. Это количество = количество строк, включая пустые, с имеющимися границами ячеек.
0 |
малоболт 1143 / 442 / 193 Регистрация: 30.01.2020 Сообщений: 1,095 |
|
05.03.2022, 10:24 |
10 |
При отсутствующих значениях 100% и нажатии кнопки стал писать «В архив перенесено 145 строк», однако ни одну новую строку не вижу на втором листе. Это количество = количество строк, включая пустые, с имеющимися границами ячеек. Возьмите код ещё раз. Он уже поправлен от этого. Вы слишком быстро его взяли.
0 |
0 / 0 / 0 Регистрация: 03.03.2022 Сообщений: 6 |
|
25.03.2022, 10:18 [ТС] |
11 |
Погонял макрос, всё работает исправно! Спасибо вам большое, очень помогли!
0 |
вы можете попробовать это
Option Explicit
Sub deleteNegativeValue()
Dim ws As Worksheet
Dim res As RangeFor Each ws In ThisWorkbook.Worksheets
Set res = Intersect(ws.Rows(1), ws.UsedRange).Find("value", LookAt:=xlPart)
If Not res Is Nothing Then
ws.Columns(res.Column).SpecialCells(xlCellTypeConstants, xlNumbers).Replace What:="-*", Replacement:="", SearchOrder:=xlByColumns, MatchCase:=False, LookAt:=xlWhole
Else
MsgBox "No Value found on Sheet " & ws.Name
End If
Next
End Sub
который должен работать быстрее, поскольку он не выполняет итерацию по каждой ячейке каждого столбца и ограничивает диапазон метода Find
используемым, а не всю строку.
единственным предупреждением является то, что первая строка всех поисковых листов не должна быть пустой…
Перенос заполненных ячеек на другой лист этой же книги |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
У меня есть книга Excel с 4 листами.
- Мастер лист
- test_1
- test_2
- test_3
Я хочу переместить данные из мастер-листа на все остальные листы, что я и сделал, создав макрос. Ежедневно данные мастер-листа будут увеличиваться, так как я могу учесть это изменение в макросе.
Я вставил свой существующий код ниже:
Sub sbCopyRangeToAnotherSheet()
Sheets("Master").Range("B10:M1628").Copy
Sheets("test_1").Activate
Range("B9").Select
ActiveSheet.Paste
Application.CutCopyMode = Flase
End Sub
Sub sbCopyRangeToCRP2()
Sheets("Master").Range("B10:M1628").Copy
Sheets("test_2").Activate
Range("B9").Select
ActiveSheet.Paste
Application.CutCopyMode = Flase
End Sub
Sub sbCopyRangeToCRP3()
Sheets("Master").Range("B10:M1628").Copy
Sheets("test_3").Activate
Range("B9").Select
ActiveSheet.Paste
Application.CutCopyMode = Flase
End Sub
В приведенном выше коде я упомянул жестко закодированное значение диапазона мастер-листа, которое начинается с B10 и заканчивается на M1628.
В дальнейшем количество строк увеличивается **(диапазон B10 останется)** и я не хочу жестко кодировать диапазон. Как я могу сделать это?
2017-03-14 08:10
4
ответа
Решение
Я предлагаю объединить эти 3 подпрограммы в одну, которую вы можете использовать повторно, указав рабочий лист в качестве параметра:
Sub sbCopyRangeToAnotherSheet(ToSheet As Worksheet)
Dim LastUsedRow As Long
With Sheets("Master")
LastUsedRow = .UsedRange.Row + .UsedRange.Rows.Count - 1
.Range("B10:M" & LastUsedRow).Copy ToSheet.Range("B9")
End With
Application.CutCopyMode = False
End Sub
Затем вы можете запустить этот саб для любого имени листа, как
Sub test_1()
sbCopyRangeToAnotherSheet Sheets("test_1")
'and for the second sheet
sbCopyRangeToAnotherSheet Sheets("test_2")
End Sub
2017-03-14 08:33
Я бы предложил либо использовать UsedRange
свойство объекта Worksheet,
или определить именованные диапазоны на листе, которые автоматически расширяются по мере роста данных на листе, например: =OFFSET($A$1,0,0,COUNTA($A:$A),1)
2017-03-14 08:15
Вы можете использовать этот макрос
Sub CopyAll()
Dim src As Range, dest
With Worksheets("Master") ' set the source range
Set src = .Range("B10:M" & .Cells(.Rows.Count, "B").End(xlUp).Row)
End With
For Each dest In Array("test_1", "test_2", "test_3") ' loop on destination sheets
src.Copy Worksheets(dest).Range("B9")
Next
End Sub
2017-03-14 08:41
Я думаю, что самый простой способ скопировать данные — это использовать массив, который заполнен динамически.
- Создать точный массив
- Заполните данные из мастер-листа
- Вставьте данные.
И в этом случае вам не нужно беспокоиться о новой строке, потому что вы используете динамический массив. Смотрите пример ниже.
Sub sbCopyRangeToAnotherSheet()
Sheets("Master").Select
Dim RowNum as integer
For i = 0 To 250000 'Count all rows
If IsEmpty(Cells(i + 10, 2)) = False Then
RowNum = RowNum + 1 'Count all rows which have data in it's second column
Else
Exit For
End If
Next
ReDim myData(RowNum - 1, 12) As String 'create array
For i = 0 To RowNum - 1 'fill array, with data
For j = 0 to 12
myData(i, j) = Cells(i + 10, j+2) '+10 because you said B**10**
'+2 because you said **B**10
Next
Next
Sheets("test_1").Activate
For i = 0 To RowNum - 1 'fill array, with data
For j = 0 to 12
Cells(i + 10, j+2) = myData(i, j) 'Fill cells with data
Next
Next
End Sub
2017-03-14 08:38