mail mail
Нужен макрос для Excel?
Сделайте заказ прямо сейчас!
Ищете готовое решение?
Выбирайте и покупайте!
У вас есть интернет-магазин?
Настроим парсер под любой сайт!

Закрыть все открытые книги Excel

Эти макросы помогут вам закрыть все открытые файлы Excel, оставив лишь текущий файл.

Выбирайте любой из них - они мало чем отличаются.

Первый оставляет открытой только активную книгу, независимо от того, из какого файла запущен этот макрос:

Sub CloseAllWorkbooks1()
    ' закрываем все книги, кроме текущей (активной)
    Dim wb As Workbook: Application.ScreenUpdating = False
    For Each wb In Workbooks    ' перебираем все открытые книги
        If Not wb Is ActiveWorkbook Then    ' если это не этот файл
            If wb.Windows(1).Visible Then wb.Close    ' закрываем его
        End If
    Next wb
End Sub

Второй макрос оставляет открытой только ту книгу, из которой запущен этот самый макрос, независимо от того, какая книга активна на момент запуска:

Sub CloseAllWorkbooks2()
    ' закрываем все книги, кроме той, из которой запущен макрос
    Dim wb As Workbook: Application.ScreenUpdating = False
    For Each wb In Workbooks    ' перебираем все открытые книги
        If Not wb Is ThisWorkbook Then If wb.Windows(1).Visible Then wb.Close
    Next wb
End Sub

Третья версия макроса отличается от первой лишь тем, что все файлы закрываются с сохранением изменений:
(первый макрос в этом случае выдаёт диалоговое окно - сохранять файл, или нет)

Sub CloseAllWorkbooks3()
    ' закрываем все книги, кроме текущей (активной), С СОХРАНЕНИЕМ изменений
    Dim wb As Workbook: Application.ScreenUpdating = False
    For Each wb In Workbooks    ' перебираем все открытые книги
        If wb.Windows(1).Visible = True And (Not wb Is ActiveWorkbook) Then
            ' закрываем с сохранением только изменённые файлы
            wb.Close (Not wb.Saved) ' ранее сохранённые файлы просто закрываются
        End If
    Next wb
End Sub

Ну и четвертый вариант - тоже закрывает все открытые файлы, только изменения в этих файлах не сохраняются:

Sub CloseAllWorkbooks4()
    ' закрываем все книги, кроме текущей (активной), БЕЗ СОХРАНЕНИЯ изменений
    Dim wb As Workbook: Application.ScreenUpdating = False
    For Each wb In Workbooks    ' перебираем все открытые книги
        If wb.Windows(1).Visible Then If Not wb Is ActiveWorkbook Then wb.Close False
    Next wb
End Sub

Комментарии

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

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

Тимон, я же вам сказал, - с данным конкретным макросом все в порядке.
В нём не может быть ошибок, если рядом с этим макросом не написать какой-нибудь код, который с ним будет конфликтовать.

можно ли получать не имена открытых книг, а имена открытых файлов Excel

а чем, по-вашему, отличается книга от файла?
если что-то открыто в Excel, - то это объект Workbook (книга Excel)

Обратитесь на форумы по Excel, прикрепите там свой файл, - тогда вам подскажут, в чем проблема.
В этом конкретном макросе, - ошибок нет.

Вроде разобрался в чем дело. VBA ругается на несоответствие полученного значения переменной wb объявленному типу Workbook (почему и выползает wb=nothing)... А можно ли получать не имена открытых книг, а имена открытых файлов Excel и закрывать их? Прошу сильно не пинать за глупость, я совсем недавно начал осваивать VBA. На случай если что-то зависит от версии, Excel у меня 2007.

Поменял, и снова вылезает ошибка type mismatch с указанием что wb=nothing. Вообще цель такая, что при запуске определенного файла excel все открытые файлы должны закрыться и сохраниться, если изменения не сохранены. может нужно код вынести на кнопку, раз при открытии книги он не срабатывает?

Здравствуйте, Тимон

с кодом всё в порядке (у себя проверил, - всё работает)
могу порекомендовать только заменить ActiveWorkbook на ThisWorkbook

можете попробовать ещё поменять

For Each wb In Workbooks

на
For Each wb In Application.Workbooks

Подскажите пожалуйста, а почему не работает такой вот код:

Private Sub Workbook_Open()
CloseAllWorkbooks
frm_Work.Show
End Sub

Sub CloseAllWorkbooks()
Dim wb As Workbook
Application.ScreenUpdating = False
For Each wb In Workbooks
If Not wb Is ActiveWorkbook Then
wb.Close (Not wb.Saved)
End If
Next wb
End Sub

При наличии любого открытого файла excel выполнение этого кода при запуске файла с ним приводит к ошибке wb=nothing...

Вы не написали, в каком формате сохранять, - я это и не учел в макросе
Метод saveas принимает в качестве второго параметра тип файла - поставьте курсор в коде на saveas, нажмите F1, почитайте справку, доработайте код

Эхехе... Даже и не знаю, что делать. Файлы выгружаются из программы в старом формате, из-за этого включается режим ограниченной функциональности и отключаются макросы.

Спасибо огромное!

Конечно можно
пример макроса:

Sub CloseAllWorkbooks1()
    ' закрываем все книги с сохранением, взяв полный путь к файлу из ячейки A1
   Dim wb As Workbook: Application.ScreenUpdating = False
    For Each wb In Workbooks    ' перебираем все открытые книги
       If wb.Windows(1).Visible Then 
            wb.saveas wb.worksheets(1).range("A1") ' сохраняем файл
            wb.Close    ' закрываем его
       End If
    Next wb
End Sub

Добрый день!

Подскажите, а можно ли закрыть с сохранением все открытые книги, чтобы имя файла бралось из какой-то ячейки?

Спасибо!

Hugo, полностью согласен. Спасибо за замечание.
Просто я не пользуюсь файлами типа Personal.xls, и регулярно забываю проверять книги на видимость окна перед закрытием...

Исправил макросы в статье.

А как же Personal.xls/x/b? Если закрываем ВСЕ книги, тогда всё равно, но если оставляем текущую, то вероятно нужно оставить и все нужные скрытые книги? У меня таких аж 3 в фоне открыты - я без них не могу (не хочу :) )

Я бы добавил ещё условие
If Windows(wb.Name).Visible Then
или
If wb.Windows(1).Visible Then

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

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
  _____   ____   _____              _     __  __
|__ / / ___| |_ _| __ __ | | __ \ \/ /
/ / | | | | \ \ /\ / / | |/ / \ /
/ /_ | |___ | | \ V V / | < / \
/____| \____| |_| \_/\_/ |_|\_\ /_/\_\
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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