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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 12.05.2008, 16:54   #1
Dorvir
Пользователь
 
Аватар для Dorvir
 
Регистрация: 06.02.2008
Сообщений: 42
По умолчанию Отображать лист по user name или паролю

Народ, ниже представлен макрос который отображает лист если пользователь "я", а если пользователь не "я" то лист все таки можно отобразить через Формат\Лист\отобразить... нужно ввести пароль и лист будет виден...

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


Что там не так в этом коде... подскажите пожалуйста что я делаю не так..? как остановить цикличность...?

Если я ставлю проверку в начало кода:

if Application.ThisWorkbook.Worksheets ("Delete").Visible = True then
exit Sub

То скрытый лист открывается без пароля...




Private Sub Worksheet_Activate()

Dim User As String
Dim Password As String


User = Application.UserName

If User = "Наталия" Then

Application.ThisWorkbook.Worksheets ("Delete").Activate

Else
Application.ThisWorkbook.Worksheets ("Delete").Visible = False
Password = InputBox("Введите пароль на открытие листа", "Проверка")

If Password = 123 Then

Application.ThisWorkbook.Worksheets ("Delete").Visible = True
Application.ThisWorkbook.Worksheets ("Delete").Activate = True

Exit Sub

Else
Application.ThisWorkbook.Worksheets ("Delete").Visible = False
Exit Sub

End If

End If

End Sub
Dorvir вне форума
Старый 12.05.2008, 18:00   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Все правильно.
Это кусок кода будет срабатывать, каждый раз когда фокус переносится с любого листа на лист "Delete".

Чтобы этого не происходило предлагаю перекинуть его в auto_open. Запрос на пароль появиться только 1 раз, при открытии файла (или не появится ваще если пользователь "Наталия"). Только аккуратно там с выходами. Или всю эту проверку расположить в самом конце процедуры auto_open, а обьявления, понятно, в начале.

имеющуюся процедуру Private Sub Worksheet_Activate() - закомментировать для начала, а потом и удалить совсем.

Цитата:
Если я ставлю проверку в начало кода:
if Application.ThisWorkbook.Worksheets ("Delete").Visi ble = True then
exit Sub
То скрытый лист открывается без пароля...
Проверка состояния листа (видимый/невидимый) никак не сказывается на самом состоянии листа, тут написано "если лист видимый - выходим из этой процедуры" т.е. дальше ничего не делаем.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 12.05.2008, 19:44   #3
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Лампочка ТщательнЕй надо, ребята (с)

В том смысле, что тщательнЕй надо читать хэлп на Visible.
Константа xlSheetVeryHidden придумана именно для того, чтобы нельзя было открыть лист вручную и даже увидеть его в юзерском списке листов.

По коду:
- Отрабатывает один раз при открытии книги.
- Помещается, естественно, в модуль "ЭтаКнига".
- Требует пароль только от определённого пользователя. Всяким прочим незачем знать, что здесь что-то скрыто.
- Worksheets на всякий случай заменено на Sheets. Диаграммы там всякие...
- Активация, вообще говоря, к секретности отношения не имеет и взята из кода Dorvir.
Код:
Private Sub Workbook_Open()
    Const VIP = "Наталия"
    Const SECRET_SHEET = "Delete"
    Const PSW = "123" '"Password" is reserved keyword
    Const IB_PROMPT = "Введите пароль на открытие листа"
    Const IB_TTL = "Проверка"

    Dim sv As XlSheetVisibility

    sv = xlSheetVeryHidden
    If Application.UserName = VIP Then If InputBox(IB_PROMPT, IB_TTL) = PSW Then sv = xlSheetVisible
    With ThisWorkbook.Sheets(SECRET_SHEET)
        .Visible = sv
        If sv = xlSheetVisible Then .Activate
    End With
End Sub

Последний раз редактировалось дмидми; 12.05.2008 в 20:06. Причина: Куда ставить-то?! (с)
дмидми вне форума
Старый 13.05.2008, 06:28   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Господа! По-моему, этого мало. Нужно по событию Workbook_BeforeClose(Cancel As Boolean) добавить скрытие нужного листа Sheets(x)=xlVeryHidden. Иначе, нежелательный пользователь может удерживая при открытии клавишу Shift открыть файл, предотвратив выполнение макроса по событию Workbook_Open(),
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 13.05.2008, 08:25   #5
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Подмигивание Как страшно жить!

Цитата:
Сообщение от SAS888 Посмотреть сообщение
По-моему, этого мало.
Конечно, мало. И сколько ни добавляй - всё будет мало Ведь один шпиён умеет давить на Shift; другой умеет запускать VBE - а в окне Project Explorer'а даже "очень-очень хидден" листы сразу видны, а уж написать программку из одной строки Лист1.Hidden=false (и никакого пароля не надо) каждый дурак сумеет; третий ва-аще хакером окажется, да и криптологом к тому же; etc. etc.

Как всегда, приходится решать: стОит ли овчинка выделки? С какого момента затраты на секретность станут больше стоимости секрета?
дмидми вне форума
Старый 13.05.2008, 11:36   #6
Dorvir
Пользователь
 
Аватар для Dorvir
 
Регистрация: 06.02.2008
Сообщений: 42
По умолчанию

Спасибо Всем Огромное!

Мне очень понравилось - xlSheetVeryHidden я знаю о такой возможности, но не знала как такое написать в коде.)))

Cобытие Workbook_BeforeClose у меня в файле есть))))

Секретность от "шпионов" особо не нужна, прото хотелось чтобы эксель сам скрывал и открывал лист, а не делать это каждый раз вручную))))

Спасибо Всем еще раз!
Dorvir вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отображать в своей программе файлы *.gif с анимацией? SalasAndriy Общие вопросы C/C++ 1 02.11.2007 12:17
User list RKS Работа с сетью в Delphi 8 10.09.2007 13:42