Страницы: 1
RSS
Перемещение данных с нескольких листов в другую книгу
 
Всем привет, помогите допилить макрос, не могу разобраться
Код
Sub Обновить_сводную()
Dim Sht As Worksheet
Dim Wb As Workbook
Dim i As Long
Dim iLastRow_B As Long
Dim iLastRow_Ai As Long

With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
    .Calculation = xlCalculationManual
    
Set Wb = ThisWorkbook
Sheets("Сводная").Cells.Clear 'очищаем лист "Сводная"
Sheets("Сводная").Range("A1") = "Оценка"
Sheets("Сводная").Range("B1") = "ФИО сотрудника"
Sheets("Сводная").Range("C1") = "Старший"
Sheets("Сводная").Range("D1") = "Группа"
Sheets("Сводная").Range("E1") = "Дата оценки"
Sheets("Сводная").Range("F1") = "Номер звонка"
Sheets("Сводная").Range("G1") = "Пометка на звонок"
Sheets("Сводная").Range("H1") = "Проф. Навыки"
Sheets("Сводная").Range("I1") = "Навыки ведения диалога"
Sheets("Сводная").Range("J1") = "Общая оценка за звонок"
Sheets("Сводная").Range("K1") = "Тематика (1 уровень)"
Sheets("Сводная").Range("L1") = "Тематика (2 уровень)"
Sheets("Сводная").Range("M1") = "Тематика (3 уровень)"
Sheets("Сводная").Range("N1") = "Основная зона роста (1-ый уровень)"
Sheets("Сводная").Range("O1") = "Основная зона роста (2-ый уровень)"
Sheets("Сводная").Range("P1") = "Доп. зона роста (1-ый уровень)"
Sheets("Сводная").Range("Q1") = "Доп. зона роста (2-ый уровень)"
Sheets("Сводная").Range("R1") = "Вес нарушения Основной зоны"
Sheets("Сводная").Range("S1") = "Вес нарушения доп. Зоны"
Sheets("Сводная").Range("T1") = "ст"
Sheets("Сводная").Range("U1") = "Неделя"
Sheets("Сводная").Range("V1") = "Месяц"
Sheets("Сводная").Range("W1") = "Год"
Sheets("Сводная").Range("X1") = "Ошибка"
Sheets("Сводная").Range("Y1") = "Отдел"
Sheets("Сводная").Range("Z1") = "Кодировка"
i = 1
Set Sht = Wb.Sheets(i)
For Each Sht In Worksheets
    If Sht.Name <> "Сводная" And Sht.Name <> "Сводник" Then
      iLastRow_B = Cells(Rows.Count, 2).End(xlUp).Row
      iLastRow_Ai = Wb.Sheets(i).Cells(Rows.Count, 1).End(xlUp).Row
      Wb.Sheets(i).Range("A2:Z" & iLastRow_Ai).Copy Cells(iLastRow_B + 1, 1)
    End If
    i = i + 1
    Next
        
    .ScreenUpdating = True
    .DisplayAlerts = True
    .Calculation = xlCalculationAutomatic
End With
End Sub
Макрос собирает данные с нескольких листов в книге и вставляет их на другой лист, в частности в макросе: собирает данные со всех листов в книге кроме листов Сводная и Сводник. Но как сделать так, чтобы я мог запустить этот макрос из книги, скажем под названием: Книга1, а он собрал данные с нескольких листов из Книги2, открыл её, собрал данные, закрыл, и все эти данные вставил на страницу: Сводная в Книге1. Т.е. проще говоря, исходные листы находятся в одной книге (Книга2), а сводник, куда собираются все данные находится в другой книге (Книга1).

На просторах интернета нашел такой макрос:
Код
Sub Копируем_листы_в_другую_книгу()
Dim bookconst As Workbook
Dim abook As Workbook
Set abook = ActiveWorkbook 'присваиваем перменную активной книге
Set bookconst = Workbooks.Open("C:\Users\User\Desktop\1.xlsx") 'присваиваем перменную книге куда необходимо копировать данные
 
'переходим в активную книгу откуда необходимо скопировать данные
abook.Worksheets("Лист1").Activate
Range("A1:I23").Copy 'копируем определенный диапазон листа, укажите свой диапазон
bookconst.Worksheets("Лист1").Activate 'активируем лист куда необходимо вставить данные
Range("A1:I23").Select 'встаем на ячейку А1
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'второй лист
abook.Worksheets("Лист2").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист2").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'третий лист
abook.Worksheets("Лист3").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист3").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'сохранить текущую книгу
bookconst.Save
'Закрыть книгу
bookconst.Close
abook.Activate
End Sub
Он копирует диапазоны данных из активной открытой книги Excel нескольких листов (в нашем примере 3-х листов) в другую книгу, которая хранится в определенном месте. Данные будут вставлены как значения, плюс будут перенесены форматы ячеек.
Не знаю как их так соединить.

Может кто знает как реализовать?
 
А зачем Вы создали тему-дубликат?
 
Юрий М, Тему дубликат? Ранее же другой вопрос был, до этого я уточнял про сбор данных с определенных листов, при этом в той же книге и про возможность сбора только уникальных значений. Сейчас я уточню про то, как перенести данные с нескольких листов в другую книгу, но, да, пытаюсь допилить тот же макрос, я был уверен, что это несколько другая тема. Или я что то не так понял?
 
Код показываете практически одинаковый. А если Вы умеете собрать на один лист, то затем сохранить этот лист в новую книгу проблем не должно у Вас вызвать.
 
В том то и дело, что не получается, да, код действительно почти тот же самый, я его пытаюсь доделать, он данные с нескольких листов собирает, но может сделать это, только внутри одной книги, он собирает с Лист1, Лист2 и Лист3, на лист Сводная в этой же книге, а мне нужно сделать это таким образом, что у меня была открыта Книга1, на ней есть лист Сводная и в ней выполнялся макрос, который бы собрал данные с Лист1, Лист2 и Лист3, но не из этой же книги, а из Книга2. Это реализовать у меня хоть убей не получается.
 
Вы логику можете понять? Что вы перебираете некие объекты (листы) и пишете тоже в некий объект (лист).

Я вам, кстати, в той теме, переписывал ваш макрос, и если бы вы разобрались, что именно там переписано - то не задавали бы текущий вопрос. Макрос, который умеет собирать данные, перебирая список (указанный вами же) листов какой-то книги. При этом он пишет результат на некий отдельный лист. Кто сказал, что результирующий лист должен находиться в той же книге, что и листы-источники? В моем примере ссылка на лист-результат поэтому и хранится в отдельной переменной.

Если Вы правильно назначите книгу-источник, листы-источники, книгу-лист-результат - то макрос безо всяких переделок соберет данные откуда угодно и куда угодно.
Изменено: AndreTM - 27.08.2017 01:15:16
 
AndreTM, да соглашусь, просто я в макросах пока чайник вот и задаю иногда глупые вопросы, разобрался как прописать, чтобы сбор данных с другой книги было, если вдруг у кого то подобный вопрос будет, то вот какой код я использовал:
Код
Sub Обновить_сводную()
 
Dim Sht As Worksheet, Shs As Worksheet
Dim Wb As Workbook
Dim Wbbu As Workbook
Dim i As Long
Dim iLastRow_B As Long
Dim iLastRow_Ai As Long
Set Wb = ActiveWorkbook
Set Wbbu = GetObject("C:\Users\Андрей\Downloads\Макрос сбора.xlsm")
  
With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
    .Calculation = xlCalculationManual
      
    Set Wb = ThisWorkbook
    Set Shs = Wb.Sheets("Сводная")
    Shs.Cells.Clear 'очищаем лист "Сводная"
    Shs.Range("A1:Z1") = Array("Оценка", "ФИО сотрудника", "Старший", "Группа", "Дата оценки", _
        "Номер звонка", "Пометка на звонок", "Проф. Навыки", "Навыки ведения диалога", "Общая оценка за звонок", _
        "Тематика (1 уровень)", "Тематика (2 уровень)", "Тематика (3 уровень)", "Основная зона роста (1-ый уровень)", _
        "Основная зона роста (2-ый уровень)", "Доп. зона роста (1-ый уровень)", "Доп. зона роста (2-ый уровень)", _
        "Вес нарушения Основной зоны", "Вес нарушения доп. Зоны", "ст", "Неделя", "Месяц", "Год", _
        "Ошибка", "Отдел", "Кодировка")
     
    For Each nm In Array("Привет", "Пока")
        Set Sht = Wbbu.Sheets(nm)
        iLastRow_B = Shs.Cells(Rows.Count, 2).End(xlUp).Row
        iLastRow_Ai = Sht.Cells(Rows.Count, 1).End(xlUp).Row
        Sht.Range("A2:Z" & iLastRow_Ai).Copy Shs.Cells(iLastRow_B + 1, 1)
    Next
          
    .ScreenUpdating = True
    .DisplayAlerts = True
    .Calculation = xlCalculationAutomatic
 
End With
 Wbbu.Close
End Sub

Вам огромное спасибо.
Страницы: 1
Наверх