Закрыть все открытые книги 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

Комментарии

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

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

сильно Sub CloseAllWorkbooks3() выручил. спасибо!

В такой комбинации, без дополнительных кодов в файле, вроде работает

Private Sub Workbook_Open() ' срабатывает при открытии
ThisWorkbook.Windows(1).Visible = False ' скрываем окно файла, он становится невидимым
Application.OnTime Now + 1 / 86400, "CloseThisFile" ' через секунду запустим макрос
ThisWorkbook.Windows(1).Visible = True ' открываем окно файла, он становится видимым
End Sub

' этот код в стандартном модуле
Sub CloseThisFile()
' закрываем все книги, кроме той, из которой запущен макрос
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

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

Private Sub Workbook_Open() ' срабатывает при открытии
Application.OnTime Now + 1 / 86400, "CloseThisFile" ' через секунду запустим макрос
End Sub

Здравствуйте, Сергей
Исправить-то возможно, но как именно, навскидку не могу сказать.
По идее, должно всё работать
Я пытался протестировать, но что-то у меня не срослось.

Вставил в Книгу1 такой код (в модуль ЭтаКнига)

Private Sub Workbook_Open()
   ThisWorkbook.Close
End Sub

Когда вручную открываешь файл, - всё норм, файл тут же закрывается.
А когда я по ссылке пытаюсь открыть этот файл, Excel сначала предупреждение одно выводит, потом другое (во втором - что файл опасен, и всё такое), а потом Excel просто зависает почему-то

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

Я бы попробовал сделать так: (не проверял)

Private Sub Workbook_Open() ' срабатывает при открытии
   ThisWorkbook.Windows(1).Visible = False ' скрываем окно файла, он становится невидимым
   Application.OnTime Now + 1 / 86400, "CloseThisFile" ' через секунду запустим макрос
End Sub
 
 
' этот код в стандартном модуле
Sub CloseThisFile()
    ThisWorkbook.Close False' закрываем файл без сохранения
End Sub

Здравствуйте.
Попытался вставить второй код в Книгу1 в процедуру открытия книги а затем открыть ее гиперссылкой в Книге2, Книга2 закрывается, но Книга1 открывается и сразу закрывается.
Походу открытие Книги1 через гиперссылку в другой книге не является корректным для данного кода, возможно ли это исправить?

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

можно ли получать не имена открытых книг, а имена открытых файлов 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
Подтвердите, пожалуйста, что вы - человек:
  _____   _  __  _      ____   _____      _    
| ___| | |/ / | |_ / ___| | ___| / \
| |_ | ' / | __| | | | |_ / _ \
| _| | . \ | |_ | |___ | _| / ___ \
|_| |_|\_\ \__| \____| |_| /_/ \_\
Введите код, изображенный в стиле ASCII-арт.

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

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