Макрос для сохранения книги excel с именем из ячейки

Обновлено: 04.07.2024

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

Я пытаюсь следующее ActiveWorkbook.SaveAs ("filePathFormFlow To MSExcel" & Left(Now(), 10)) но получив Run-time error '1004': Method 'SaveAs' of object'_Workbook' failed.

может кто-нибудь помочь мне с этим? Я все еще очень новичок в разработке для Excel.

скорее всего, путь, к которому вы пытаетесь получить доступ, не существует. Кажется, вы пытаетесь сохранить в относительном месте, и у вас нет расширения файла в этой строке. Если вам нужно использовать относительные пути, вы можете проанализировать путь из ActiveWorkbook.FullName

изменить: Лучшим синтаксисом также будет

самый простой способ использовать эту функцию-начать с "записи макроса". Как только вы начнете запись, сохраните файл в нужном месте с нужным именем, а затем, конечно, установите тип файла, скорее всего, "Excel Macro Enabled Workbook"

остановить запись, и вы можете начать проверку кода.

Я написал код ниже, который позволяет сохранить книгу, используя путь, где файл был первоначально расположен, назвав его как " событие [дата в ячейке "А1"]"

скопируйте код в новый модуль, а затем напишите дату в ячейке" A1", например 01-01-2016 -> назначьте sub кнопке и запустите. [Примечание] вам нужно сделать файл сохранения, прежде чем этот скрипт будет работать, потому что новая книга сохраняется в папку автосохранения по умолчанию!

возможно, ваш формат по умолчанию не соответствует расширению файла. Вы должны указать формат файла вместе с именем файла, убедившись, что формат соответствует расширению:

OTOH, я не вижу расширения на вашем .Сохранить как имя файла. Возможно, вам нужно предоставить его при выполнении этого программно. Это имеет смысл-не нужно предоставлять расширение из интерфейса GUI удобно, но мы, программисты, должны писать однозначный код. Я предлагаю добавление расширения и соответствующего формата. См.эта страница msdn для списка форматов файлов. Честно говоря, я не узнаю много о descripions.

xlExcel8 = 56-это .формат xls

xlExcel12 = 50-это .файл xlsb формате

xlOpenXMLWorkbook = 51 является .формат xlsx

xlOpenXMLWorkbookMacroEnabled = 52 является .формата xlsm

xlWorkbookDefault является и указан со значением 51, что озадачивает меня, так как я думал, что формат по умолчанию может быть изменен.

Я знаю, что это старый пост, но я искал что-то подобное. Я думаю, ваша проблема заключалась в том, что при использовании Now () выход будет "6/20/2014". Это проблема для имени файла, поскольку в нем есть"/". Как вы знаете, нельзя использовать определенные символы в имени файла.

Привет, сейчас мы рассмотрим ситуацию, когда у Вас возникла необходимость в Excel сохранять файл с определенным названием, которое необходимо сформировать из значения ячейки или даже нескольких. В этой заметке я приведу простой пример реализации данной задачи.

Исходные данные

Сначала давайте разберем исходные данные, которые я буду использовать в примерах. Пусть это будет некая абстракция марок автомобилей с указанием их VIN номера.

Примечание! Я использую Excel 2013.

Скриншот 2

В зависимости от конкретных требований и условий, задачу можно реализовать по-разному, хотя принцип будет один и тот же, в этой статье мы рассмотрим несколько вариаций реализации.

Начнем мы с самой простой ситуации, когда заранее известна ячейка, на основе которой будет сформировано имя файла, и адрес этой ячейки изменяться не будет.

Итак, данные у нас есть, теперь необходимо написать процедуру на VBA (макрос), которая брала бы значение из конкретной ячейки, в данном случае это будет ячейка B14, и присваивала бы это значение имени файла.

Если нужно сохранять макрос в каждом файле, т.е. файлы с поддержкой макросов (расширение .xlsm), то необходимо просто указать другой тип файла при сохранении, а именно xlOpenXMLWorkbookMacroEnabled, в процедурах в комментариях я это указываю.

Открываем в Excel редактор Visual Basic, и вставляем код следующей процедуры в исходный код этой книги (ЭтаКнига, открыть двойным кликом) или в модуль, который Вы предварительно должны создать.

Примечание! Для того чтобы открыть редактор Visual Basic в Excel, необходимо перейти на вкладку «Разработчик» и нажать на кнопку «Visual Basic». Файл Excel с кодом процедуры необходимо сохранить с типом «Книга Excel с поддержкой макросов».

Код процедуры

После сохранения файла запустите макрос («Макросы -> Выполнить -> SaveFile»).

Скриншот 3

Добавление кнопки в Excel для запуска макроса

Каждый раз открывать окно с макросами и выбирать нужный макрос не очень удобно, поэтому можно легко добавить кнопку где-нибудь рядом с данными и просто нажимать ее. Это делается следующим образом «Вкладка Разработчик -> Вставить -> Кнопка (элемент управления формы)».

Скриншот 4

Затем выберите место, где вставить кнопку, и нажмите туда. После этого появится окно назначения действия, т.е. нужно выбрать, какой макрос запускать при нажатии этой кнопки, выбираем наш макрос, т.е. SaveFile, и нажимаем «ОК».

Скриншот 5

В итоге появится кнопка с названием «Кнопка», это название лучше изменить, например, на «Сохранить файл». Для этого нажмите правой кнопкой мыши на кнопку и выберите настройки «Изменить текст». В итоге у Вас должно получиться что-то вроде этого.

Скриншот 6

Теперь давайте представим, что заранее мы не можем определить, какая именно ячейка будет формировать название файла (может B14, а может и нет), поэтому мы можем немного скорректировать алгоритм таким образом, чтобы он брал значение из ячейки, которая является активной, но в этом случае Вы, конечно же, предварительно, должны выбрать ее (т.е. встать на нее).

Замените код процедуры следующим кодом, который совсем немного, но изменен.

Проверяем работу, становимся на нужную ячейку, и запускаем макрос (в процедуре я добавил проверку, если выбрана пустая ячейка, возникнет ошибка).

Скриншот 7

Как видим, все отработало.

Сохранение файла Excel с названием, которое сформировано из значений двух ячеек

Теперь представим, что нам нужно сформировать файл с названием из значений двух ячеек. Например, в нашем случае это может быть «Марка Авто – VIN Номер», в качестве разделителя я указал символ – (дефис), но им может выступать любой символ или вовсе отсутствовать.

В этом примере я покажу, как можно это реализовать с привязкой к конкретным ячейкам, в нашем случае B14 и D14.

Код процедуры в данном случае будет выглядеть следующим образом.

Скриншот 8

Все ОК, файл создан.

Если вдруг нужно реализовать без привязки к конкретным ячейкам, например, значения хранятся в определённых столбцах, но конкретная строка неизвестна Вам заранее. Например, у меня несколько строк со значениями, и какие конкретно значения взять за основу названия файла, я хочу указывать самостоятельно, непосредственно перед сохранением, но при этом не редактировать код процедуры.

Для этого мы снова внесем изменения в нашу процедуру, которая будет работать от активной ячейки (смещение от активной ячейки), только с условием того, что выбран столбец с теми значениями, которые необходимо использовать.

Код процедуры

Становитесь на любую ячейку со значением в столбце B, и запускайте макрос.

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

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

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

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

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

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

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

Комментарии

Спасибо. Разобрался. Нашёл ошибки в библиотеках.)

Спасибо. Всё запустил, но не работает. Пишет не найден проект или библиотека. Простите, не уточнил, поменял ещё саму систему (был XP стал Win7 x64).
Вот мой код:
Private Sub CommandButton2_Click()
On Error Resume Next
Const REPORTS_FOLDER = "C:\Users\. \. \. "
MkDir ThisWorkbook.Path & "\" & REPORTS_FOLDER
ChDrive Left(ThisWorkbook.Path, 1): ChDir ThisWorkbook.Path & "\" & REPORTS_FOLDER
FileName = [b8] & "_" & [b6] & "_" & [b4] & "_" & Format([b2], "DDMMMMYY") & "_" & [c2] & ".xlsx"
Err.Clear: Worksheets(Array(. ", ". ")).Copy: DoEvents
If Err Then Exit Sub
If ActiveWorkbook.Worksheets.Count = 2 And ActiveWorkbook.Path = "" Then
ActiveWorkbook.SaveAs FileName, xlWorkbookNormal
ActiveWorkbook.Close False
End If
End Sub

Убедитесь, что макросы вообще включены в настройках Excel.
Перед запуском файла с макросами, необходимо выполнить следующее:

> найти файл с макросами в папке
> щелкнуть правой кнопкой мыши на файле - Свойства - Разблокировать - ОК
> и только после этого запускать

Перешёл с 2007 на Office 2016, перестали работать макросы. И этот. (((

Добрый день, подскажите, пожалуйста, что надо изменить в макросе, чтобы:
1. Он копировал не весь лист целеком, а только диапазон ВИДИМЫХ ячеек (A1:L50), т.к. этот диапазон только часть отфильтрованного списка.
2. Он копировал только значения, без формул ячеек.

Здравствуйте, Алексей
Да, можно такое сделать, - могу написать макрос под заказ.

Здравствуйте, Игорь.
Подскажите, пожалуйста, возможно ли такое, чтобы Лист можно было сохранять не единожды (по имени в одной ячейке) а сославшись на какой-либо диапазон ячеек. Есть потребность сделать в конкретной папке количество файлов соответствующее количеству дней в месяце(отчет на каждый день). Если в диапазоне ячеек указать даты месяца и по нажатию макрос сохранял бы, файлы с именем Даты.

Можете написать макрос под заказ? Мне надо до понедельника

Напишите ваши контакты, есть несколько задач.

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

Дело в том, что в книге порядка 20-30 листов и каждый лист необходимо сохранить в отдельные папки, соответствующие имени листа.

Дмитрий, а куда уж проще-то. вы нажимаете одну кнопку «Печать», и получаете готовый файл JPG
Зачем ещё-то упрощать.
Можно, конечно, и макрос под заказ написать
Если в формат BMP (или EMF) картинку сохранять - то макрос несложный, если в формат JPG - то макрос сложнее будет (и дороже)
Но я бы на вашем месте не стал изобретать велосипед, а оставил бы все как есть.

Сохраняю листы в JPEG формате, при помощи виртуального принтера "universal document converter" возможно ли упростить процедуру сохранения активного листа?

On Error Resume Next
Const REPORTS_FOLDER = "Двери\"
' название подпапки, в которую по-умолчанию будет предложено сохранить файл

MkDir ThisWorkbook.Path & "\" & REPORTS_FOLDER
' создаём папку для файла, если её ещё нет

ChDrive Left(ThisWorkbook.Path, 1): ChDir ThisWorkbook.Path & "\" & REPORTS_FOLDER
' выбираем стартовую папку

Filename = Range("a17") & ("b17") & ".xls"
' вывод диалогового окна для запроса имени сохраняемого файла

If VarType(Filename) = vbBoolean Then Exit Sub
' если пользователь отказался от выбора имени файла - отменяем сохранение листа в файл

Dim Ar(), ArAll&(), Sh As Excel.Worksheet, n

Select Case Sheets(1).[Условие]
Case 1
Ar = Array(3)
Case Else
End Select

ActiveWorkbook.Close False
End Sub

pdfFilename = Application.DefaultFilePath & Application.PathSeparator & "имя файла" & Range("D9").Value & ".pdf"
WB.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=pdfFilename, OpenAfterPublish:=False

При этом файл создается с названием "имя файла.pdf" начисто игнорируя содержимое ячейки указанной.

Вот макрос, который сохраняет без ограничения 255-ти символов в ячейке:

Метод ExportAsFixedFormat сохраняет рабочую книгу Excel или выбранную группу листов этой книги в один PDF-файл. Чтобы экспортировать каждый лист в отдельный файл, необходимо применить метод ExportAsFixedFormat к каждому сохраняемому листу.

Синтаксис

Expression . ExportAsFixedFormat ( Type , FileName , Quality , IncludeDocProperties , IgnorePrintAreas , From , To , OpenAfterPublish , FixedFormatExtClassPtr )

Expression – это выражение, представляющее объект Workbook, Worksheet или Range.

Параметры

Единственный обязательный параметр – Type, остальные можно не указывать – в этом случае будут применены значения по умолчанию.

Параметр Описание
Type Задает формат файла для экспорта книги или листа:
xlTypePDF(0) – сохранение в файл PDF;
xlTypeXPS(1) – сохранение в файл XPS*.
FileName Задает имя файла. При указании полного пути, файл будет сохранен в указанную папку, при указании только имени – в папку по умолчанию (в Excel 2016 – «Документы»). Если имя не задано (по умолчанию), файл будет сохранен с именем экспортируемой книги.
Quality Задает качество сохраняемых электронных таблиц:
xlQualityMinimum(1) – минимальное качество;
xlQualityStandard(0) – стандартное качество (по умолчанию).
IncludeDocProperties Включение свойств документа Excel в PDF:
True(1) – включить;
False(0) – не включать;
мне не удалось обнаружить разницу и значение по умолчанию.
IgnorePrintAreas Указывает VBA, следует ли игнорировать области печати, заданные на листах файла Excel:
True(1) – игнорировать области печати;
False(0) – не игнорировать области печати (по умолчанию).
From** Задает номер листа книги Excel, с которого начинается экспорт. По умолчанию сохранение в PDF начинается с первого листа книги.
To** Задает номер листа книги Excel, на котором заканчивается экспорт. По умолчанию сохранение в PDF заканчивается на последнем листе книги.
OpenAfterPublish Указывает VBA на необходимость открыть созданный файл PDF средством просмотра:
True(1) – открыть файл PDF для просмотра;
False(0) – не открывать файл PDF для просмотра (по умолчанию).
FixedFormatExtClassPtr Указатель на класс FixedFormatExt (игнорируем этот параметр).

* XPS – это редко использующийся фиксированный формат файлов, разработанный Microsoft, который похож на PDF, но основан на языке XML.
** Применимо только к книге (Workbook.ExportAsFixedFormat), при экспорте листа (Worksheet.ExportAsFixedFormat) указание параметров From и/или To приведет к ошибке.

Примеры экспорта в PDF

Сохранение в PDF книги Excel

Экспорт всей книги

ThisWorkbook . ExportAsFixedFormat Type : = xlTypePDF , Filename : = "C:\Test\file1.pdf" , OpenAfterPublish : = True

Если вы указываете путь к файлу, он должен существовать, иначе VBA сохранит файл с именем и в папку по умолчанию («ИмяКниги.pdf» в папку «Документы»).

Экспорт части книги

Этот способ позволяет сохранить в PDF группу листов, расположенных подряд:


Если вы часто пользуетесь Microsoft Excel, вы должны использовать в нем функцию «Сохранить как», которая позволяет сохранять открытую в настоящий момент книгу с другим именем или другим форматом (Excel Macro-enabled, CSV, PDF и т. Д.). Вы также можете сохранить файл в другой папке, используя этот метод. Однако возможно ли использовать ту же функцию под VBA? Ответ абсолютный Да! У нас также есть функция «Сохранить как» в VBA, которая помогает нам выполнять все вышеупомянутые задачи наряду с некоторыми дополнительными преимуществами (очевидно, автоматизация - одно из преимуществ). В этой статье мы рассмотрим различные примеры функции VBA SAVE AS.

Формула для функции Сохранить как в Excel VBA

Давайте посмотрим ниже формулу для функции Сохранить как в VBA.


  • FileName - имя книги, которую нужно сохранить.
  • FileFormat - формат файла, в котором файл должен быть сохранен (напр. Pdf, CSV и т. Д.)
  • Пароль - пароль для защиты рабочей книги (рабочая книга не может быть доступна без пароля)
  • WriteResPassword - Напишите пароль бронирования для книги.
  • ReadOnlyRecommended - распознает, сохранена ли книга в формате только для чтения или нет.
  • CreateBackup - определяет, создан ли файл резервной копии для книги.
  • AccessMode - распознает режим доступа к книге .
  • ConflictResolution - распознает конфликты, возникающие, когда рабочая книга является общей и используется более чем одним пользователем.
  • AddToMru - проверяет, добавлена ​​ли рабочая книга в недавно использованный файл или нет.
  • Локальный - Проверяет, сохранена ли рабочая книга с законами Excel (местный язык) или с законами VBA (США - английский).

Тише! Много аргументов, верно? Но что, если я скажу вам, все эти аргументы являются необязательными и могут быть пропущены при использовании функции VBA SAVE AS. Однако верно то, что именно эти аргументы делают VBA SaveAs более гибкой в ​​использовании функцией. «Выражение» в начале синтаксиса - не что иное, как выражение, против которого можно использовать эту функцию. Like Workbook - это выражение, с которым можно использовать SaveAs.

Примеры сохранения файла Excel с помощью функции VBA Save As

Ниже приведены различные примеры сохранения файла Excel с использованием функции VBA Save As.

Вы можете скачать этот шаблон VBA Сохранить как Excel здесь - VBA Сохранить как шаблон Excel

Пример № 1 - Как сохранить копию рабочей книги с другим именем?

Давайте посмотрим, как мы можем сохранить текущую книгу под другим именем.

Чтобы использовать функцию «Сохранить как» в Excel VBA, выполните следующие действия:

Шаг 1. Добавьте новый модуль в редактор Visual Basic (VBE). Перейдите на Вставить и затем выберите Модуль.


Шаг 2: Определите новую подпроцедуру, которая может хранить макрос.

Код:


Шаг 3: Определите новую переменную, которая может содержать имя, под которым будет сохранен файл.

Код:


Шаг 4: Теперь используйте оператор присваивания, чтобы присвоить имя этой переменной, используя который текущий файл может быть сохранен как.

Код:


Шаг 5: Теперь используйте функцию SaveAs с аргументом FileName, чтобы сохранить файл с именем «Example1».

Код:


Шаг 6: Вот и все, теперь запустите этот код, нажав F5 или вручную, используя кнопку Run, и посмотрите вывод.


Вы можете видеть, что файл с именем « Пример1 » сохраняется в Документах .

Если бы вы могли записать, файл сохраняется как Macro-Enabled File, потому что исходный файл, на котором я использовал функцию SaveAs, это файл с Macro-Enabled. Это означает, что эта функция в VBA автоматически проверяет формат файла предыдущего файла и сохраняет его в том же формате. Также по умолчанию файл будет сохранен в Документах на этом ПК . Это местоположение по умолчанию может быть предоставлено явно во время определения имени листа.

Пример №2 - Сохранение книги с предоставленным пользователем именем

Вместо первоначального определения имени, можно ли написать код, который позволяет пользователю сохранять рабочий лист под именем по своему выбору, так же как функция Excel Save As?

Выполните следующие шаги, чтобы использовать функцию «Сохранить как» в Excel VBA.

Шаг 1: Определите новую подпроцедуру в недавно вставленном модуле, который может хранить макрос.

Код:


Шаг 2: Определите новую переменную, которая может содержать значение пользовательского имени.

Код:


Причина, по которой эта переменная определяется как Variant, заключается в том, что этот тип данных делает соглашения об именах универсальными. Например, пользователь может добавить некоторый дополнительный специальный символ (который разрешен в соглашениях об именах) или может также добавить даты под именем файла.

Шаг 3: Теперь с помощью оператора присваивания и комбинации функций, называемой application.GetSaveAsFilename, создайте оператор, который позволит системе принять определенное пользователем имя. Посмотрите, как это было достигнуто на скриншоте ниже.

Код:


Шаг 4: Используйте условный IF, чтобы убедиться, что имя, которое вводит пользователь, является действительным согласно соглашениям об именах.

Код:


Это условие проверяет, соответствует ли имя, данное пользователем для сохранения рабочего листа, правилам именования, установленным для именования файла, или нет.

Шаг 5: Запишите утверждение, которое оценивается для данного условия IF.

Код:


Этот фрагмент кода оценивается, когда условие IF выполнено. Если это так, активная рабочая книга будет сохранена под именем, определенным в переменной Spreadsheet_Name (которая будет определяться пользователем)

Шаг 6: Завершите цикл IF и запустите этот код, чтобы увидеть результат.

Код:


Шаг 7: Как только вы запустите этот код, вы получите диалоговое окно Сохранить как, которое позволит вам ввести имя по вашему выбору и сохранить файл.


Пример № 3 - Как сохранить файл в формате PDF с помощью функции Excel VBA SaveAs?

Предположим, у вас есть данные, указанные ниже в вашей таблице Excel, и вам нужно преобразовать их в PDF.


Выполните следующие шаги, чтобы преобразовать этот файл в PDF с помощью функции VBA Сохранить как:

Шаг 1: Определите новую подпроцедуру для хранения макроса.

Код:


Шаг 2. Теперь используйте следующий код, чтобы сохранить этот файл в формате PDF.

Код:


Шаг 3: Запустите этот код, и вы увидите файл PDF, созданный в разделе «Этот ПК»> «Документы».


В этом коде ActiveSheet.SaveAs позволяет сохранить файл с тем же именем. Поскольку мы добавили расширение как .pdf в конец файла, оно экспортируется в файл PDF. Вы можете увидеть изображение выше для вашей справки.

То, что нужно запомнить

  • По умолчанию местом сохранения файла, используемого в VBA SaveAs, будет Этот ПК> Документы. Тем не менее, вы можете указать каталог вручную во время определения имени файла.
  • По умолчанию файл, сохраненный с помощью VBA SaveAs, будет сохранен в том же формате, что и исходный файл. Тем не менее, он также может быть определен в соответствии с требованиями пользователя во время определения переменной.

Рекомендуемые статьи

Это руководство к VBA Сохранить как. Здесь мы обсудим, как сохранить файл с помощью функции Excel VBA Save As вместе с примером и загружаемым шаблоном Excel. Ниже приведены несколько полезных статей о Excel, связанных с VBA.

Читайте также: