Страницы: 1
RSS
Копирование определенных листов из одной книги в другую, Копирование листов Excel
 
Здравствуйте, товарищи!
Прошу помочь, подсказать решение 1 маленькой проблемы, которую я не смог пока забороть:
Есть книга Excel, в которой куча листов. Есть лист "Общий отчет" и имена листов, перечисленные на листе "Общий отчет".
Надо перечисленные листы скопировать в другую книгу и сохранить.
Я сформировал массив arsheets(), который правильно выводится в ячейки (тестовая проверка сформированного массива) - попадает сюда только то, что нужно, но, при попытке скопировать этот массив листов в другой файл, ничего не происходит или копируются все листы.
Выводить пытался разными методами. Вот один из последних (взято с сайта MS):
Код
for x=1 to Period
           Workbooks(BkName).Sheets(arsheets(x)).Copy _
            Before:=Workbooks(iPath & "Отчет.xls").Sheets(arsheets(x))
next

Если использовал такую конструкцию
    List = "Общий отчет"
    Sheets(List).Copy
    Sheets(List).UsedRange.Value = Sheets(List).UsedRange.Value
    Sheets(List).Buttons.Delete 'Удаление кнопок

то файл с 1 листом "Общий отчет" формировался и кнопки удалялись...

Не могу сообразить, что я делаю не так...
 
Где файлы?
 
А файлы зачем? Суть вопроса конкретно указана:
Цитата
Я сформировал массив arsheets(), который правильно выводится в ячейки (тестовая проверка сформированного массива) - попадает сюда только то, что нужно, но, при попытке скопировать этот массив листов в другой файл, ничего не происходит или копируются все листы.
Сами файлы приложить не могу, поскольку они содержат персональные данный и информацию, составляющую коммерческую тайну.
Мне важно понять, почему не формируется книга с указанным списком листов.
Изменено: photon - 16.10.2017 08:48:06
 
И какой ответ Вы бы хотели получить по непонятным обрывкам непонятно какого кода, неизвестно где и как расположенных именах листов и прочей НЕконкретики? Откуда нам знать что Вы там наваяли (реально, а не то что пытаетесь тут объяснить)
Цитата
photon написал:
Сами файлы приложить не могу, поскольку они содержат персональные данный и информацию, составляющую коммерческую тайну.
Вы бы с Правилами форума ознакомились (п.2.3 в частности). Не нужны здесь Ваши страшные тайны - нужен файл-ПРИМЕР
Согласие есть продукт при полном непротивлении сторон
 
Вы видите и не можете понять. И хотите что-бы тут гадали , что вы не можете понять. От вас не требуются оригиналы, сделайте небольшой файл-пример. Данные можно внести любые. Покажите как есть и как нужно. Иначе придется гадать в одиночестве.
"Все гениальное просто, а все простое гениально!!!"
 
Хорошо. Вот один из последних тестовых вариантов. В итоговый отчет должны попасть листы, перечисленные в строке 4 листа "Общий отчет", включая сам лист "Общий отчет". Количество этих листов определяется значением из ячейки "Общий отчет!B3".
 
Цитата
photon написал: Количество этих листов определяется значением из ячейки "Общий отчет!B3"
Т.е. нужно сделать по ДВЕ копии (в данном случае) листов, с именами 2017.09 и 2017.08? Т.е. в новой книге должно быть 5 листов?
Согласие есть продукт при полном непротивлении сторон
 
Нет, нужен файл, в котором будут только "Общий отчет" и листы, перечисленные в строке 4 листа "Общий отчет", т.е. в примере - только 3 листа. Больше там ничего быть не должно, в том числе и кнопок - это результирующий отчет для руководства.
Изменено: photon - 28.08.2018 19:46:39
 
Попробуйте
Код
Sub CopyArrSheets()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
ReDim arrSh(1)
arrSh(0) = "Общий отчет"
N = 1
For I = 4 To Cells(4, Columns.Count).End(xlToLeft).Column
    If Cells(4, I) <> Empty Then
        ReDim Preserve arrSh(N)
        arrSh(N) = Cells(4, I).Text
        N = N + 1
    End If
Next
Worksheets(arrSh).Copy
With ActiveWorkbook
    With Worksheets("Общий отчет")
        .UsedRange.Value = .UsedRange.Value
        .DrawingObjects.Delete
    End With
    .SaveAs Filename:=ThisWorkbook.Path & "\" & "Отчет.xls", FileFormat:=xlExcel8
    .Close True
End With
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Согласие есть продукт при полном непротивлении сторон
 
Супер! Спасибо! То, что надо!
 
Код
Sub test()
Dim coll As New Collection, ikey
Dim arr(), ipath$
Dim book As Workbook, ibook As Workbook
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set book = ThisWorkbook
ipath = book.Path & "\"
With Sheets("Общий отчет")
    arr = .Range(.[d4], .[d4].End(xlToRight)).Value
End With
For Each ikey In arr
    If Not IsEmpty(ikey) Then coll.Add ikey, CStr(ikey)
Next ikey
With book
    .Sheets("Общий отчет").Copy
    Set ibook = ActiveWorkbook
    ibook.SaveAs Filename:=ipath & "Test.xlsx"
    For Each ikey In coll
        .Sheets(ikey).Copy after:=ibook.Sheets(ibook.Sheets.Count)
    Next ikey
    For Each ikey In ibook.Sheets(1).Shapes
        ikey.Delete
    Next ikey
    ibook.Close True
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Изменено: Nordheim - 16.10.2017 10:03:31
"Все гениальное просто, а все простое гениально!!!"
 
Всем большое спасибо за помощь!
Задача решена.
 
Добрый день. помогите переделать макрос который представлен выше, пытался сам но кроме ошибок больше ни чего не получается. Нужно чтобы из любой книги с разными названиями производилось копирование 4-х последних листов, в данном примере это листы U - Б,  V- Б,  X- Б, H . Названия листов может меняться, но всего листов 7 во всех книгах и нужно скопировать последние 4 как значения что бы они не обновлялись по ссылкам . Заранее благодарен
 
может быть всё таки кто нибудь окажет жест доброй воли
 
Тут нужно не переделать макрос а написать его заново.У вас совершенно иная задача. Это раз. Во вторых. куда нужно собирать эти листы?
В третьих вот тут смотрели, немного подкорректировать и вуаля.
"Все гениальное просто, а все простое гениально!!!"
 
В примерах нужно добавить условие, что копировать 3 последних листа, что то типа :=
Код
For i=importWB.WorkSheets.count to importWB.WorkSheets.count-2 step-1
      'код копирования листа.
next i
"Все гениальное просто, а все простое гениально!!!"
 
Копировать нужно в новую книгу , заранее извиняюсь если что ни так , помогите если возможно
 
Дык я же вам написал, заходите в приемы по ссылке и вставляете цикл по листам.
"Все гениальное просто, а все простое гениально!!!"
 
мне бы по проще, я сегодня пол дня этот макрос мучил , а там ещё веселее  
 
Цитата
cem33 написал:
Нужно чтобы из любой книги с разными названиями
Ну вот как это понимать - из ЛЮБОЙ книги? Ведь Вас наверняка интересуют конкретные - разве не так?
 
Цитата
cem33 написал:
мне бы по проще,
так там вроде не сложно. Просто нужно немного мат часть почитать, а так с наскока любой код будет казаться китайскими иероглифами.
"Все гениальное просто, а все простое гениально!!!"
 
спасибо скоро стану программистом  буду изучать мат часть
 
Цитата
Юрий М написал:... как это понимать - из ЛЮБОЙ книги?
книг много с разными названиями и указывать их в макросе не целесообразно по этому и написал из любой книги. пробовал писать макрорекордером  но получается громоздко, поэтому обратился к вам
Изменено: cem33 - 28.08.2018 23:23:11
 
Попробую иначе: в папке среди "любых" книг попадается такая, в которой всего три листа. И что тогда? Как макрос должен понять, какие книги обрабатывать, а какие нет?
 
Кнопка цитирования не для ответа [МОДЕРАТОР]

Юрий М, нет таких книг где есть 3 листа , во всех книгах 7 листов . может быть придём к консенсусу
 
cem33, почитайте эту статью - там доходчиво написано, как перебрать все файлы в папке.
 
А еще почитайте пункт правил форума о цитировании.
 
Большое всем спасибо учту на будущее как стану программистом
 
cem33, пробуйте
Код
Sub Макрос3()
Dim i&, k&, ar(1 To 4)
  For i = Worksheets.Count - 3 To Worksheets.Count
    k = k + 1
    ar(k) = i
  Next
  Worksheets(ar).Copy
  ActiveWorkbook.BreakLink Name:=ThisWorkbook.FullName, Type:=xlExcelLinks
End Sub
 
Цитата
cem33 написал:
как стану программистом
Для вашей задачи не нужно быть программистом. Я даже с программистами рядом не стоял, но если почитать и немного напрячь мозг, то
немного подправив код из приемов, можно решить вашу задачу. Ведь основа кода уже написана. Нужно только прописать условие ваших 3-х последних листов.
"Все гениальное просто, а все простое гениально!!!"
Страницы: 1
Читают тему
Наверх