Страницы: 1
RSS
Копирование определенных листов из одной книги в другую новую книгу VBA
 
Собственно, у меня есть книга, в которой заполняются отчеты по путевым листам. Большая часть страниц в этой книге, конечно же, технические и нужны исключительно для удобства заполняющего и работы формул. Конкретный отчет за рейс - это отчет водителя и расчёт его зарплаты и соответственно доходов фирмы с этого путевого листа. По результатам заполнения листа отчёт, формируется лист расчёт. И вот эти два листа мне жизненно необходимо сохранить в отдельной книге.
Я как бы сделал это, но, как мне кажется, способом аутиста. По крайней мере, мне такая реализация крайне не нравится. Код чуть поправлен от того, что есть на самом деле, но, думаю, смысл работы будет понятен. Собственно для этого я и поправил то, что завязано на данные из моих таблиц. Скажем так, код в этом файле общий. Не прошу прям конкретной реализации, а прошу натолкнуть на нормальное решение проблемы, так как понимаю, что листов в этой книге может стать значительно больше, а я здесь когда-нибудь работать не буду. И получится хрень в чистом виде. Буду благодарен за любую помощь :)
Скрытый текст
 
Код
Sub Save()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
Dim Papka_name1 As String, Name_file1 As String
Papka_name1 = ThisWorkbook.Path & "\" & "- Отчеты"
If Dir(Papka_name1, 16) = "" Then
MkDir Papka_name1
End If
Name_file1 = Papka_name1 & "\" & Sheets("Расчёт").Cells(2, 2).Value & " - Отчет - " & ".xlsx"
Sheets(Array("Расчёт", "Отчёты за рейс")).Copy
ActiveWorkbook.SaveAs Filename:=Name_file1, FileFormat:=51
ActiveWorkbook.Save
ActiveWorkbook.Close
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
End Sub
Изменено: Тимофеев - 04.05.2021 18:49:47
 
Тимофеев, спасибо большое за ответ! Способ, конечно, интересный, но возник один нюанс. Часть содержимого на странице выводится при помощи макроса. А в новой создаваемой книге этого макроса нет, поэтому часть значений безвозвратно пропадает. А при сохранении книги целиком, макросы в книге остаются. Существует ли какой-нибудь сохранить и макросы из этой книги?
 
Нужно выполнить макрос и следом вызвать этот в новой книге вам макросы не нужны
 
В общем, думал я думал и ничего толкового не придумал, но вот, что надумал.
Можно сохранить текущую книгу, потом перевести все ячейки книги в значения, потом скопировать две страницы. которые мне необходимы, и закрыть текущую книгу без сохранения. Мне это, конечно, в корне не нравится, но другого пути я не вижу, к сожалению. Может кто подскажет еще какие варианты? Потому что это снова костыли, только вид сбоку.
Изменено: Dzmitry Ihnatovich - 06.05.2021 18:41:29
 
Вы в своей книге выполняете макрос чтоб куда надо все скопировалось и затем вызываете этот и в него дописываете разрыв связи до сохранения нового файла
ActiveWorkbook.BreakLink Name:= "полный путь файла связь с которым надо разорвать.формат", Type:=xlExcelLinks
и все будет как значения
Изменено: Тимофеев - 06.05.2021 18:46:08
 
В том то и дело, что на этапе копирования двух листов при пошаговом выполнении, создается временная книга, в которой нет функции, считывающей курсы валют с сайта, поэтому на местах пропусков появляется #ИМЯ?. Решить это можно только способом изначального форматирования этих ячеек, я так понимаю. В общем, как вариант, создать копии листов в исходном документе, но со значениями, потом скопировать это Вашим макросом, а потом удалить эти листы. Думаю, это единственный более-менее адекватный способ. По крайней мере, добавление новых листов никак не повлияет на книгу с отчётом. Думаю, что так и сделаю, если не найду способ лучше.

Тимофеев, я несколько перепутал, что прям макросы. Там функция на VBA, которая считывает мне курсы валют с сайта нац.банка, и я не представляю, как это сделать, чтобы оно работало. По сути эта функция в огромном количестве формул в книге.
 
если курс на одну дату:
1. делаем лист с одной формулой получения курса, все формулы в книге ссылаются на эту ячейку.
2. Делаем копии нужных листов (программно)
3. в новой книге меняем формулу на значение из старой книги
4. Скрываем лист в новой книге (если надо)
5. сохраняем с нужным именем
Если курс на разные даты и разные валюты
1. Создаем табличку на отдельном листе (дата, валюта, курс)
2. Заполняем табличку (программно или ручками)
3. Переделываем формулы по поиску значение в табличке курсов (впр и т.д)
4. Делаем копии нужных листов, вместе с листом курсов.
5.Сохраняем под нужным именем.
--------------------
При таком подходе у Вас будут работать все формулы в этих листах.
Спасибо
 
Если Вы хотите сохранить макросы, то проще вернуться к макросу из #1. Можно ведь удалить все листы, кроме листов из определенного списка. После этого неплохо бы пройтись по именам книги и удалить те, которые имеют недействительные ссылки.
Владимир
 
В общем, всем, кто принял участие в обсуждении, огромное спасибо!
Обдумал я все поступившие предложения и решил сделать с минимумом затрат и максимумом элегантности  :)
Все формулы с запуском макроса на стягивание курса валют с сайта переехали на технический лист, как предложил R Dmitry, нужные листы в итоговый отчёт копируются по способу, который предложил Тимофеев, также он натолкнул на важность разрыва связей и удаление мерзкого уведомления при открытии книги, но его вариант работал как-то не полностью, поэтому пришлось использовать другой способ найденный в интернете.
Если кому интересно

Ну, и вот готовый код того, что получилось. Решил оставить его на всякий случай, потому что сам не один раз находил темы трехлетней давности в поисковике с решениями моих проблем. Может кому-нибудь пригодится когда-нибудь.
Копирование определенных листов
Страницы: 1
Наверх