1

Тема: VBA: Запаролить листы в книге Excel

Существует ли способ запаролить отдельные листы без багов и глюков? Чтобы пользователь открыл файл xls, в выпадающем списке выбрал свой логин, ввёл пароль и получил доступ только к определённым листам.
В интернете находил один способ, но там сплошные костыли, то и дело вылетает предупреждение visual basic: End / Debug / Отмена.
Примечание: файл xls одним пользователям будет доступен только для чтения, другим с возможностью изменения.

2

Re: VBA: Запаролить листы в книге Excel

ypppu
Добрый вечер.
http://www.cyberforum.ru/vba/thread781094.html
https://www.excel-vba.ru/chto-umeet-exc … tdiapazon/

3

Re: VBA: Запаролить листы в книге Excel

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

По второй ссылке находится пример, который я и описывал в первом сообщении. Он, судя по всему, построен на костылях и подпорках. При выходе из программы скрипт пытается сохранить файл без моего ведома, что уже не очень то правильно. Но это полбеды, если его открывает человек, имеющий права только на чтение файла, вылезает ошибка visual basic: [End] / [Debug] / [Отмена], плюс дважды вылезает окно с предложением сохранить файл.

Эти нежелательные окна перестают вылезать, если удалить в скрипте строку ThisWorkbook.Save. Но тогда перестаёт работать то, ради чего всё делалось: пользователь начинает видеть все листы в книге, окно ввода пароля при этом можно просто игнорировать.

4

Re: VBA: Запаролить листы в книге Excel

ypppu, в общем и целом — нет такой возможности.

5

Re: VBA: Запаролить листы в книге Excel

Ясно, спасибо.

6 (изменено: misha_057, 2021-06-18 14:37:25)

Re: VBA: Запаролить листы в книге Excel

ypppu Есть такая возможность.

Post's attachments

Книга1.xlsm 17.34 kb, 6 downloads since 2021-06-18 

You don't have the permssions to download the attachments of this post.

7

Re: VBA: Запаролить листы в книге Excel

misha_057, ну, и? Я открыл файл, отказался от исполнения макросов и вижу оба листа. Нажал ALt-F11, посмотрел в код, снял парольную защиту.

8

Re: VBA: Запаролить листы в книге Excel

alexii
Что "ну и?" Адекватный пользователь откроет файл, а не начнет его ломать.
В вопросе не сказано о возможности видеть листы, а сказано - получить доступ.
Если нужна защита посильнее - листы можно скрыть при закрытии файла и активировать нужный при открытии. И макросы тоже можно запаролить. А от мамкиных хакеров в Екселе защиты нет.

9 (изменено: alexii, 2021-06-23 00:32:41)

Re: VBA: Запаролить листы в книге Excel

misha_057 пишет:

В вопросе не сказано о возможности видеть листы,

Как бы:

ypppu пишет:

Но тогда перестаёт работать то, ради чего всё делалось: пользователь начинает видеть все листы в книге

так.

misha_057 пишет:

Если нужна защита посильнее - листы можно скрыть при закрытии файла и активировать нужный при открытии. И макросы тоже можно запаролить. А от мамкиных хакеров в Екселе защиты нет.

Просто не надо хранить пароли в коде.

10 (изменено: misha_057, 2021-06-23 12:06:26)

Re: VBA: Запаролить листы в книге Excel

alexii пишет:

Просто не надо хранить пароли в коде.

Где предлагаете их хранить для книги Екселя? И чем плоха защита макроса паролем?

11

Re: VBA: Запаролить листы в книге Excel

misha_057, предлагаю нигде не хранить.

12 (изменено: alexii, 2021-06-23 23:44:26)

Re: VBA: Запаролить листы в книге Excel

Пожалуй, надо пояснить.

Во времена первых архиваторов под MS DOS был такой прародитель архиваторов PKARC (не тот, который тоже назывался PKARC, а позже стал PKZIP, а оригинальный). Так вот он нигде не хранил пароль от архива, а тупо использовал введённый пароль для расшифровки. Если пароль был неправильный — получалась белиберда.

Так же и здесь — просто заводим массив/словарь листов, перебираем листы, пробуем введённый пароль для снятия защиты, перехватываем ошибку времени исполнения при методе .UnProtect(). В массиве/словаре помечаем, для каких листов удалось снять защиту (и только для них же при закрытии книги выполняем .Protect()).

P.S. Сие тоже отнюдь не панацея — пользователь может сохранить Рабочую книгу (со снятой защитой), а затем тупо «снять» процесс excel.exe.

13

Re: VBA: Запаролить листы в книге Excel

alexii пишет:

заводим массив/словарь листов, перебираем листы, пробуем введённый пароль

Это для снятия защиты, что совсем не обязательно.  Пользователю можно открыть несколько ячеек для ввода, а лист держать под паролем.
Как таким методом отобразить скрытый лист, соответствующий паролю? Без хранения, наверное, никак.

alexii пишет:

Сие тоже отнюдь не панацея — пользователь может сохранить Рабочую книгу (со снятой защитой), а затем тупо «снять» процесс excel.exe.

Что же он сохранит со своим паролем, только свои раскрытые листы?

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

14

Re: VBA: Запаролить листы в книге Excel

misha_057 пишет:

Это для снятия защиты, что совсем не обязательно.  Пользователю можно открыть несколько ячеек для ввода, а лист держать под паролем.
Как таким методом отобразить скрытый лист, соответствующий паролю? Без хранения, наверное, никак.

Я же написал — как. К сожалению, сие не работает, поскольку ошибка при исполнении метода .Unprotect(), увы, не перехватывается:

+ открыть спойлер

https://i.imgur.com/jx0Korm.png