Макрос сохранить как и закрыть файл

Обновлено: 07.07.2024

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

Я понимаю задачу так: имеем рабочую книгу, например, MyMacros.xlsm, содержащую макрос(ы) для обработки файлов, например, вида FIC_дд.мм.гггг.xlsx. То есть, макрос(ы) хранятся в отдельной книге, обрабатывают другие книги указанного вида.

Оба макроса в принципе очень похожи.

MyMacros обрабатывает файл текущего дня,
MyDial позволяет выбрать файл для обработки.

FileInPref = "Z:\Box_In\FIC_" - путь и префикс исходных файлов
BoxOut = "Z:\Box_Out" - папка для записи копии обработанного файла

Обработку Вашей рабочей книги лучше выделить в отдельную процедуру, я это сделал как пример в процедуре Processing

Прикрепляю пример книги с макросами. Уберите расширение .txt

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Последний раз редактировалось megaloman, 19-11-2020 в 20:48 .

Iska и megaloman спасибо, что откликнулись!

Макрос сохранен в отдельной книге. Запускается файл с макросом, затем исходный файл, который становится активным. Из этого исходного файла запускается макрос, который производит форматирование содержимого (приводит в читабельный вид). В конце макроса записал:

ActiveWorkbook.Save (файл сохраняется в ту папку, из которой был вызван)
ActiveWorkbook.SaveAs "I:\ABC\xxxxx"
ActiveWindow.Close (файл закрывается)

Если запустить макрос в таком виде, файл сохранится на диск I, в папку АВС с именем ххххх.xlsx/

Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\" - выдает ошибку.
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\*.xlsx" - выдает ошибку.
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\*.*" - выдает ошибку.

То есть название файла нужно вводить! Мне же нужно, чтобы файл сохранялся под исходным именем автоматом.
Вообще-то, конечно, не проблема вручную скинуть на флешку. Но интересно решить эту, казалось бы, простую задачу.

Iska, Вам отдельное спасибо. Каждый раз вы приходите мне на помощь. Я два или три раза создавал темы.
megaloman, спасибо за приведенный листинг, но это чересчур сложно. Я надеялся на простое решение. Ваше решение сугубо профессиональное, а я - простой пользователь.

Последний раз редактировалось mastertm, 20-11-2020 в 09:35 . Причина: Дописать благодарность

Макрос сохранен в отдельной книге. Запускается файл с макросом, затем исходный файл, который становится активным. »
Файл с макросом имеет расширение .xlsm, исходный файл, например, "FIC_09.10.2020.xlsx", не может содержать макрос. Поэтому:
Из этого исходного файла запускается макрос, который производит форматирование содержимого »
этого не может быть. У Вас макрос с форматированием может быть только в файле с макросом с расширением .xlsm. Вот эта фраза: с моей точки зрения - кокетство. Вы решаете задачу - здорово, но неверно выбрать путь решения, которое ни к чему не привёл и требовать от других ему следовать. Возьмите не мой листинг, а мою таблицу с макросами, подкорректируйте мои пути на свои, создайте тестовую исходную таблицу, убедитесь, что использовать оба макроса не составляет труда для "простой пользователь". Вам только надо вписать свою процедуру форматирования открытой исходной книги, которая после открытия становится активной.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Запускается файл с макросом , затем исходный файл , который становится активным. Из этого исходного файла запускается макрос , »
Конфигурация компьютера
Процессор: AMD Ryzen 5 1600
Материнская плата: GIGABYTE B450M DS3H
Память: Kingston ValueRAM [KVR24N17S8/8] 8 ГБ
HDD: KINGSTON SV300S37A120G ATA 120ГБт SSD; SAMSUNG HD501LJ, SATA, 500ГБт; ST2000VM003-1CT164 ATA Device 2ТБт
Видеокарта: GIGABYTE Radeon R7 250 1100Mhz PCI-E 3.0 2048Mb 1800Mhz 128 bit DVI HDMI HDCP
Звук: Realtek ALC887
Блок питания: CoolerMaster MasterWatt Lite 600W, 2019
Монитор: Samsung SyncMaster 2443, 24''
ОС: Windows 10 Pro 64Bit
Создал макрос, который форматирует этот файл, сохраняет его и закрывает. Но понадобилось перед закрытием сохранить этот файл еще и на другой носитель (USB). »
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\" - выдает ошибку.
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\*.xlsx" - выдает ошибку.
Если запустить в виде: ActiveWorkbook.SaveAs "I:\ABC\*.*" - выдает ошибку. »
mastertm, сохранить копию файла под исходным именем, но по новому пути (флешка или просто папка бэекапа) в 2016 офисе успешно решается строчкой
На заявленном 2010 проверяйте сами, возможно нужно добавить & ".xlsx" (в поиске проскакивает указание расширения, у меня все прекрасно работает и без него).
Ну строго говоря - xlsm, xls, xlsb, xla, xlam , хотя смысла это разумеется не меняет.
Полагаю, это просто неточная фигура речи: я нахожусь в рабочем файле xlsx и вызываю, находясь в нем - "из него" - макрос (который хранится и в конечном итоге вызывается разумеется из стороннего xlsm файла).
megaloman, объективно говоря - код у Вас достаточно сложный , мне кажется, на первых шагах изучения VBA - неподъемный.

Всем - здравствуйте!
Поподробнее обо всем. Каждый день скачиваю данные с десяти узлов с параметрами работы в виде файла .xlsx. Эти десять файлов нужно привести в читабельный вид. Для этого написал макрос:

Sub Macros1ALL()
'
' Macros1
'
For i = 1 To 10
' тут производится форматирование
ActiveWorkbook.Save
ActiveWindow.Close
Next i
End Sub

Sub Macros2GALL()
'
' Macros1
'
For i = 1 To 10

ActiveWorkbook.Save
MyFile = ActiveWorkbook.Name
ActiveWorkbook.SaveAs Filename:="I:\CG\KPR\" & MyFile
ActiveWindow.Close
Next i
End Sub

В своих поисках я исходил из следующего: не может быть, чтобы для выполнение такой рутинной операции было необходимо вызывать целую процедуру. Должен был быть более простой путь. Разработчики пакета Office не могли об этом не подумать!
Я скачал и исследовал несколько книг по VBA-программированию, но ни одна из них мне не помогла.
Зато помогли мне вы, мои друзья. Надеюсь, я могу Вас так назвать. Всем большое спасибо. Удачи!

Итог: Изучите несколько трюков и советов, чтобы сохранить и закрыть все открытые книги Excel.

Уровень мастерства: Начинающий

3 Tips to Save and Close All Files2

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

Совет № 1: Shift + кнопка закрытия окна

Close All Excel Workooks Shortcut Shift Key Close Button

Если все открытые книги были сохранены, все они будут закрыты.

Если какая-либо из открытых книг НЕ была сохранена, вам будет предложено сохранить файл. Появится всплывающее окно, и вам придется нажимать Сохранить или Не сохранять для каждой несохраненной книги.

Excel Warning Want to Save Changes Before Closing File Window Save All

Окно также содержит кнопку Сохранить все. Вы можете нажать эту кнопку, чтобы сохранить все несохраненные книги за один шаг.

Нажатие на кнопку «Отмена» отменит всю операцию, а все еще открытые книги останутся открытыми.

Но что, если мы не хотим сохранить все или некоторые из открытых рабочих книг? Мы вернемся к этому в совет № 3.

Совет № 2: добавьте кнопку «Закрыть все» на панель быстрого доступа

Мы также можем добавить кнопку «Закрыть все» на панель быстрого доступа (QAT), чтобы закрыть все открытые книги. Это делает то же самое, что и сочетание клавиш Shift + Close Window.

Excel Close All Button Quick Access Toolbar

Преимущество здесь в том, что мы можем использовать сочетание клавиш для нажатия кнопки. Доступ к кнопкам QAT можно получить с помощью сочетания клавиш, нажав клавишу Alt и номер, назначенный кнопке.

QAT Keyboard Shortcut to Close All Excel Files

Чтобы добавить кнопку «Закрыть все» в QAT, откройте окно параметров Excel («Файл»> «Параметры») и следуйте инструкциям на изображении ниже.

Add Close All But to Quick Access Toolbar in Excel Options

После нажатия кнопки «Закрыть все» нам будет предложено то же окно, как описано в совете № 1.

Бонусный совет: мы также можем использовать сочетание клавиш Ctrl + W, чтобы закрыть одну книгу. Я упомянул этот совет в своем посте по 17 ярлыкам Excel на 2017 год.

Press Ctrl W to Close Last Excel Workbook and Leave Application Open

Совет № 3: Закройте все открытые книги с помощью макроса

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

Макрос для закрытия всех книг без сохранения

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

Как работает этот макрос?

Приведенный выше макрос просматривает все открытые книги на компьютере с помощью цикла For Next Loop. Он использует оператор If, чтобы проверить, является ли файл в цикле (wb.Name) НЕ (<>) файлом, который содержит код ThisWorkbook.Name.

Затем он использует метод Workbooks.Close (страница справки MSDN), чтобы закрыть книгу. Метод Close имеет необязательный параметр для SaveChanges. Мы можем установить значение True, чтобы сохранить изменения, и False, чтобы закрыть без сохранения.

Макрос для сохранения всех, кроме новых несохраненных книг (блокнот)

В конце рабочего дня у меня обычно есть несколько книг, которые я хочу сохранить, и некоторые, которые я НЕ хочу сохранять. Я часто открываю новые рабочие книги, чтобы использовать файлы Excel для быстрых вычислений. Я называю их «блокноты». Я не хочу сохранять их, но хочу сохранить все другие открытые файлы.

Таким образом, мы можем добавить оператор If в наш макрос, чтобы увидеть, существует ли расширение файла. Если расширение файла существует, то мы сохраним файл. Если нет, то мы закроем без сохранения.

Как работает этот макрос?

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

Функция Instr (страница справки MSDN) используется для поиска строки в строке. Возвращает начальный номер строки. Таким образом, если Instr находит «.xls» в пределах «.xlsx» или «.xlsm», он возвращает 1. В противном случае он возвращает 0.

Оператор If проверяет, является ли возвращаемое значение из Instr больше 0, и сохраняет изменения при закрытии книги. В противном случае изменения не сохраняются для книг, которые НЕ содержат расширения.

Макрос для сохранения и закрытия всех книг и автоматического именования файлов

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

Save and Close All Files and Auto Name New Files

Следующий макрос сохранит и закроет ВСЕ файлы и автоматически назовет новые файлы, которые не были сохранены. Он помещает все новые файлы (блокнот) в указанную вами папку.

Unsaved Files Save to a Folder and Automatically Named

Затем вы можете вернуться в эту папку, когда у вас будет свободное время для перемещения и переименования файлов.

Как работает этот макрос?

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

Чтобы использовать этот макрос, вам нужно изменить переменную sPath на папку на вашем компьютере. Обязательно заканчивайте строку пути к файлу обратной косой чертой.

У метода Workbooks.Close есть еще один необязательный параметр (Filename), который позволяет нам указать имя файла, в котором мы хотим сохранить файл, если файл еще не был сохранен.

Если мы не используем параметр «Имя файла», Excel предложит нам меню «Сохранить как» для каждого файла. Таким образом, указание имени файла обходит это окно и может сэкономить нам много времени.

Значение параметра Filename объединяет строку для полного пути к файлу. Он также изменяет текущую дату и время до конца имени файла, используя функции «Формат» и «Сейчас». Функция Format в VBA аналогична функции TEXT в Excel и позволяет нам указать числовой формат. Функция «Сейчас» возвращает текущую дату и время на компьютере пользователя.

Я рекомендую добавить эти макросы в вашу личную книгу макросов, чтобы вы могли использовать их в любое время. Чтобы узнать больше, ознакомьтесь с моей статьей и видео о личной книге макросов.

У вас есть свои советы по сохранению и закрытию файлов?

Я надеюсь, что эти советы и макросы помогут вам закончить день немного быстрее. Есть ли у вас какие-либо другие советы по закрытию файлов? Пожалуйста, оставьте комментарий ниже с любыми предложениями или вопросами. Спасибо!

Существующая книга открывается из кода VBA Excel с помощью метода Open:

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

Или, если файл существует, можно сразу его открыть:

Создание новой книги

Новая рабочая книга Excel создается в VBA с помощью метода Add:

Созданную книгу, если она не будет использоваться как временная, лучше сразу сохранить:

В кавычках указывается полный путь сохраняемого файла Excel, включая присваиваемое имя, в примере — это «test2.xls».

Обращение к открытой книге

Обращение к активной книге:

Обращение к книге с выполняемым кодом:

Обращение к книге по имени:

Обратиться по имени можно только к уже открытой книге, а чтобы из кода VBA Excel книгу открыть, необходимо указать полный путь к файлу.

Как закрыть книгу Excel из кода VBA

Открытая рабочая книга закрывается из кода VBA Excel с помощью метода Close:

Если закрываемая книга редактировалась, а внесенные изменения не были сохранены, тогда при ее закрытии Excel отобразит диалоговое окно с вопросом: Вы хотите сохранить изменения в файле test1.xlsx? Чтобы файл был закрыт без сохранения изменений и вывода диалогового окна, можно воспользоваться параметром метода Close — SaveChanges:

Закрыть книгу Excel из кода VBA с сохранением внесенных изменений можно также с помощью параметра SaveChanges:

Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

30 комментариев для “VBA Excel. Рабочая книга (открыть, создать новую, закрыть)”

Если речь идет об обновлении связей между книгами, то попробуйте так:

Здравствуйте, Вячеслав!
Для выбора книги в определённой папке используйте Стандартный диалог выбора файлов Application.GetOpenFilename.

закрывает саму книгу, но при этом сама прога остаётся висеть со своим интерфейсом. Можно нажать Ctlr+O и открыть какой-нибудь xls-файл.
При этом на компе могут быть открыты другие файлы, поэтому команда

не допустима.
Что делать?

Сергей, используйте глобальные переменные, если файл Excel открывается и закрывается разными процедурами (переменные позволят закрыть тот самый файл и тот самый экземпляр приложения, в котором открыт файл):

Set myWorkbook = myExcel . Workbooks . Open ( "C:\Users\. xlsx" )

А как открывать книгу, если имя файла совпадает с названием из массива.
То есть есть массив переменных которые записаны в столбец начиная с столбца А строки 2. Названия всегда разные.но совпадают с названием файла. Можно ли поочередно открыть их для редактирования через VBA

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

Workbooks . Open ( " C : \ Users \ Public \ " & Cells ( n + 2 , 1 ) )

Объявление глобальной переменной n размещено в разделе Declarations программного модуля. Число 15 соответствует номеру строки последней ячейки диапазона с именами рабочих книг.

имеется 2 книги (обе открытые)

Используя ссылку (без ручного ввода) надо обратиться Книга 2, скопировать 5 строк ниже ссылки (строка6:строка10) и вставить в рабочую книгу(Книга 1)

Этот код VBA копирует пять строк под указанной ячейкой из открытой книги Excel по адресу из ячейки D4 Листа1 текущей книги и вставляет их в текущую книгу в пять строк под ячейкой D4 Листа1:

Данный макрос позволяет упростить процедуру сохранения активного листа в книге 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-ти символов в ячейке:

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