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
Дмитрий,по-моему,эти команды можно применить при выполнении какого-то макроса. Я же хочу, чтобы при нажатии пользователем кнопки или меню «Сохранить», программа предлагала сохранить этот файл под другим именем, а под этим не разрешала вообще.
Как это сделать?
Дмитрий,по-моему,эти команды можно применить при выполнении какого-то макроса. Я же хочу, чтобы при нажатии пользователем кнопки или меню «Сохранить», программа предлагала сохранить этот файл под другим именем, а под этим не разрешала вообще.
Как это сделать?
к сожалению я еще не достиг такого уровння.
и каким образом можно перенастроить стандартные кнопки и команды не знаю.
единственный вариант это создать свою кнопку с такой-же иконкой, а стандартную убрать , если получится
Дмитрий,по-моему,эти команды можно применить при выполнении какого-то макроса. Я же хочу, чтобы при нажатии пользователем кнопки или меню «Сохранить», программа предлагала сохранить этот файл под другим именем, а под этим не разрешала вообще.
Как это сделать?
У тебя какая-то нетривиальная задачка, ты хочешь отобрать у пользователя возможность сохранения файла под тем же названием?
Тогда надо залезть в обработчик события 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 уже никакого внимание обращать не будет.
Теперь на счет твоих проблем с 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 | ||||||
|