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

у книги есть событие
Код: plaintext
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
...
Рейтинг: 0 / 0
28.12.2010, 13:21
    #37038906
3BEPOBOY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват диалогового окна о сохранении файла
Простите за глупый вопрос, а как мне ее использовать применительно к моему случаю?
...
Рейтинг: 0 / 0
28.12.2010, 13:22
    #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
28.12.2010, 13:36
    #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
28.12.2010, 13:46
    #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
28.12.2010, 13:58
    #37038995
3BEPOBOY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват диалогового окна о сохранении файла
Shamanus,
воркбук бифо и клоз я уж перевожу)))

ладно спасибо, сейчас попробую разобраться, надеюсь мне это поможет.
отпишу попозже что получилось
...
Рейтинг: 0 / 0
28.12.2010, 14:32
    #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
28.12.2010, 14:50
    #37039133
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват диалогового окна о сохранении файла
3BEPOBOY,

1. в модуль книги надо
2. Проверьте макросы
3. нажмите сохранить
...
Рейтинг: 0 / 0
28.12.2010, 15:53
    #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
28.12.2010, 16:00
    #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
28.12.2010, 16:33
    #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
28.12.2010, 16:39
    #37039393
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват диалогового окна о сохранении файла
3BEPOBOY,

Application.DisplayAlerts=false
...
Рейтинг: 0 / 0
28.12.2010, 16:44
    #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
28.12.2010, 22:00
    #37039945
3BEPOBOY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват диалогового окна о сохранении файла
ShamanusApplication.DisplayAlerts=false
присутствует эта строка в моем коде. А что толку если в if не заходит?
в коде, который вы мне привели в качестве примера кстати тоже. Я не понемаю почему так...
...
Рейтинг: 0 / 0
29.12.2010, 11:50
    #37040462
3BEPOBOY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват диалогового окна о сохранении файла
Разобрался. Опять НЕ в книгу просто макрос отправил.
А как закрыть не только книгу, а вместе с оболочкой? после сохранения закрывается все, а без сохранения только книга...
...
Рейтинг: 0 / 0
29.12.2010, 12:31
    #37040564
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват диалогового окна о сохранении файла
3BEPOBOY,

application.quit
...
Рейтинг: 0 / 0
29.12.2010, 13:27
    #37040709
3BEPOBOY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват диалогового окна о сохранении файла
Shamanus,
Спасибо очередной раз. Но так делать нельзя, косяк.
Код: plaintext
1.
application.quit
закрывает все и без вопросов.
То есть если открыта еще одна книга, закроется также без сохранений. То есть наверное нужно смотреть смотреть есть ли еще открытые книги и в зависимости от этого выполнять разные команды закрытия. погуглю
...
Рейтинг: 0 / 0
29.12.2010, 15:06
    #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
29.12.2010, 15:06
    #37040997
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват диалогового окна о сохранении файла
3BEPOBOY,

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

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

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

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

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

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

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

Если Вам надо, чтобы полностью процессом сохранения управляли Вы, нужно перехватывать и отменять событие
Код: plaintext
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
но это обман пользователя. Это не есть хорошо.
...
Рейтинг: 0 / 0
31.12.2010, 19:12
    #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
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Перехват диалогового окна о сохранении файла / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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