Vba 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

Skip to content

Как закрыть сразу все книги

На чтение 2 мин. Просмотров 1.5k.

Что делает макрос: Данный макрос позволяет закрыть все открытые рабочие книги одновременно.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как работает этот код
  4. Как использовать

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

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

Код макроса

Sub ZakritVseKnigi()
'Шаг 1: Объявляем переменные
Dim wb As Workbook
'Шаг 2: Перебираем все открытые книги
For Each wb In Workbooks
'Шаг 3: Закрываем
wb.Close 
'Шаг 4: Сохраняем изменения
SaveChanges:=True
Next wb
End Sub

Как работает этот код

  1. Объявляем переменную, которая представляет собой объект книга. Это позволит перебирать все открытые книги.
  2. С помощью цикла просто проходит через все открытые книги.
  3. Закрываем книгу (Excel затем выдаст сообщение с предложением сохранить изменения).
  4. Сохраняем изменения. Если Вы не хотите, чтобы их сохраняли, нужно изменить аргумент Savechanges значение с True на false.

Как использовать

Лучшее место, чтобы сохранить этот макрос — это ваша книга личных макросов. Таким образом, макрос всегда будет доступен для вас. Книга личных макросов загружается при запуске Excel. В окне VBE проекта, он назван personal.xlsb.

  1. Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
  2. Щелкните правой кнопкой мыши personal.xlb в окне Project.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код во вновь созданном модуле.

Если вы не видите personal.xlb в окне проекта, он еще не существует. Вы должны записать макрос, используя книгу личных макросов в качестве конечного пункта.

Чтобы записать макрос в личной книге макросов, выберите пункт: Личная книга макросов в диалоговом окне записи макроса перед началом записи. Просто записать пару кликов, а затем остановить запись. Вы можете сбросить записанный макрос и заменить его с этим.

Zakrit Vse Knigi

If you are working with multiple Excel files at once, you often find yourself dealing with warning messages when trying to close them. Although it is a good thing to be warned about saving to not lose changes in a workbook, it may become annoying quickly. Thanks to VBA, you can create a macro to close them all, preferably save as well. In this guide, we’re going to show you how to close all workbooks in Excel with VBA.

Preparation

You cannot close all workbooks if your code closes the workbook which includes the code, right? You need to store your code in a special file named Personal.xlsb. Personal.xlsb is a special macro file also known as Personal Macro Workbook. This file will be created automatically when you record a macro in it deliberately. Once created, this workbook will be opened in the background whenever you start Excel.

To check whether the file has been created correctly, open a blank workbook, and activate the View tab in the Ribbon. If the Unhide button is disabled, then your Personal.xlsb file has not been created.

You can easily create it by recording a macro.

  1. Click Record Macro in the Developer tab or Status Bar. If the Developer tab is hidden, see How to display the Excel Developer tab for using advanced features.
  2. Select Personal Macro Workbook from the Store macro in list
  3. Click the OK button to start recording a macro.
  4. If you do not want to record any action, you can click the Stop Macro button right away.

Once the macro recording stops, Excel creates the Personal.xlsb file. You can either use the Unhide command to make it visible or open the VBA window and access it through there.

Write your macros in Personal.xlsb and save the file in the VBA window.

Macro

All you need is to loop through each workbook and execute Close method for the active workbook. A simple For Each loop to iterate all workbook objects in a parent Workbooks object is enough.

You can determine if the workbooks are saved or not by populating the Close method’s SaveChanges argument. The default value of this argument is False which indicates no saving. Set it as True to save changes in your workbooks.

How to close all workbooks in Excel with VBA

Do not forget to save Personal.xlsb file by the Save button or command in the VBA window.

Close all workbooks without saving changes

Sub CloseAllWorkbooks()
    'Define a workbook variable
    Dim wb As workbook
    'Loop through all workbooks and close them
    For Each wb In Workbooks
        wb.Close
    Next wb
End Sub

Close all workbooks without saving changes

Sub CloseAllWorkbooksAndSave()
    'Define a workbook variable
    Dim wb As workbook
    'Loop through all workbooks, save and close them
    For Each wb In Workbooks
        wb.Close SaveChanges:=True
    Next wb
End Sub
 

Spare

Пользователь

Сообщений: 121
Регистрация: 01.01.1970

Добрый день уважаемые форумчане, написал (собрал) вот такой вот макрос, обрабатывает он файлы замечательно, но закрывает почему-то не все книги (постоянно приходится в ручную закрывать последнюю).  
Хотелось бы, чтобы макрос закрывал все книги,  а не оставлял 1-2 открытыми.  
Заранее спасибо.    

  Sub replace()  
‘ Смена месяца автоматом в актах списания материалов  
Dim T&  
Dim i As Boolean  
Dim oWbk As Workbook  
   Dim oFile, wsSh As Worksheet  
   With Application.FileDialog(msoFileDialogFilePicker)  
       .AllowMultiSelect = True  
       .InitialFileName = «*.xlsx*»  
       .Title = «??????? ????? ??? ????????? ??????»  
       If .Show = False Then Exit Sub  
       For Each oFile In .SelectedItems  
           workbooks.Open oFile, UpdateLinks  
               i = ActiveWorkbook.Name Like «Списание*.xlsx»  
               Select Case i  
               Case True  
               For T = 2 To Sheets.Count — 3  
               Sheets(T).Cells.replace What:=»Акт Август», Replacement:=»Акт Сентябрь», LookAt:= _  
               xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _  
               ReplaceFormat:=False  
               Next  
               Sheets(1).Select  
               End Select  
       Next oFile  
   End With  
   For Each oWbk In Application.workbooks  
   ActiveWorkbook.Close Savechanges = True  
   Next  
End Sub

 

VictorM

Пользователь

Сообщений: 1
Регистрация: 01.01.1970

Допишите  
Next  
ActiveWorkbook.Close Savechanges = True  
End Sub  
должно помочь

 

слэн

Пользователь

Сообщений: 5192
Регистрация: 16.01.2013

заменить  
For Each oWbk In Application.workbooks  
ActiveWorkbook.Close Savechanges = True  
Next  

  на  

  For Each oWbk In Application.workbooks  
oWbk.Close Savechanges = True  
Next

 

Spare

Пользователь

Сообщений: 121
Регистрация: 01.01.1970

Спасибо за быстрые ответы, но чет не помогает, видимо слишком кривые руки у меня )

 

слэн

Пользователь

Сообщений: 5192
Регистрация: 16.01.2013

нет вру  

  на  

  For Each oWbk In Application.workbooks  
if oWbk.name<>thisworkbook.name then oWbk.Close Savechanges = True  
Next  
thisworkbook.close

 

{quote}{login=слэн}{date=15.09.2011 12:32}{thema=}{post}нет вру  

  на  

  For Each oWbk In Application.workbooks  
if oWbk.name<>thisworkbook.name then oWbk.Close Savechanges = True  
Next  
thisworkbook.close{/post}{/quote}  
Спасиб, проверю через час и отпишусь

 

Spare

Пользователь

Сообщений: 121
Регистрация: 01.01.1970

{quote}{login=слэн}{date=15.09.2011 12:32}{thema=}{post}нет вру  

  на  

  For Each oWbk In Application.workbooks  
if oWbk.name<>thisworkbook.name then oWbk.Close Savechanges = True  
Next  
thisworkbook.close{/post}{/quote}  
Работает, спасибо, только не понял прикола  почему не работает  

  For Each oWbk In Application.workbooks  
ActiveWorkbook.Close Savechanges = True  
Next

 

слэн

Пользователь

Сообщений: 5192
Регистрация: 16.01.2013

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

  ps для последней строки тоже должно быть savechanges=true

 

Spare

Пользователь

Сообщений: 121
Регистрация: 01.01.1970

{quote}{login=слэн}{date=15.09.2011 01:45}{thema=}{post}доходит до книги, в которой находится макрос… и закрывает ее, прекращая дальнейшую работу.  

  ps для последней строки тоже должно быть savechanges=true{/post}{/quote}  

  Нет мне нужно закрытие книги с макросом.  
Не закрывалась книга с макросом + 1 из обрабатываемых книг.  
Почему она не закрывалась так и не понял, пробовал на разных файлах.    
Первая из обрабатываемых книг не закрывалась.

 

слэн

Пользователь

Сообщений: 5192
Регистрация: 16.01.2013

если честно — ничего не понял :)

 

Spare

Пользователь

Сообщений: 121
Регистрация: 01.01.1970

{quote}{login=слэн}{date=15.09.2011 02:53}{thema=}{post}если честно — ничего не понял :){/post}{/quote}  

  1запускаю макрос  
2макрос выполняется  
3 закрываются все книги обрабатываемые макросом кроме одной (самой первой)  
4 в Итоге 2 открытых книги 1-книга с макросом 2 одна из книг обрабатываемых макросом

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

>>3 закрываются все книги обрабатываемые макросом кроме одной (самой первой)  
Той, в кот. выполняется макрос?  
Application.Quit

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

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

  Dim wb As Workbook: Set wb = Workbooks.Open(ИмяФайла, , True) ‘ открываем файл  
sh.Range(«a1»).Copy wb.Worksheets(1).Range(«a1»)    
wb.Close True’ закрываем открытую книгу  

  Ну а в конце, если что, то уже и Application.Quit

 

Spare

Пользователь

Сообщений: 121
Регистрация: 01.01.1970

{quote}{login=nerv}{date=15.09.2011 05:24}{thema=}{post}>>3 закрываются все книги обрабатываемые макросом кроме одной (самой первой)  
Той, в кот. выполняется макрос?  
Application.Quit{/post}{/quote}  
Да, в которой выполняется макрос.  
+ Книга в которой макрос записан. (остаются открытыми)  

    Dim wb As Workbook: Set wb = Workbooks.Open(ИмяФайла, , True) ‘ открываем файл  
sh.Range(«a1»).Copy wb.Worksheets(1).Range(«a1»)    
wb.Close True’ закрываем открытую книгу  
Боюсь мне не подойдет  
Так как у меня примерно 80 файлов с одинаковой структурой с разными именами и в разных папках, поэтому мне кажется проще открывать книги через File dialog.

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Ну а попробовать  
Set wb = Workbooks.Open(oFile, , True) ‘ открываем файл  

  Правда не знаю, как там UpdateLinks прописывают (если это вообще нужно), но наверняка есть опция.

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Да хоть так:  

  With .Workbooks.Open _  
                    (Filename:=oFile, UpdateLinks:=False, ReadOnly:=False)  
…  
…  
.close true  
End with

 

Spare

Пользователь

Сообщений: 121
Регистрация: 01.01.1970

{quote}{login=Hugo}{date=15.09.2011 06:28}{thema=}{post}Ну а попробовать  
Set wb = Workbooks.Open(oFile, , True) ‘ открываем файл  

  Правда не знаю, как там UpdateLinks прописывают (если это вообще нужно), но наверняка есть опция.{/post}{/quote}  

  Про такой подход не знал, спасиб буду пробовать.  
Апдейт линкс нужно обязательно

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

#18

15.09.2011 18:30:51

Т.е. UpdateLinks:=True

I have an Excel app which open another workbooks stored into the WBdata variable.

What I want it does is when I hit the close button [X] it closes the WBdata Workbooks then if my app is the only remaining workbooks opened, close Excel, else just close this workbook.

I tried this :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.Save
    ThisWorkbook.WBdata.Close False

    If (Workbooks.Count = 1) Then
        Application.Quit
    Else
        ThisWorkbook.Close
    End If
End Sub

But it seems that the before close event isn’t the way to go because the Else part of the If will fire again the before close.

So I tried to juste put an If like that :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
        ThisWorkbook.Save
        ThisWorkbook.WBdata.Close False

        If (Workbooks.Count = 1) Then
            Application.Quit
        End If
    End Sub

But it results that I have all the workbooks closed but not the Excel application. (Maybe because the application.quit is on the before_close event ?)

How can I properly close the WBdata then this Workbook, and close Excel if they were the only remaining workbooks opened ?

Like this post? Please share to your friends:
  • Vba excel закрыть все книги без сохранения
  • Vba excel закрыть все userform
  • Vba excel закрепленные области
  • Vba excel закрепить ячейки в excel
  • Vba excel закрепить верхнюю строку