Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Как организовать разграничение доступа в xl?


Автор: kashemirny 19.8.2009, 16:47
Доброго времени суток! Подскажите, существует ли короткий код VBA, позволяющий открывать документ в режиме "только для чтения" (без возможности сохранения файла), но одновременно с тем позволяющий при активации кнопки и последующем вводе пароля открывать документ для полный доступ?

пока что идеи такие:

Код

Sheets("Лист1").Protect "pass"
Sheets("Лист2").Protect "pass"
Sheets("Лист3").Protect "pass"
' и т.д.


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

Автор: Akina 19.8.2009, 19:24
Цитата(kashemirny @  19.8.2009,  17:47 Найти цитируемый пост)
открывать документ в режиме "только для чтения" (без возможности сохранения файла)

Но с возможностью редактирования? Ну разве только перехватом запроса на сохранение...
А нахрена?

Автор: kashemirny 19.8.2009, 19:34
Akina, чтение - оно и есть чтение. пример: меня нет на работе, а срочно требуется распечатать готовую смету - документ xl открывает тот, кому нужна эта самая смета, при этом не имеет возможности ее откорректировать или сохранить. лица, ответственные за сметы, знают pass (я и мой напарник) и работают с документом как обычно (сохраняют, редактируют и т.д.)

p.s. что за перехват и как его сделать?

Автор: Akina 19.8.2009, 19:55
Защита книги и каждого листа от изменения - вполне достаточно.
Сервис - Защита

Автор: kashemirny 19.8.2009, 23:04
Akina, это вам достаточно, а мне - отнюдь. если речь идет речь об ответственности за правильность расчетов, нужно предусмотреть любое "варварство" со стороны юзеров. 

p.s. как записать в файл xl служебную информацию, такую как юзер_домена, имя_машины)?

Автор: Akina 20.8.2009, 08:07
Цитата(kashemirny @  20.8.2009,  00:04 Найти цитируемый пост)
если речь идет речь об ответственности за правильность расчетов, нужно предусмотреть любое "варварство" со стороны юзеров. 

Если книга защищена - юзеру будет трудно придумать "варварство" иное, нежели удаление.
Посмотри книгу в аттаче. Оба листа защищены (пароль любого из листов - 666), в одном запрещено всё, даже выделение ячеек. Книга также защищена (пароль пустой). Попробуй её испоганить, не вводя пароля...

Автор: kashemirny 20.8.2009, 14:50
интересно.... а каким образом организовано все это? макроса в книге не нашел  smile 

Автор: Akina 20.8.2009, 15:02
Читай мои ответы с самого начала. Медленно и вслух.

Автор: kashemirny 20.8.2009, 16:27
прочитал, все уяснил, НО: каждый лист открывать паролем очень долго.
хочется простоты и эффективности. в аттаче пример с элементом интерфейса. пример не проработан по 3м пунктам, хочется вот чего:

- при нажатии на кнопку "Хочу полный доступ" должен выполняться не макрос Full, а popup-окно с предложением ввести пароль, при правильном вводе пароля должен сработать макрос Full, при неправильном - выход из приложения

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

- при открытии файла кнопкой "для чтения" файл ни в коем случае нельзя дать сохранить!

помогите, плиз  smile 

Автор: kashemirny 24.8.2009, 12:59
Akina, памагитя!  smile 

Автор: Akina 24.8.2009, 13:59
Цитата(kashemirny @  20.8.2009,  17:27 Найти цитируемый пост)
 popup-окно с предложением ввести пароль

popup-окно - это inputbox(). А лучше - самописное окно.

Всё необходимое для реализации у тебя есть. Чего нет - получи с помощью макрорекордера.

Автор: FINANSIST 30.8.2009, 21:01
kashemirny, в объект "Эта книга" вставляешь следующий код:
Код

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim wsheet As Worksheet
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.ScreenUpdating = False
On Error GoTo 30
'==============================================
For Each wsheet In ActiveWorkbook.Sheets
If wsheet.Visible = False Then GoTo 10
Debug.Print wsheet.Name
wsheet.Protect "123"
10: Next wsheet
20:
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Sub
30: MsgBox Err.Description
GoTo 20
End Sub

На лист кидаешь кнопку  CommandButtonUnprotect и в объект данного листа вставляешь процедуру обработки события нажатия на данную кнопку:
Код

Private Sub CommandButtonUnprotect_Click()
Dim str As String: Dim wsheet As Worksheet
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.ScreenUpdating = False
On Error GoTo 30
'==============================================
Let str = InputBox("input pass")
For Each wsheet In ActiveWorkbook.Sheets
If wsheet.Visible = False Then GoTo 10
Debug.Print wsheet.Name
wsheet.Unprotect str
10: Next wsheet
20:
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Sub
30: MsgBox Err.Description
GoTo 20
End Sub

Автор: kashemirny 1.9.2009, 12:22
FINANSIST, большое спасибо, только я уже организовал запуск макроса через комбинацию клавиш в персонале (кстати, присваивать макросы можно только в комбинации с контролом или можно назначить что-нибудь из F5-F12?). запуск через комбинацию клавиш - все же быстрее ввода пароля, да и безопаснее.

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

Автор: Akina 1.9.2009, 14:23
Цитата(kashemirny @  1.9.2009,  13:22 Найти цитируемый пост)
наделяет книгу отсутствием необходимости 

 smile 

Автор: kashemirny 8.9.2009, 17:42
код после небольшой доработки - события обрабатываются при сохранении, а не при закрытии:
Код

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim wsheet As Worksheet
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.ScreenUpdating = False
On Error GoTo 30
'==============================================
For Each wsheet In ActiveWorkbook.Sheets
If wsheet.Visible = False Then GoTo 10
Debug.Print wsheet.Name
wsheet.Protect "pass"
wsheet.Visible = xlVeryHidden
10:
Sheets("Заставка").Visible = True
Next wsheet
20:
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Sub
30: MsgBox "Да вы спите на ходу?!"
'30: MsgBox Err.Description
GoTo 20
End Sub


еще раз - огромное спасибо, FINANSIST

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)