Excel макрос перемещение по листам

Как переместить рабочие листы

На чтение 2 мин. Просмотров 2.5k.

Что делает макрос: Если вам часто нужно переместить рабочие листы, вот макрос, который может помочь.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как работает код
  4. Как использовать

Как макрос работает

Когда вы хотите изменить порядок листов, используется метод 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.

Как использовать

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. Щелкните правой кнопкой мыши personal.xlb в окне Project.
  3. Введите или вставьте код во вновь созданном модуле.

Создание, копирование, перемещение и удаление рабочих листов 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, макрос (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте, специалисты!
Помогите, пожалуйста, разобраться с макросом в excel. Я не разбираюсь в кодах, но начал заинтересовываться.

Задача:
-Создание архива выполненных задач.
-Перенос строки с первого листа по условию значения «100%» в диапазоне [G:G] на второй лист, затем удаление этой строки с первого листа.
-Уже подсмотрел готовый код на форуме, но он полностью удаляет всё на втором листе при нажатии кнопки макроса. -Нужно, чтобы строки переносились в свободные ячейки, а не замещали имеющиеся.
-То есть при появлении нового значения 100% в ячейке и нажатии кнопки, нужно чтобы это строка вставилась на второй лист в свободную строку, а предыдущие строки на втором листе остались.
Код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub Кнопка2_Щелчок()
 Dim rng As Range, x: Application.ScreenUpdating = False
    x = "100%"
    If Sheets("Лист 1").[G:G].Find(x) Is Nothing Then Exit Sub
    With Sheets("Архив")
        .Cells.ClearContents
        Sheets("Лист 1").UsedRange.Copy .[A1]
.[G:G].ColumnDifferences(.[G:G].Find(x)).EntireRow.Delete
       End With
       
       
 
With Sheets("Отдел ПТО")
        Dim ra As Range, delra As Range, Текстдляпоиска As String
    Application.ScreenUpdating = False
 
    Текстдляпоиска = "100%"
 
    For Each ra In ActiveSheet.UsedRange.Rows
        
        If Not ra.Find(Текстдляпоиска, , xlValues, xlPart) Is Nothing Then
           
            If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
        End If
    Next
    If Not delra Is Nothing Then delra.EntireRow.Delete
    End With
    
End Sub



0



малоболт

1143 / 442 / 193

Регистрация: 30.01.2020

Сообщений: 1,095

04.03.2022, 10:58

2

Цитата
Сообщение от Fotail
Посмотреть сообщение

Перенос строки с первого листа по условию значения «100%» в диапазоне [G:G] на второй лист, затем удаление этой строки с первого листа.

Вопросы:
1. В каком формате те самые значения в столбце G:G. Числовой? Текстовый? Процентный? Общий?
2. Надо ли проверять, есть ли дублирование данной строки на втором листе? И если да, то по каким критериям? Или пофиг — просто копируем, и всё?
3. Могут ли значения в G:G быть больше 100%, и что делать в этом случае? Оставлять и не переносить, или перенос осуществлять во всех случаях, когда >=100% ? Или только в =100%?
4. Есть ли на первом листе строка заголовков. Или проверку на 100% вести с самой первой строки?
5. Что делать, если второй страницы нет?
6. Что делать, если формат ячеек второй страницы не совпадает с форматом ячеек первой? И надо ли их проверять, или пофиг?



0



0 / 0 / 0

Регистрация: 03.03.2022

Сообщений: 6

04.03.2022, 11:09

 [ТС]

3

Первый лист имеет название «Отдел ПТО»
1. Значения в процентном формате.
2. Проверять не нужно есть ли такая строка на втором листе, ибо такое невозможно в моём случае. Так как эта строка должна удалиться с первого листа после переноса её на второй лист. А одинаковых строк не может быть.
3. Значения не могут быть выше 100% — данные значения это статус выполнения задачи.
4. Да, на первом листе есть строка заголовков. В столбце G этот заголовок «Статус».
5. Второй лист назван «Архив», вряд ли возможна ситуация, когда его нет. В ином случае — создать.
6. Возможно ли как то копировать с первого листа на второй с сохранением формата ячеек первого листа? Желательно, чтобы даты остались датами, проценты процентами.



0



Punkt5

малоболт

1143 / 442 / 193

Регистрация: 30.01.2020

Сообщений: 1,095

05.03.2022, 08:09

4

Fotail, Пробуйте

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Option Explicit
Sub mmm()
   Dim aa, ff, aaDel, ii2, ii, nCols, nRows
   Const HdrRows = 1 'Число строк заголовка - поставьте сюда СВОЁ
   With Sheets(1).UsedRange
     nCols = .Columns().Count + .Column - 1 'число колонок на первой тсранице
     nRows = .Rows().Count + .Row - 1 'Число строк на первой странице
   End With
   ReDim ff(nCols - 1) ' массив форматов ячеек
   With Sheets(1)
     For ii = 0 To nCols - 1 Step 1
       ff(ii) = .Cells(HdrRows + 1, ii + 1).NumberFormat 'считаем форматы первой строки данных после заголовка
     Next
     aa = .Cells(1, 1).Resize(nRows, nCols).Value 'Считаем все данные с 1 страницы
   End With
   If Sheets.Count < 2 Then ' Если 2 страницы нет - добавим
     Sheets.Add , Sheets(1), 1
     With Sheets(2)
       .Name = "ИТОГО" 'название 2 страницы
       .Cells(1, 1).Resize(HdrRows, nCols).Value = aa 'заголовок перенесем
       For ii = 1 To nCols Step 1
         .Columns(ii).NumberFormat = ff(ii - 1) 'форматы зададим сразу колонкам
       Next
     End With
   End If
   ReDim aaDel(UBound(aa) - 1) 'массив номеров переносимых и удаляемых строк
   ii2 = 0 ' число переносимых и удаляемых строк
   For ii = HdrRows + 1 To nRows Step 1 ' по всем строкам ниже заголовка
     If aa(ii, 7) >= 1# Then ' Если в G:G больше или равно 100%
       aaDel(ii2) = ii 'записываем номер строки в массив удаляемых
       ii2 = ii2 + 1 ' увеличиваеам число переносимых и удаляемых строк
     End If
   Next
   If ii2 > 0 Then 'Если есть что переносить
     nRows = ii2 ' 
     ReDim Preserve aaDel(nRows - 1)
     For ii2 = 1 To nRows Step 1 'для каждой удаляемой строки
       For ii = 1 To nCols Step 1
          aa(ii2, ii) = aa(aaDel(ii2 - 1), ii) 'переносим её в начало массива данных
       Next
     Next
   End If
' записываем данные после последней строки на 2 листе (форматы уже перенесли ранее для столбцов)   
   Sheets(2).Cells(Sheets(2).UsedRange.Rows.Count + Sheets(2).UsedRange.Row, 1).Resize(nRows, nCols).Value = aa
   For ii2 = nRows To 1 Step -1
     Sheets(1).Rows(aaDel(ii2 - 1)).Delete 'удаляем строки снизу вверх на первой странице
   Next
End Sub



0



Fotail

0 / 0 / 0

Регистрация: 03.03.2022

Сообщений: 6

05.03.2022, 09:46

 [ТС]

5

Цитата
Сообщение от Punkt5
Посмотреть сообщение

Fotail, Пробуйте

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Option Explicit
Sub mmm()
   Dim aa, ff, aaDel, ii2, ii, nCols, nRows
   Const HdrRows = 1 'Число строк заголовка - поставьте сюда СВОЁ
   With Sheets(1).UsedRange
     nCols = .Columns().Count + .Column - 1 'число колонок на первой тсранице
     nRows = .Rows().Count + .Row - 1 'Число строк на первой странице
   End With
   ReDim ff(nCols - 1) ' массив форматов ячеек
   With Sheets(1)
     For ii = 0 To nCols - 1 Step 1
       ff(ii) = .Cells(HdrRows + 1, ii + 1).NumberFormat 'считаем форматы первой строки данных после заголовка
     Next
     aa = .Cells(1, 1).Resize(nRows, nCols).Value 'Считаем все данные с 1 страницы
   End With
   If Sheets.Count < 2 Then ' Если 2 страницы нет - добавим
     Sheets.Add , Sheets(1), 1
     With Sheets(2)
       .Name = "ИТОГО" 'название 2 страницы
       .Cells(1, 1).Resize(HdrRows, nCols).Value = aa 'заголовок перенесем
       For ii = 1 To nCols Step 1
         .Columns(ii).NumberFormat = ff(ii - 1) 'форматы зададим сразу колонкам
       Next
     End With
   End If
   ReDim aaDel(UBound(aa) - 1) 'массив номеров переносимых и удаляемых строк
   ii2 = 0 ' число переносимых и удаляемых строк
   For ii = HdrRows + 1 To nRows Step 1 ' по всем строкам ниже заголовка
     If aa(ii, 7) >= 1# Then ' Если в G:G больше или равно 100%
       aaDel(ii2) = ii 'записываем номер строки в массив удаляемых
       ii2 = ii2 + 1 ' увеличиваеам число переносимых и удаляемых строк
     End If
   Next
   If ii2 > 0 Then 'Если есть что переносить
     nRows = ii2 ' 
     ReDim Preserve aaDel(nRows - 1)
     For ii2 = 1 To nRows Step 1 'для каждой удаляемой строки
       For ii = 1 To nCols Step 1
          aa(ii2, ii) = aa(aaDel(ii2 - 1), ii) 'переносим её в начало массива данных
       Next
     Next
   End If
' записываем данные после последней строки на 2 листе (форматы уже перенесли ранее для столбцов)   
   Sheets(2).Cells(Sheets(2).UsedRange.Rows.Count + Sheets(2).UsedRange.Row, 1).Resize(nRows, nCols).Value = aa
   For ii2 = nRows To 1 Step -1
     Sheets(1).Rows(aaDel(ii2 - 1)).Delete 'удаляем строки снизу вверх на первой странице
   Next
End Sub

Вы волшебник! Всё работает как надо, кажется. Как я понял, в этом коде я меняю только «Const HdrRows = 1 ‘Число строк заголовка — поставьте сюда СВОЁ»? Если одна строка заголовка, соответственно код без изменений. И «.Name = «ИТОГО» ‘название 2 страницы» изменяю «итого» на название второго листа? Название первого листа нигде не нужно прописывать?

Добавлено через 25 минут
Возможно ли как-то добавить msgbox после переноса в архив с отображением количества перенесенных строк? Например «В архив перенесено 8 строк».

Добавлено через 4 минуты
Возникла проблема. По началу работает нормально, затем если кликаешь на кнопку при отсутствующих значениях 100% на первом листе, выдаёт ошибку с выделением желтым следующей строки:
«Sheets(1).Rows(aaDel(ii2 — 1)).Delete ‘удаляем строки снизу вверх на первой странице» с примечанием «aaDel(ii2 — 1) = Empty».
После этого при добавлении 100% на первом листе и нажатии кнопки, он переносит абсолютно все строки с первого листа на второй.

Добавлено через 6 минут
При нажатии кнопки при отсутствующих значениях «100%» с первого листа, макрос переносит все строки с любыми значениями на второй лист.



0



Punkt5

малоболт

1143 / 442 / 193

Регистрация: 30.01.2020

Сообщений: 1,095

05.03.2022, 09:51

6

Цитата
Сообщение от Fotail
Посмотреть сообщение

Название первого листа нигде не нужно прописывать?

Не нужно. Но если есть вероятность, что он не первый, можно везде по тексту заменить Sheets(1) на Sheets(«Моё название нужного листа«)

Цитата
Сообщение от Fotail
Посмотреть сообщение

Как я понял, в этом коде я меняю только «Const HdrRows = 1 ‘Число строк заголовка — поставьте сюда СВОЁ»? Если одна строка заголовка, соответственно код без изменений. И «.Name = «ИТОГО» ‘название 2 страницы» изменяю «итого» на название второго листа?

Всё правильно. Желательно помнить, что если вторая страница уже есть, то форматы ячеек на неё не переносятся — считается, что при её создании форматы были заданы сразу по столбцам, чтобы не возиться с каждой ячейкой. Если же второй страницы ещё нет — то форматы переносятся кодом сразу на столбцы, при этом читаются они просто из первой же строки под заголовком на первом листе.

Цитата
Сообщение от Fotail
Посмотреть сообщение

Возможно ли как-то добавить msgbox после переноса в архив с отображением количества перенесенных строк? Например «В архив перенесено 8 строк».

Конечно. Перед End Sub вставьте строчку:

Visual Basic
1
MsgBox "В архив перенесено " & nRows & " строк"

К этому моменту в nRows как раз число переносимых строк.

Цитата
Сообщение от Fotail
Посмотреть сообщение

При нажатии кнопки при отсутствующих значениях «100%» с первого листа, макрос переносит все строки с любыми значениями на второй лист.

Упс. Перенесите строки 43-47, чтобы они встали перед 42-й. Это что-то я торопился.



0



0 / 0 / 0

Регистрация: 03.03.2022

Сообщений: 6

05.03.2022, 10:12

 [ТС]

7

Цитата
Сообщение от Punkt5
Посмотреть сообщение

Упс. Перенесите строки 43-47, чтобы они встали перед 42-й. Это что-то я торопился.

Извините, не совсем понимаю о чём речь. Это в код изменения вносить?



0



Punkt5

малоболт

1143 / 442 / 193

Регистрация: 30.01.2020

Сообщений: 1,095

05.03.2022, 10:17

8

Лучший ответ Сообщение было отмечено Fotail как решение

Решение

Fotail, Вот исправленный код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Option Explicit
Sub mmm()
   Dim aa, ff, aaDel, ii2, ii, nCols, nRows
   Const HdrRows = 1 'Число строк заголовка - поставьте сюда СВОЁ
   With Sheets(1).UsedRange
     nCols = .Columns().Count + .Column - 1 'число колонок на первой тсранице
     nRows = .Rows().Count + .Row - 1 'Число строк на первой странице
   End With
   ReDim ff(nCols - 1) ' массив форматов ячеек
   With Sheets(1)
     For ii = 0 To nCols - 1 Step 1
       ff(ii) = .Cells(HdrRows + 1, ii + 1).NumberFormat 'считаем форматы первой строки данных после заголовка
     Next
     aa = .Cells(1, 1).Resize(nRows, nCols).Value 'Считаем все данные с 1 страницы
   End With
   If Sheets.Count < 2 Then ' Если 2 страницы нет - добавим
     Sheets.Add , Sheets(1), 1
     With Sheets(2)
       .Name = "ИТОГО" 'название 2 страницы
       .Cells(1, 1).Resize(HdrRows, nCols).Value = aa 'заголовок перенесем
       For ii = 1 To nCols Step 1
         .Columns(ii).NumberFormat = ff(ii - 1) 'форматы зададим сразу колонкам
       Next
     End With
   End If
   ReDim aaDel(UBound(aa) - 1) 'массив номеров переносимых и удаляемых строк
   ii2 = 0 ' число переносимых и удаляемых строк
   For ii = HdrRows + 1 To nRows Step 1 ' по всем строкам ниже заголовка
     If aa(ii, 7) >= 1# Then ' Если в G:G больше или равно 100%
       aaDel(ii2) = ii 'записываем номер строки в массив удаляемых
       ii2 = ii2 + 1 ' увеличиваеам число переносимых и удаляемых строк
     End If
   Next
   If ii2 > 0 Then 'Если есть что переносить
     nRows = ii2 ' 
     ReDim Preserve aaDel(nRows - 1)
     For ii2 = 1 To nRows Step 1 'для каждой удаляемой строки
       For ii = 1 To nCols Step 1
          aa(ii2, ii) = aa(aaDel(ii2 - 1), ii) 'переносим её в начало массива данных
       Next
     Next
' записываем данные после последней строки на 2 листе (форматы уже перенесли ранее для столбцов)   
     Sheets(2).Cells(Sheets(2).UsedRange.Rows.Count + Sheets(2).UsedRange.Row, 1).Resize(nRows, nCols).Value = aa
     For ii2 = nRows-1 To 0 Step -1
       Sheets(1).Rows(aaDel(ii2)).Delete 'удаляем строки снизу вверх на первой странице
     Next
     MsgBox "В архив перенесено " & nRows & " строк"
   Else
     MsgBox "Нечего переносить"
   End If
End Sub



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

Цитата
Сообщение от Fotail
Посмотреть сообщение

При отсутствующих значениях 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 Range

For 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 используемым, а не всю строку.

единственным предупреждением является то, что первая строка всех поисковых листов не должна быть пустой…

Перенос заполненных ячеек на другой лист этой же книги

Controler

Дата: Понедельник, 14.03.2016, 07:52 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 14


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

Всем добрый день!

Помогите с макросом, для переноса заполненных ячеек на другой лист этой же книги. Причем заполненных строк может быть она или несколько.
Вот пример моего макроса:

[vba]

Код

Sub Перенос()
Sheets(«Отчет за сутки).Range(«A:j»).SpecialCells(2).Copy Sheets(«Отчет за 2016 г.»).Range(«A» & Rows.Count).End(xlUp)
ThisWorkbook.Sheets(«Отчет за сутки»).Copy
Sheets(«Отчет за сутки»).Range(«a2:j10»).ClearContents
MsgBox («Данные в отчет за 2016 г. внесены!»)
End Sub

[/vba]

У меня почему копируются ячейки с названием столбцов, а мне нужно чтобы копировались только данные
[moder]Оформляйте коды тегами (кнопка #). На первый раз исправила[/moder]

К сообщению приложен файл:

2192281.xls
(76.0 Kb)

 

Ответить

KuklP

Дата: Понедельник, 14.03.2016, 08:30 |
Сообщение № 2

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

[vba]

Код

Sub Перенос()
    With ThisWorkbook.Sheets(«Отчет за сутки»)
        .Range(«A2:j» & .Cells(.Rows.Count, 1).End(xlUp).Row).SpecialCells(2).Copy Sheets(«Отчет за 2016 г.»).Range(«A» & Rows.Count).End(xlUp)
        .Copy
        .Range(«A2:j» & .Cells(.Rows.Count, 1).End(xlUp).Row).ClearContents
        MsgBox («Данные в отчет за 2016 г. внесены!»)
    End With
End Sub

[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

Controler

Дата: Понедельник, 14.03.2016, 08:56 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 14


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

цитата удалена

С этим макросом данные копируются на другой лист, но при этом стирается 1 строка названием столбцов, и следующая вставка ячеек происходит со второй строки, надо чтобы данные вносились после последней заполненной строки, при этом оставался заголов 1 строки с названиями столбцов
[moder]
Не надо цитировать посты целиком, это нарушение Правил форума.[/moder]

 

Ответить

KuklP

Дата: Понедельник, 14.03.2016, 09:45 |
Сообщение № 4

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

В Вашем файе-примере НЕТ данных. Вот заполните таблицы данными, попробуйте, а потом уж сюда, если что не так. И с файлом с данными. Мне не настолько нечего делать, чтоб рисовать за вас примеры.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

Controler

Дата: Понедельник, 14.03.2016, 10:47 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 14


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

Вот пример с данными, нужно только нажать кнопку внести в базу и посмотреть как данные запишутся в другой лист.

К сообщению приложен файл:

0258731.xls
(81.5 Kb)

 

Ответить

KuklP

Дата: Понедельник, 14.03.2016, 10:58 |
Сообщение № 6

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

И что не так? Попробовал — все внеслось, записалось, скопировалось и очистилось. Заголовки нетронуты. В Вашем макросе кстати будет затираться последняя строка в Отчет за 2016 г. Если это не планировалось специально, то лучше:
[vba]

Код

        .Range(«A2:j» & .Cells(.Rows.Count, 1).End(xlUp).Row).SpecialCells(2).Copy Sheets(«Отчет за 2016 г.»).Range(«A» & Rows.Count).End(xlUp)(2)

[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

У меня есть книга Excel с 4 листами.

  1. Мастер лист
  2. test_1
  3. test_2
  4. 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

Я думаю, что самый простой способ скопировать данные — это использовать массив, который заполнен динамически.

  1. Создать точный массив
  2. Заполните данные из мастер-листа
  3. Вставьте данные.

И в этом случае вам не нужно беспокоиться о новой строке, потому что вы используете динамический массив. Смотрите пример ниже.

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

Понравилась статья? Поделить с друзьями:
  • Excel макрос переменная в адресе ячейки
  • Excel макрос перевода числа в текст в excel
  • Excel макрос перевод в строку
  • Excel макрос перебор ячеек в столбце
  • Excel макрос перебор строк