powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Перехват диалогового окна о сохранении файла
25 сообщений из 25, страница 1 из 1
Перехват диалогового окна о сохранении файла
    #37038670
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. В моей программе возникла сложность - результат непосредственно зависит от того сохраняет пользователь файл или нет. Можно ли перехватить это диалоговое окошко? Или вовсе отключить и прописать свое. Но тогда возникает вопрос как корректно сделать кнопку "отмена", чтобы программа не закрывалась.
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37038875
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3BEPOBOY,

у книги есть событие
Код: plaintext
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37038906
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите за глупый вопрос, а как мне ее использовать применительно к моему случаю?
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37038910
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3BEPOBOY,

я думаю примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
x = MsgBox("Сохранить изменения в файле '" & ThisWorkbook.Name & "'?", vbYesNoCancel, "Microsof Office Excel")
If x = vbYes Then ActiveWorkbook.Save
If x = vbCancel Then Cancel = True
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
x = MsgBox("Сохранить изменения в файле '" & ThisWorkbook.Name & "'?", vbYesNoCancel, "Microsof Office Excel")
If x = vbYes Then Else Cancel = True
End Sub
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37038934
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,

спасибо, понятнее стало.
А чем принципиально отличается от этого напримеря(тренировался)
авторPrivate Sub Auto_Close()
perexvat

End Sub

Private Sub perexvat()

Dim XL1 As Workbook

Set XL1 = ActiveWorkbook
Dim Sheet1 As Excel.Worksheet
Set Sheet1 = XL1.Worksheets(1)

Dim nResult As Integer
nResult = MsgBox("сохранить изменения в книге", vbYesNoCancel, "Окно сообщения")
'MsgBox (CStr(nResult)) 6да 7нет 2отм

If nResult = 6 Then
XL1.Save
XL1.Close
Else
XL1.Close
Application.ActiveWorkbook.Close 0
Application.Quit
End If

End Sub

в какой момент запускается ваш вариант и как на false отреагирует. У меня с английским не очень, в справку я не въехал(
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37038968
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3BEPOBOY,

Private Sub Workbook_BeforeClose(Cancel As Boolean) (описание по ссылке)

Workbook - рабочая книга
Before - перед
Close - закрыть (в контексте закрытие)

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

Workbook - рабочая книга
Before - перед
Save - сохранить

отличие от Вашего кода хотя бы в том, что мне неизвестно событие AutoClose
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37038995
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,
воркбук бифо и клоз я уж перевожу)))

ладно спасибо, сейчас попробую разобраться, надеюсь мне это поможет.
отпишу попозже что получилось
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37039082
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то у меня вообще не срабатывает
даже
Код: plaintext
1.
2.
3.
4.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    MsgBox "Сечас будет произведено сохранение документа"
    Cancel = True    ' отменяем действие
End Sub
на чисстом документе. Вставлял и в модуль листа и в общий...
Может что подключить нужно или я просто не понимаю чего-то
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37039133
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3BEPOBOY,

1. в модуль книги надо
2. Проверьте макросы
3. нажмите сохранить
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37039279
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,
да, в книге все заработало.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
x = MsgBox("Сохранить изменения в файле '" & ThisWorkbook.Name & "'?", vbYesNoCancel, "Microsof Office Excel")
If x = vbYes Then ActiveWorkbook.Save
If x = vbCancel Then Cancel = True
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
x = MsgBox("Сохранить изменения в файле '" & ThisWorkbook.Name & "'?", vbYesNoCancel, "Microsof Office Excel")
If x = vbYes Then Else Cancel = True
End Sub

ваш код работает одинакого что 1ый и 2ой по отдельности, что оба вместе. Чудеса)
Впринципе почти подходит, только если нажать "нет" вылазет родной офисовский "сохранить изменения?".
Можно отркбить его как-то?
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37039302
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все правильно, и должны одинакого работать :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
x = MsgBox("Сохранить изменения в файле '" & ThisWorkbook.Name & "'?", vbYesNoCancel, "Microsof Office Excel")
If x = vbYes Then ActiveWorkbook.Save
If x = vbNo Then
Application.DisplayAlerts = False
ActiveWorkbook.Close
Application.Quit
End If
If x = vbCancel Then Cancel = True
End Sub

Написал кучу страшных слов около "нет", а все-равно не помогает от родной сохранялки избавиться(
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37039381
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
методом научного тыка определил, что в If даже не заходит
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim x As Integer
x = MsgBox("Сохранить изменения в файле '" & ThisWorkbook.Name & "'?", vbYesNoCancel, "Microsof Office Excel")

If x =  7  Then
MsgBox ("NO")
  ThisWorkbook.Saved = True
  Application.DisplayAlerts = False
  ActiveWindow.Close
  ActiveWorkbook.Close
  Application.Quit
Else
   If x =  6  Then
        MsgBox "YES"
        ActiveWorkbook.Save
      Else
        If x =  2  Then
            Cancel = True
            MsgBox "Cancel"
        End If
   End If
End If

End Sub
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37039393
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3BEPOBOY,

Application.DisplayAlerts=false
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37039405
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование Auto_Open и Auto_Close

Вы можете создать Auto_Open и Auto_Close процедуры в любом программном модуле книги MS Excel либо надстройки.
Процедура Auto_Open запустится, как только откроется файл, а Auto_Close - перед тем, как файл закроется. Эти процедуры очень полезны при выполнении задач установки или удаления, таких как создание своих панелей инструментов во время открытия файла и удаления их перед закрытием. Задачи такого типа находятся в модуле класса ThisWorkbook, используя события Workbook_Open и Before_Close. Однако используя Auto_Open и Auto_Close, Вы можете хранить все Ваши процедуры в одном модуле. Таким образом легче экспортировать код процедуры в другие проекты.

Public Sub Auto_Open()
MsgBox "Auto_Open procedure fired"
End Sub

Public Sub Auto_Close()
MsgBox "Auto_Close procedure fired"
End

Примечание: Работает также в предыдущих версиях Excel.

Взято тут .
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37039945
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShamanusApplication.DisplayAlerts=false
присутствует эта строка в моем коде. А что толку если в if не заходит?
в коде, который вы мне привели в качестве примера кстати тоже. Я не понемаю почему так...
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37040462
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался. Опять НЕ в книгу просто макрос отправил.
А как закрыть не только книгу, а вместе с оболочкой? после сохранения закрывается все, а без сохранения только книга...
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37040564
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3BEPOBOY,

application.quit
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37040709
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus,
Спасибо очередной раз. Но так делать нельзя, косяк.
Код: plaintext
1.
application.quit
закрывает все и без вопросов.
То есть если открыта еще одна книга, закроется также без сохранений. То есть наверное нужно смотреть смотреть есть ли еще открытые книги и в зависимости от этого выполнять разные команды закрытия. погуглю
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37040995
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wb As Workbook
Set wb = ActiveWorkbook
If wb.Saved Then
         Exit Sub
      Else
         msg = "Сохранить изменения в файле '" & wb.Name & "'?"
         Select Case MsgBox(msg, vbExclamation + vbYesNoCancel)
         Case vbYes
            wb.Save
            MsgBox "да"
         Case vbNo
            wb.Saved = True   'не сохраняя книгу, показывает приложению, что она сохранена!!!
            MsgBox "нет"
         Case vbCancel
            Cancel = True
            MsgBox "отмена"
         End Select
      End If
      
End Sub

Работает? но не совсем так как нужно. Когда открыто несколько книг, он пытается закрыть и другие. При этом спрашивает. Я жму "отмена", другие не закрываются, но вместе с ними не закрывается и нужная.
HELP!
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37040997
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3BEPOBOY,

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

а если бы в сформулировали вопрос корректно, например: авторМне нужно написать код, который в зависимости от ситуации закрывал бы или книгу, или сам Excel. Если есть другие незакрытые книги, то только эту книгу, а когда открытая книга последняя, то и сам Excel
то я бы написал код, а не команду
код я думаю примерно такой
Код: plaintext
1.
if Application.Workbooks.Count> 1  then   ActiveWorkbook.Close else  Application.Quit
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37041068
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3BEPOBOYРаботает? но не совсем так как нужно. Когда открыто несколько книг, он пытается закрыть и другие.
Вы вообще каким крестиком пользуетесь?
верхний закрывает приложение
нижний текущую книгу

Складывается впечатление, что Вы жмете именно верхний.
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37041661
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shamanus
Задавать грамотные вопросы тоже уметь нужно :)

я то понимаю что если нажать внутренний крестик, то все нормально будет, но те для кого пишется приложение с компьютером на ВЫ и им невдомек куда тыкать. Да и удобнее в большой что уж.
Кстати я опробовал просто книги без макросов, стандартная "сохранялка" работает точно также, как и моя. То есть закрывает все или ничего.
Об этом
Код: plaintext
if Application.Workbooks.Count> 1  then   ActiveWorkbook.Close else  Application.Quit
я кстати думал, но почему-то решил что считать кол-во открытых книг сложно... Завтра применю.

Только вот по пути домой меня мысль посетила. Если пользователь сделает изменения, затем нажмет на дискетку и сохранит файл, а при выходе уже ткнет "не сохранять" то мой макрос не сработает. То есть нужо еще контролировать сохранение походу работы с файлом это вот так проверяется?
Код: plaintext
 If wb.Saved
а если файл вообще не редактировался, то она по умолчанию тоже тру или Excel как-то по-другому хранит информацию о том делались изменеия или нет?
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37042044
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3BEPOBOY,

Вам надо составить полное техзадание и тогда проблему Вы решите. Тот уровень знаний, который у Вас теперь уже есть, должен быть достаточным для этого.
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37042113
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3BEPOBOYТолько вот по пути домой меня мысль посетила. Если пользователь сделает изменения, затем нажмет на дискетку и сохранит файл, а при выходе уже ткнет "не сохранять" то мой макрос не сработает. То есть нужо еще контролировать сохранение походу работы с файлом это вот так проверяется?
а если файл вообще не редактировался, то она по умолчанию тоже тру или Excel как-то по-другому хранит информацию о том делались изменеия или нет?

проверяется сохранена ли книга или нет, через это свойство. Но оно, как Вы заметили true если книга только открыта

Если Вам надо, чтобы полностью процессом сохранения управляли Вы, нужно перехватывать и отменять событие
Код: plaintext
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
но это обман пользователя. Это не есть хорошо.
...
Рейтинг: 0 / 0
Перехват диалогового окна о сохранении файла
    #37043857
3BEPOBOY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShamanusЕсли Вам надо, чтобы полностью процессом сохранения управляли Вы, нужно перехватывать и отменять событие
хм... я пробовал что-то сделать через beforsave , но смог только отключить кнопку сохранения...

Вообще немного поправив макрос используя
Код: plaintext
if Application.Workbooks.Count> 1  then   ActiveWorkbook.Close else  Application.Quit
я почти добился нужного результата.
"ПОЧТИ" заключается в том, что когда книг много и закрытие через крестик с сохранением/без проходит через
Код: plaintext
Workbook.Close
и есть поодозрения, что макрос увидев эту строчку заново запускает процедуру beforClose . Потому что кнопка ДаНетОтмена и все прочие прописанные под ней действия выполняются 2 раза. Пошагово пробежать не успел, НГ все карты попутал :)

P.S. Всех кто это читает
[описание функции, выдергивающей год из даты]
if yearFromDate=2010
msgbox "с наступающим!!!"
else msgbox "с новым годом!!!"
:)
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Перехват диалогового окна о сохранении файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]