mail mail

Макрос сохранения листа Excel в файл

Данный макрос позволяет упростить процедуру сохранения активного листа в книге Excel в отдельный файл.

Для использования этого макроса на любом листе в книге Excel создайте кнопку, и назначьте ей макрос СохранитьЛистВФайл.

При запуске макроса (нажатии кнопки) будет выведено диалоговое окно выбора имени для сохраняемого файла, после чего текущий лист будет сохранён под заданным именем в выбранной папке.

Сохранение производится в формате XLS (формат Excel 2003)
Если пользователь отказался от ввода имени файла (нажал клавишу ESC или кнопку «Отмена» в диалоговом окне),
то сохранения листа в файл не происходит.

Sub СохранитьЛистВФайл()
    On Error Resume Next
    ' название подпапки, в которую по-умолчанию будет предложено сохранить файл
   Const REPORTS_FOLDER = "Отчёты\"
    ' создаём папку для файла, если её ещё нет
   MkDir ThisWorkbook.Path & "\" & REPORTS_FOLDER
    ' выбираем стартовую папку
   ChDrive Left(ThisWorkbook.Path, 1): ChDir ThisWorkbook.Path & "\" & REPORTS_FOLDER

    ' вывод диалогового окна для запроса имени сохраняемого файла
   Filename = Application.GetSaveAsFilename("отчёт.xls", "Отчёты Excel (*.xls*),", , _
                                             "Введите имя файла для сохраняемого отчёта", "Сохранить")
    ' если пользователь отказался от выбора имени файла - отменяем сохранение листа в файл
   If VarType(Filename) = vbBoolean Then Exit Sub

    ' копируем активный лист (при этом создаётся новая книга)
   Err.Clear: ActiveSheet.Copy: DoEvents
    If Err Then Exit Sub    ' произошла какая-то ошибка при попытке копирования листа

    ' убеждаемся, что активной книгой является копия листа
   If ActiveWorkbook.Worksheets.Count = 1 And ActiveWorkbook.Path = "" Then
        ' сохраняем файл под заданным именем в формате Excel 2003
       ActiveWorkbook.SaveAs Filename, xlWorkbookNormal
       
        ' закрываем сохранённый файл
       ' (удалите следующую строку, если закрывать созданный файл не требуется)
       ActiveWorkbook.Close False
    End If
End Sub

 

PS: Кто-то может сказать, что для сохранения листа в файл в объектной модели Excel есть метод SaveAs, применимый к объекту Worksheet.

Но, как ни странно, выполнение кода ActiveSheet.SaveAs "<имя файла>" приводит к сохранению книги целиком, что равносильно использованию кода ActiveWorkbook.SaveAs "<имя файла>"

Почему этот метод сохранения работает так нелогично - лично мне не понятно (видимо, Microsoft что-то там перемудрил)

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Заменить ActiveSheet.Copy на Worksheets("ИмяЛиста").Copy или Worksheets(НомерЛиста).Copy

Здравствуйте! Подскажите, пожалуйста, что нужно изменить в вашем макросе, чтобы сохранить не активный лист?

Спасибо. Попробую. Хотя там используется ф-ция ".SaveCopyAs ", использоание которой ранее не привело к ожидаемому результату.

Может, вам подойдёт макрос создания копии файла?
http://excelvba.ru/code/CreateBackup

Уберите строку, запрашивающую имя файла, и вместо нее задайте нужное имя файла в коде.
И всё будет работать без лишних диалоговых окон.

Столкнулся с аналогичной задачей. Но основная сложность в сохранение копии файл. Как правильно отметили метод сохранить как не работает. Проблема в том, что всё автоматизировано (человек указывает папку с файлами исходниками, выходную папку, задает параметры), но для сохранения копии ему необходимо регулярно подтверждать сохранение. Можно ли доработать макрос, что бы при сохранении файла он не выдавал окна (остальные параметры можно расчитать)?
Спасибо

Спасибо вам огромное! Всё работает как нужно! Очень помогли! Сам пробовал писать не получалось!=)

Прочитайте, как сохранить файл Excel в другом формате
(как раз то, что вам нужно)

А можно сделать так что бы не указывать путь. так как он всегда разный, что не удобно. то есть так что бы открыл из любого места файл книги, нажал выполнить макрос, и он бы сохранился в другом формате (двоичная книга) в той же папке с заменой старого! объединение листов в один файл не нужно, просто сохранение в другом формате с такой же структурой книги. Ну очень нужно... Спасибо!))

Для сохранения книги в другом формате, достаточно внести изменения в эти 2 строки кода:

' изменяем расширение в 2 местах
Filename = Application.GetSaveAsFilename("отчёт.xlsb", "Отчёты Excel (*.xlsb),", , _
                                             "Введите имя файла для сохраняемого отчёта", "Сохранить")

' меняем xlWorkbookNormal (XLS) на xlExcel12 (XLSB)
ActiveWorkbook.SaveAs Filename, xlExcel12

Это если вам нужен макрос сохранения листа в файл.

Если же надо сохранить всю книгу - так запишите макрос при помощи макрорекордера.
Получится макрос из одной строки:

activeworkbook.saveas "<полный путь к создаваемому файлу>", xlExcel12

Здравствуйте, подскажите пожалуйста макрос который бы сохранял книгу в другом формате, для уменьшения её объема, а именно в формат Двоичная книга Exel. в книге несколько листов.

Замените начало функции на это:

Sub СохранитьЛистВФайл()
    On Error Resume Next
    ' путь к папке, в которую по-умолчанию будет предложено сохранить файл
   Folder$ = "D:\Distr\Моя папка\": MkDir Folder$
    ChDrive Left(Folder$, 1): ChDir Folder$ ' выбираем стартовую папку

    ' вывод диалогового окна для запроса имени сохраняемого файла
   ...

Огромное спасибо за скрипт! Сам бы не смог такое сделать!

Только я не понял, а как сделать что бы он сохранял в определенную папку.
А то у меня сохраняет в
C:\Users\bogdanov\AppData\Roaming\Microsoft\Excel\XLSTART\April

"April" - я создал папку и описал в макросе

Все сумел сам :)

Этот макрос сохранит текущий лист в файл, взяв имя файла из ячейки:

Sub СохранитьЛистВФайл()
    On Error Resume Next
    ' название подпапки, в которую будет сохранён файл
   Const REPORTS_FOLDER = "Отчёты\"
    MkDir ThisWorkbook.Path & "\" & REPORTS_FOLDER    ' создаём папку для файла, если её ещё нет

    ' формируем имя файла из текста ячеек
   Filename = [c2] & [e2] & ".xlsx"

    ' копируем активный лист (при этом создаётся новая книга)
   Err.Clear: ActiveSheet.Copy: DoEvents
    If Err Then Exit Sub    ' произошла какая-то ошибка при попытке копирования листа

    ' убеждаемся, что активной книгой является копия листа
   If ActiveWorkbook.Worksheets.Count = 1 And ActiveWorkbook.Path = "" Then
        ' сохраняем файл под заданным именем в формате XLSX (xlOpenXMLWorkbook - Excel 2007)
       ActiveWorkbook.SaveAs Filename, xlOpenXMLWorkbook
        ' закрываем сохранённый файл
       ActiveWorkbook.Close False
    End If
End Sub

Здравствуйте, подскажите как изменить этот макрос для того чтобы он сохранял в формате excel 2007, а имя файла брал из ячейки C2 и E2. Заранее спасибо!

А если все листы сохранять, то для каждого листа запрашивать имя файла?

PS: На форумах по Excel есть множество готовых макросов, сохраняющий все листы книги в отдельные файлы.
Не вижу смысла писать заново макрос, который написан уже тысячу раз.

Добрый день. А если надо все листы в книге? Спасибо

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
5 + 11 =
Решите эту простую математическую задачу и введите результат. Например, для 1+3, введите 4.