Progress-servis55.ru

Новости из мира ПК
4 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel закрыть книгу без сохранения

Запрос «Отключение сохранения изменений» при закрытии книги в Excel

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

Описание

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

Дополнительные сведения

ПРИМЕЧАНИЕ. Корпорация Майкрософт предоставляет примеры программирования только для иллюстрации, не выполняя либо подразумеваемых. Сюда относится, но не ограничивается подразумеваемым гарантийным обязательством о товаре или пригодности для определенной цели. В этой статье предполагается, что вы знакомы с языком программирования, который вы продемонстрировали, и с инструментами, используемыми для создания и отладки процедур. Специалисты службы поддержки Майкрософт могут объяснить особенности конкретных процедур. Однако они не изменяют эти примеры для предоставления дополнительной функциональности или создания процедур, отвечающих вашим конкретным требованиям.

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

Запустите Excel и откройте новую книгу.

Нажмите клавиши ALT + F11, чтобы запустить редактор Visual Basic.

В меню Вставка выберите пункт модуль.

Введите пример кода макроса на лист модуля.

Нажмите клавиши ALT + F11, чтобы вернуться в Excel.

В Microsoft Office Excel 2003 и более ранних версиях Excel в меню Сервис выберите пункт макрос , а затем — макросы.

В Microsoft Office Excel 2007 в группе код на вкладке разработчик нажмите кнопку макросы .

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

помощью. Нажмите кнопку Microsoft Office , а затем — Параметры Excel.

байт. В категории популярные в разделе Основные параметры работы с Excelвыберите пункт Показать
. Флажок «Разработчик» на ленте и нажмите кнопку ОК.

Выберите нужный макрос и нажмите кнопку выполнить.

Свойство Saved возвращает значение false , если после последнего сохранения книги были внесены изменения.

Для указания макроса, который должен выполняться при закрытии книги, можно использовать зарезервированное имя подпрограммы Auto_Close . Таким образом, вы можете управлять обработкой документа, когда пользователь закрывает документы в Excel.

Пример 1: Закрытие книги без сохранения изменений

Чтобы принудительно закрыть книгу, не сохраняя никаких изменений, введите следующий код в модуль Visual Basic этой книги:

ДоЧерний элемент Auto_Close ()

ThisWorkbook. Save = true

Если для свойства Saved установлено значение true, приложение Excel отправляет сообщение о том, что книга уже была сохранена, и после последнего сохранения изменения не произошел.

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

Application. Дисплайалертс = false

Application. Дисплайалертс = true

Кроме того, можно использовать аргумент SaveChanges метода Close .

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

Пример 2: Закрытие книги и сохранение изменений

Чтобы принудительно сохранить изменения в книге, введите следующий код в модуль Visual Basic этой книги:

ДоЧерний элемент Auto_Close ()

Если ThisWorkbook. Save = false, то

ThisWorkbook. Save End, если

Эта подпроцедура проверяет, было ли для сохраненного свойства File задано значение false. Если да, то книга была изменена с момента последнего сохранения, и эти изменения будут сохранены.

Закрыть без сохранения

1) Хотелось бы узнать, как сделать так, чтобы при закрытии файла Excel программа не спрашивала пользователя «Сохранить изменения?», а сразу закрывала файл без сохранения?

2) Ещё было бы хорошо, чтобы пользователь при сохранении текущего файла не мог сохранить его под этим именем, а только под другим.

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

14 ответов

[QUOTE]Originally posted by Sergan
1) Хотелось бы узнать, как сделать так, чтобы при закрытии файла Excel программа не спрашивала пользователя «Сохранить изменения?», а сразу закрывала файл без сохранения?

Я поместил команду ActiveWorkbook.Close savechanges:=False в процедуру Workbook_BeforeClose. Теперь при закрытии файла программа не спрашивает «Сохранить изменения?» и закрывает без сохранения.
А как быть со вторым вопросом?

попробуй вот так. может получится

ActiveWorkbook.SaveAs Filename:=»Имя.xls»
ActiveWorkbook.Close savechanges:=True

Originally posted by Dimitry

попробуй вот так. может получится

ActiveWorkbook.SaveAs Filename:=»Имя.xls»
ActiveWorkbook.Close savechanges:=True

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

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

Читать еще:  Excel найти текст в диапазоне ячеек

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

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

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

Тогда надо залезть в обработчик события Workbook_BeforeSave этой книги:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

SaveAsUi — True if the Save As dialog box will be displayed — наверное то что тебе нужно.

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

Тогда надо залезть в обработчик события Workbook_BeforeSave этой книги:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

SaveAsUi — True if the Save As dialog box will be displayed — наверное то что тебе нужно.

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

тогда файл не сохраняется.

Самое смешное, что написав в обработчике событий выше приведенную команду я и сам теперь этот файл не могу сохранить, то есть не могу сохранить этот код ( Cancel=True )
Поэтому ничего не получается. Как быть?

Самое смешное, что написав в обработчике событий выше приведенную команду я и сам теперь этот файл не могу сохранить, то есть не могу сохранить этот код ( Cancel=True )
Поэтому ничего не получается. Как быть?

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

Смешно получилось, вот так дашь совет 🙂

Ну пока можно в конце Cancel=False приписать, который все разрешит. Ну пока код не отработан, можно его еще тестить, а сохранять уже в самом конце.

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

Думаю логика должна быть такая (сходу, не проверяя, убегать уже пора 🙂 )

1. Показываем диалог выбора сохранения файла (простой диалог, который возвращает токо имя и ничего больше не делает): Application.GetSaveAsFilename

2. Проверяем путь, если совпадает с текущим файлом — ругаемся на пользователя, куда-нибудь его посылаем или тихо игнорируем и ставим Cancel=True. Если путь не совпадает, то Cancel=False.

Originally posted by SergeySV
.
Думаю логика должна быть такая

1. Показываем диалог выбора сохранения файла (простой диалог, который возвращает токо имя и ничего больше не делает): Application.GetSaveAsFilename

2. Проверяем путь, если совпадает с текущим файлом — ругаемся на пользователя, куда-нибудь его посылаем или тихо игнорируем и ставим Cancel=True. Если путь не совпадает, то Cancel=False.

Вообщем сделал я следующее:
[COLOR=blue]
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim name, fName As String
name = «имя_файла.xls»
MsgBox «Рекомендуется сохранить файл под именем » + name, , «Внимание!»
ChDir ActiveWorkbook.Path
fName = Application.GetSaveAsFilename(InitialFileName:=name)
[color=green]’Если выбранное имя совпадает с именем текущего файла[/color]
If fName = ActiveWorkbook.FullName Then
[color=green]’Ругаемя на пользователя[/color]
MsgBox «Сохранение файла под текущим именем ЗАПРЕЩЕНО! Сохраниет файл под другим именем!», , «Внимание!»
Cancel = True [color=green]’отключаем сохранение[/color]
Else
[color=green]’иначе сохранение возможно[/color]
Cancel = False
[color=black]ПОСЛЕ ЭТОГО ФАЙЛ СОХРАНЯЕТСЯ ПОД ТЕКУЩИМ ИМЕНЕМ, А НЕ ПОД ТЕМ, КОТОРЫЙ ВЫБРАЛ ПОЛЬЗОВАТЕЛЬ. ВО КАК. ЧТО НУЖНО СДЕЛАТЬ, КАКОМУ ПАРАМЕТРУ ПРИСВОИТЬ ВЫБРАННОЕ ПОЛЬЗОВАТЕЛЕМ ИМЯ, ЧТОБЫ СОХРАНЕНИЕ ПРОИЗОШЛО КАК НАДО . [/color]
End If
End Sub
[/COLOR]
Ещё обнаружил, что при вызове команды «Сохранить как» открывается стандартное окно сохранения, даже
[COLOR=blue]SaveAsUI = False[/COLOR]
не помогает. Вот блин, никак не могу как следует извратиться. Можно конечно просто запретить любое сохранение и всё.
Что посоветуете?

Хм, прикольная получилась задачка, я раз десять подвесил свой Excel, прежде чем во всем разобрался и отладил код 🙂

Сразу поясню насчет параметра SaveAsUI, чтоб он больше нам не мешал — эта переменная в событии _BeforeSave всего лишь показывает как пользователь пытается сохранить файл: серез СОХРАНИТЬ или через СОХРАНИТЬ КАК, и все. Это для информации, соотв. присвоение этой переменной какого своего значение внутри события _BeforeSave не имеет никакого смысла. Тебе Excel эту переменную передал в качестве информации, по ByVal к тому же и то что ей что то еще пытаешься присвоить, на это Excel уже никакого внимание обращать не будет.

Читать еще:  Мин в excel

Теперь на счет твоих проблем с SaveAs внутри события _BeforeSave.
Тут складывается действительно забавная ситуация. Дело в том, что вызывая метод в SaveAs в этом событии мы порождаем опять же это событие, поэтому очень важно предусмотреть возможность выхода из него, не допустив зацикливания.
Происходит все следующим образом:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

строка1
ThisWorkbook.SaveAs «c:3.xls» ‘ строка2
строка3
End Sub

Мы нажимаем кнопку Сохранить в Excel’е.
попадаем в событие _BeforeSave на строчку1.
Переходим к строчке2 — ThisWorkbook.SaveAs «c:3.xls», которая порождает ВТОРОЕ событие _BeforeSave.
Поэтому со строчки2 мы вновь попадаем на строчку1.
Визуально это можно представить себе так, как если разместить рядом два одниковых куска кода процедуры Private Sub Workbook_BeforeSave и нарисовать стрелку перехода со строчки2 первого куска на второй кусок Private Sub Workbook_BeforeSave.

Эта аналогия будет полной еще в том смысле, что Excel отработает весь второй кусок и потом, ВНИМАНИЕ: вернуться в первый кусок на след. строчку после той, с которой его грубо прервали вызвав SaveAs (т.е. в нашем примере на строчку3)

Т.е. выполнение кода по строчка будет следующее:
строчка1 (_BeforeSave1)
строчка2 (тут мы вызываем еще одно _BeforeSave)
строчка1 (_BeforeSave2)
‘строчка2(_BeforeSave2)
строчка3 (_BeforeSave2)
строчка3 (вернeлись в первый _BeforeSave)

Хорошо видно что если не поставить какое-нибудь доп. условие на строчку2 (.SaveAs), то оно будет каждый раз порождает очередные _BeforeSave и мы так зациклимся.

Поэтому если внутри события _BeforeSave надо сохранить файл под другим названием, то бцдет например такой:

Dim lEvent As Long
Dim bolEx As Boolean

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

If lEvent = 0 Then
lEvent = 1
ThisWorkbook.SaveAs «c:3.xls»
ElseIf lEvent = 1 Then
lEvent = 0
bolEx = True
End If

If lEvent = 0 And bolEx Then
bolEx = False
Cancel = False
Else
Cancel = True
End If

Чтобы посмотреть как работает этот код можешь открыть приложенный файл поставить breakpoint на If lEvent = 0 Then в событии _BeforeSave и нажать кнопку сохранить и двигаясь по шагам (через F8 ) увидишь как для второго события устанавливается Cancel=False, а при возвращаении к первому Cancel становится равным =True (если этого не сделать, то получим зависание Excel’я, он будет пытаться сохранить файл, который мы уже сохранили под другим именем, у Excel крышу тогда снесет)

Vba excel закрыть книгу без сохранения

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

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

Сообщение добрый день, скажите как закрыть ексель (полностью выйти) с сохранением под таким же названием и без предупреждения
скажите что в этом коде не так((((

KSVДата: Суббота, 21.03.2015, 14:29 | Сообщение № 2

200?’200px’:»+(this.scrollHeight+5)+’px’);»> ‘ подавляет предупреждения Excel
Workbooks.Application.DisplayAlerts = False

‘ сохраняет книгу в файл С ДРУГИМ именем
Excel.ActiveWorkbook.SaveAs («rl.xlsm»)

‘ сохраняет книгу в файл С ТЕМ ЖЕ именем
Excel.ActiveWorkbook.Save

‘ закрывает книгу
Workbooks.Close

‘ закрыть с сохранением (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close True

‘ закрыть без сохранения (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close False

‘ закрыть Excel (закроется только если в этом же Application больше нет открытых и не сохраненных книг,
‘ иначе будет запрашивать подтверждения сохранения, при .DisplayAlerts = True)
Application.Quit

200?’200px’:»+(this.scrollHeight+5)+’px’);»> ‘ подавляет предупреждения Excel
Workbooks.Application.DisplayAlerts = False

‘ сохраняет книгу в файл С ДРУГИМ именем
Excel.ActiveWorkbook.SaveAs («rl.xlsm»)

‘ сохраняет книгу в файл С ТЕМ ЖЕ именем
Excel.ActiveWorkbook.Save

‘ закрывает книгу
Workbooks.Close

‘ закрыть с сохранением (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close True

‘ закрыть без сохранения (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close False

‘ закрыть Excel (закроется только если в этом же Application больше нет открытых и не сохраненных книг,
‘ иначе будет запрашивать подтверждения сохранения, при .DisplayAlerts = True)
Application.Quit

Сообщение все правильно

200?’200px’:»+(this.scrollHeight+5)+’px’);»> ‘ подавляет предупреждения Excel
Workbooks.Application.DisplayAlerts = False

‘ сохраняет книгу в файл С ДРУГИМ именем
Excel.ActiveWorkbook.SaveAs («rl.xlsm»)

‘ сохраняет книгу в файл С ТЕМ ЖЕ именем
Excel.ActiveWorkbook.Save

‘ закрывает книгу
Workbooks.Close

‘ закрыть с сохранением (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close True

‘ закрыть без сохранения (без запроса подтверждения пользователя, даже если .DisplayAlerts = True)
Workbooks.Close False

‘ закрыть Excel (закроется только если в этом же Application больше нет открытых и не сохраненных книг,
‘ иначе будет запрашивать подтверждения сохранения, при .DisplayAlerts = True)
Application.Quit

85Muslim85Дата: Суббота, 21.03.2015, 14:35 | Сообщение № 3

все отлично)) спасибки. вот чего я хотел)

Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Save
Application.Quit

все отлично)) спасибки. вот чего я хотел)

Workbooks.Application.DisplayAlerts = False
Excel.ActiveWorkbook.Save
Application.Quit 85Muslim85

Сообщение все отлично)) спасибки. вот чего я хотел)

Proper VBA code to close workbook without saving

Whenever the code is executed while multiple workbooks are open, office stops working with a message

Microsoft Office Excel has stopped working

Windows can try to recover your information and restart the program.

What’s wrong with the code? I’m using MS Office 2007 on Windows7

Создан 27 май. 16 2016-05-27 05:11:45 ZuriPow

This code would not compile. You have kept one sub within another sub.It should give you

Invalid outside procedure

. If you have two subs correct practice is to call one sub from the another. – skkakkar 27 май. 16 2016-05-27 05:15:53

Corrected the code.. I’m calling the close_without_saving sub in Workbook_BeforeClose – ZuriPow 27 май. 16 2016-05-27 05:21:28

What is the purpose of this routine? Do you want to close the workbook without incorporating changes. Then you can use code like this in workbook module

Sub Auto_Close() ThisWorkbook.Saved = True End Sub

I want to close this workbook with the close X button without saving changes while not affecting other opened worksheets. – ZuriPow 27 май. 16 2016-05-27 05:27:03

You can also use this for closing workbook without saving changes.

Sub CloseBook2() ActiveWorkbook.Close savechanges:=False End Sub

This routine can be attached to Close X Button. Workbook never closes partially, it will always close with all sheets contained in this workbook. – skkakkar 27 май. 16 2016-05-27 05:27:35

Wouldn’t the ‘DisplayAlerts = False’ prevent a popup when calling ‘Thisworkbook.Close()’ without arguments? Could this be the reason Excel is crashing? – Michael Z. 27 май. 16 2016-05-27 05:30:13

@Michael Z Yes this DisplayAlerts = False and subsequently True can be incorporated in the routine. That should not create a problem,

Sub CloseBook() Application.DisplayAlerts = False ActiveWorkbook.Close Application.DisplayAlerts = True End Sub

The proper way is as @skkakkar suggested by passing the argument into ‘Close()’ – Michael Z. 27 май. 16 2016-05-27 05:34:26

@skkakkar could you make that answer because it is the proper answer to this very common question? – Michael Z. 27 май. 16 2016-05-27 05:37:19

@skkakkar sub CloseBook2() solves the problem. Thanks. But I still don’t understand what’s wrong with the code I’m using. – ZuriPow 27 май. 16 2016-05-27 05:39:48

I don’t know for sure, but maybe the DisplayAlerts = False caused an Excel issue when you tried to close a workbook while others were still open. That’s why you should skip the DisplayAlerts — False and do it the proper way. – Michael Z. 27 май. 16 2016-05-27 05:41:37

If you changed your code to close the workbook instead of quitting the app when it’s the only workbook would it crash Excel or would it leave you with an empty Excel instance? If it does not crash then it might point back to what I just said about blocking the alert when more than 1 book is open. – Michael Z. 27 май. 16 2016-05-27 05:45:21

Regarding your code I shall look into and try to analyse in detail what is at fault for your and my learning. – skkakkar 27 май. 16 2016-05-27 05:47:57

@skkakkar I’m glad you are because I am curious now. The code looks like it should work fine and it might even be an isolated issue. Repairing/Re-installing Excel might correct the issue. – Michael Z. 27 май. 16 2016-05-27 05:53:11

@ZuriPow This code worked as expected with Excel 2016 on WIndows 10. I don’t have Windows 7 or Excel 2007. You should test your code on other machines too. – Michael Z. 27 май. 16 2016-05-27 06:01:13

Your corrected program works fine on my Excel 2016 – skkakkar 27 май. 16 2016-05-27 06:12:50

Maybe then its just in my machine. I will repair install and check again – ZuriPow 27 май. 16 2016-05-27 08:36:14

1 ответ

If you want to close the workbook without incorporating changes. Then you can use code like this in workbook module

You can also use this for closing workbook without saving changes.

This routine can be attached to Close X Button. Workbook never closes partially, it will always close with all sheets contained in this workbook. DisplayAlerts = False and subsequently True can be incorporated in the routine. That should not create a problem like

Создан 27 май. 16 2016-05-27 05:45:36 skkakkar

@MichaelZ ZuriPow program works fine on my Excel 2016 – skkakkar 27 май. 16 2016-05-27 06:12:05

Yep mine too. It seems like the issue is specific to the machine and it should be tested on other Windows 7 machines running excel 2007. – Michael Z. 27 май. 16 2016-05-27 07:02:01

Ссылка на основную публикацию
Adblock
detector