Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2012, 09:09   #1
Snekich
Форумчанин
 
Аватар для Snekich
 
Регистрация: 19.11.2011
Сообщений: 128
По умолчанию Сохранение при закрытии файла.

Ситуация такая:
Есть файл с какими-то данными и макросами.
Если файл открыть и просмотреть/изменить/запустить макрос то в файле естественно будут какие-нибудь изменения.
Как сделать так ,что бы производилось сохранение файла при его закрытии, даже если не нажал кнопку "сохранить"?

Грубо говоря:
[Если] попытка закрыть файл [то] сохранить, а только потом закрыть файл.
Нет ничего невозможного, главное верить в это.
Snekich вне форума Ответить с цитированием
Старый 06.02.2012, 09:46   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Поместите этот код в модуль ЭтаКнига:

Код:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.Save ' принудительное сохранение перед закрытием
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 06.02.2012, 12:06   #3
Snekich
Форумчанин
 
Аватар для Snekich
 
Регистрация: 19.11.2011
Сообщений: 128
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Поместите этот код в модуль ЭтаКнига:

Код:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.Save ' принудительное сохранение перед закрытием
End Sub
Спасибо.
Теперь столкнулся с такой дилемой...
Что бы такого придумать, что бы пользователь файла не мог его просматривать/редактировать если не включит макросы при запуске файла?

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

А как сделать, что бы макрос автоматически запускался когда разрешаешь макросы при запуске файла?
И как сделать что бы при закрытии файла автоматически запускался макрос вновь скрывающий страницы?
Вложения
Тип файла: rar файл с принудительным сохранением.rar (8.0 Кб, 25 просмотров)
Нет ничего невозможного, главное верить в это.

Последний раз редактировалось Snekich; 06.02.2012 в 12:28.
Snekich вне форума Ответить с цитированием
Старый 06.02.2012, 12:21   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Private Sub Workbook_Open() ' этот код сработает при запуске книги
   
    ' отображение листов
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean) ' этот код сработает при закрытии книги
    
    ThisWorkbook.Save
    ' скрытие листов
End Sub
Примеры того, что вы хотите, есть на форумах
(такой вопрос часто поднимается)
EducatedFool вне форума Ответить с цитированием
Старый 06.02.2012, 12:25   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Только сначала скрытие листов, а потом ThisWorkbook.Save
Нужные листы надо делать .Visible=xlsheetveryhidden, а видимым делать лист с надписью типа "Включите макросы!".
При открытии книги. соотв., этот лист прятать, а нужные делать .Visible=xlsheetvisible.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 06.02.2012, 12:26   #6
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Только сначала скрытие листов, а потом ThisWorkbook.Save
Нужные листы надо делать .Visible=xlsheetveryhidden, а видимым делать лист с надписью типа "Включите макросы!".
При открытии книги. соотв., этот лист прятать, а нужные делать .Visible=xlsheetvisible.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 06.02.2012, 12:31   #7
Snekich
Форумчанин
 
Аватар для Snekich
 
Регистрация: 19.11.2011
Сообщений: 128
По умолчанию

Блин, вот я тупил то сколько времени.
Я не знал что "название макроса" как то влияет на его работу.
Workbook_Open - для меня раньше это было только название и не более того.

Спасибо ,все получилось как надо.
Нет ничего невозможного, главное верить в это.

Последний раз редактировалось Snekich; 06.02.2012 в 12:41.
Snekich вне форума Ответить с цитированием
Старый 06.02.2012, 13:56   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

off
"Пока придумал только такой вариант" - вспомнилась последняя TopGear про новый джип от Maserati - ребята, всё уже придумано! Такие джипы есть уже и у BMV, и у Porsche
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 06.02.2012 в 14:03.
Hugo121 вне форума Ответить с цитированием
Старый 06.02.2012, 15:19   #9
Snekich
Форумчанин
 
Аватар для Snekich
 
Регистрация: 19.11.2011
Сообщений: 128
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
off
"Пока придумал только такой вариант" - вспомнилась последняя TopGear про новый джип от Maserati - ребята, всё уже придумано! Такие джипы есть уже и у BMV, и у Porsche
Ну может быть и я изобрел велосипед, но зато я это сделал сам

Решил немного модернизоровать макрос и вышла ошибка.
Вот так работает:

Цитата:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheets(1).Visible = True
Sheets(2).Visible = 2
Sheets(3).Visible = 2
ThisWorkbook.Save
End Sub

Private Sub Workbook_Open()
Sheets(2).Visible = True
Sheets(3).Visible = True
Sheets(1).Visible = 2
End Sub
А вот так ошибка:

Цитата:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheets(1).Visible = True
Sheets.Count = n
for i = 2 to n
Sheets(i).Visible = 2
next i
ThisWorkbook.Save
End Sub

Private Sub Workbook_Open()
Sheets.Count = n
for i = 2 to n
Sheets(i).Visible = True
next i
Sheets(1).Visible = 2
End Sub
Где я ошибся?
Нет ничего невозможного, главное верить в это.
Snekich вне форума Ответить с цитированием
Старый 06.02.2012, 15:29   #10
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Вместо

Sheets.Count = n
for i = 2 to n

надо

n = Sheets.Count
for i = 2 to n

или просто

for i = 2 to Sheets.Count
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сохранение/считывание данных при закрытии/открытии программы Ирида C++ Builder 3 21.10.2011 13:48
Сохранение/загрузка значений тексбокс при закрытии/открытии формы SaNeKBF C# (си шарп) 7 20.05.2011 22:42
Создание HTML Файла при закрытии самого Excel DaMadQuest Microsoft Office Excel 8 06.06.2010 20:41
сохранение файла при закрытии robotov Microsoft Office Excel 23 18.09.2009 10:40
Сохранение копии книги при ее закрытии. Busine2009 Microsoft Office Excel 17 17.06.2009 04:36