Мне потребовалось написать макрос, но с ними я совсем не дружу, поэтому надеюсь на Вашу помощь. Нужно скопировать данные с разных листов на итоговый лист одной и той же книги Excel. Количество столбцов всегда одинаковое, а вот количество строк и листов - разное. При этом желательно, чтобы первую страницу он копировал с заголовком, а остальные - без. Файл прилагаю.
P.S. Пункт 5q в правилах форума я не нашла, поэтому заранее извиняюсь, если опять сделала что-то не так.
Добрый день!
Мне потребовалось написать макрос, но с ними я совсем не дружу, поэтому надеюсь на Вашу помощь. Нужно скопировать данные с разных листов на итоговый лист одной и той же книги Excel. Количество столбцов всегда одинаковое, а вот количество строк и листов - разное. При этом желательно, чтобы первую страницу он копировал с заголовком, а остальные - без. Файл прилагаю.
P.S. Пункт 5q в правилах форума я не нашла, поэтому заранее извиняюсь, если опять сделала что-то не так.Nat
Sub CopyData() Dim sh As Worksheet, r As Range, i& Application.ScreenUpdating = False
Set sh = Worksheets.Add(before:=Worksheets(1)) Set r = Worksheets(2).Columns(1).Find(1, , xlValues, xlWhole) If Not r Is Nothing Then r.Offset(-2).EntireRow.Resize(3).Copy sh.Cells(1) For i = 2 To Worksheets.Count With Worksheets(i) Set r = .Columns(1).Find(1, , xlValues, xlWhole) If Not r Is Nothing Then .Range(r.Offset(1), .Range("AJ" & .Rows.Count).End(xlUp)).Copy _ Worksheets(1).Range("B" & .Rows.Count).End(xlUp)(2).Offset(, -1) End If End With Next End If Application.ScreenUpdating = True End Sub
[/vba] Сперва искал по "Дата отправки КС" - но что-то на последнем листе не искалось (на том, который как пример собранного). Так и не понял, почему - переделал на поиск единицы
[vba]
Код
Option Explicit
Sub CopyData() Dim sh As Worksheet, r As Range, i& Application.ScreenUpdating = False
Set sh = Worksheets.Add(before:=Worksheets(1)) Set r = Worksheets(2).Columns(1).Find(1, , xlValues, xlWhole) If Not r Is Nothing Then r.Offset(-2).EntireRow.Resize(3).Copy sh.Cells(1) For i = 2 To Worksheets.Count With Worksheets(i) Set r = .Columns(1).Find(1, , xlValues, xlWhole) If Not r Is Nothing Then .Range(r.Offset(1), .Range("AJ" & .Rows.Count).End(xlUp)).Copy _ Worksheets(1).Range("B" & .Rows.Count).End(xlUp)(2).Offset(, -1) End If End With Next End If Application.ScreenUpdating = True End Sub
[/vba] Сперва искал по "Дата отправки КС" - но что-то на последнем листе не искалось (на том, который как пример собранного). Так и не понял, почему - переделал на поиск единицы Hugo
Sub Start() Call CreateSheet Call Copy End Sub Private Sub CreateSheet() On Error Resume Next Set wsSheet = Sheets("Итог") If Err.Number = 0 Then Application.DisplayAlerts = False Sheets("Итог").Delete Application.DisplayAlerts = True End If Sheets.Add After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "Итог" End Sub Private Sub Copy() Dim sRng As Range Dim dRng As Range Application.ScreenUpdating = False ThisWorkbook.Sheets(1).Activate Set sRng = Range("A9:AJ11") ThisWorkbook.Sheets(Sheets.Count).Activate Set dRng = Range("A1") sRng.Copy dRng For i = 1 To ThisWorkbook.Sheets.Count - 1 ThisWorkbook.Sheets(i).Activate Set sRng = Range(Cells(12, 1), Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count)) ThisWorkbook.Sheets(Sheets.Count).Activate Set dRng = Cells(ActiveSheet.UsedRange.Rows.Count + 1, 1) sRng.Copy dRng Next i Application.ScreenUpdating = True End Sub
[/vba]
Опередили [vba]
Код
Sub Start() Call CreateSheet Call Copy End Sub Private Sub CreateSheet() On Error Resume Next Set wsSheet = Sheets("Итог") If Err.Number = 0 Then Application.DisplayAlerts = False Sheets("Итог").Delete Application.DisplayAlerts = True End If Sheets.Add After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = "Итог" End Sub Private Sub Copy() Dim sRng As Range Dim dRng As Range Application.ScreenUpdating = False ThisWorkbook.Sheets(1).Activate Set sRng = Range("A9:AJ11") ThisWorkbook.Sheets(Sheets.Count).Activate Set dRng = Range("A1") sRng.Copy dRng For i = 1 To ThisWorkbook.Sheets.Count - 1 ThisWorkbook.Sheets(i).Activate Set sRng = Range(Cells(12, 1), Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count)) ThisWorkbook.Sheets(Sheets.Count).Activate Set dRng = Cells(ActiveSheet.UsedRange.Rows.Count + 1, 1) sRng.Copy dRng Next i Application.ScreenUpdating = True End Sub
Благодарю за помощь! Первый вариант рабочий. Во втором макрос копировал в исходную книгу (удалила "ThisWorkbook" в тексте - стал копировать в новый документ, хотя не уверена что именно это н.б. сделать) и только первые два листа (как это исправить - не знаю, да это уже и не так важно)...Полезная это вещь - макросы! Надо будет освоить хотя бы азы. Еще раз спасибо за помощь!
Благодарю за помощь! Первый вариант рабочий. Во втором макрос копировал в исходную книгу (удалила "ThisWorkbook" в тексте - стал копировать в новый документ, хотя не уверена что именно это н.б. сделать) и только первые два листа (как это исправить - не знаю, да это уже и не так важно)...Полезная это вещь - макросы! Надо будет освоить хотя бы азы. Еще раз спасибо за помощь! Nat
Nat, ThisWorkbook - это книга с которой вы запускаете макрос. По всей видимости вы вставили макрос не в ту книгу. [vba]
Код
For i = 1 To ThisWorkbook.Sheets.Count - 1
[/vba] с первого листа по предпоследний. Копирует только с двух наверно по той самой причине: не в ту книгу вставили макрос. Скачайте qwerty_.xlsm, добавьте туда листов и запустите макрос и вы увидите что макрос обработает все листы. В варианте Hugo в итоговом листе при повторных запусках строки будут дублироваться.
Nat, ThisWorkbook - это книга с которой вы запускаете макрос. По всей видимости вы вставили макрос не в ту книгу. [vba]
Код
For i = 1 To ThisWorkbook.Sheets.Count - 1
[/vba] с первого листа по предпоследний. Копирует только с двух наверно по той самой причине: не в ту книгу вставили макрос. Скачайте qwerty_.xlsm, добавьте туда листов и запустите макрос и вы увидите что макрос обработает все листы. В варианте Hugo в итоговом листе при повторных запусках строки будут дублироваться.SergeyKorotun
Не запускайте повторно - не будет дублироваться Если есть такая мания - нужно всего лишь добавить в код удаление первого листа. Если он тот, который лишний. Ну в общем этот вопрос не вопрос. Зато у меня таблицы могут скакать по листу, и не скопируется лишнее, как в случае [vba]
[/vba]Тут может и недокопироваться, и лишнее скопироваться - зависит от файла. Но если файлы всегда будут именно такие и никто туда руки не сунет - тогда ладно
Не запускайте повторно - не будет дублироваться Если есть такая мания - нужно всего лишь добавить в код удаление первого листа. Если он тот, который лишний. Ну в общем этот вопрос не вопрос. Зато у меня таблицы могут скакать по листу, и не скопируется лишнее, как в случае [vba]
[/vba]Тут может и недокопироваться, и лишнее скопироваться - зависит от файла. Но если файлы всегда будут именно такие и никто туда руки не сунет - тогда ладно Hugo
Hugo, привет, всем Гуру экселя. Не могу разобраться с макросом, совсем вот уже 3 день. Нужно собрать данные со всех листов в один, листов больше 100 штук, постоянно дополняется. Кол-во столбцов одинаковое, строк-разное. может кто сможет помочь?
Hugo, привет, всем Гуру экселя. Не могу разобраться с макросом, совсем вот уже 3 день. Нужно собрать данные со всех листов в один, листов больше 100 штук, постоянно дополняется. Кол-во столбцов одинаковое, строк-разное. может кто сможет помочь?exelskatyazhelyi