Файла пока нет, но выглядеть он будет так: Пустой лист с надписью "У Вас нет прав доступа"; Несколько "очень скрытых" листов (количество всегда разное) названных по User Name адресатов.
Цель макроса: При получении файла юзером, должен скрываться пустой лист и отображаться лист соответствующий User Namе. Если такого User Name в названиях листов нет - то ничего не происходит.
Спасибо.
Всем привет.
Файла пока нет, но выглядеть он будет так: Пустой лист с надписью "У Вас нет прав доступа"; Несколько "очень скрытых" листов (количество всегда разное) названных по User Name адресатов.
Цель макроса: При получении файла юзером, должен скрываться пустой лист и отображаться лист соответствующий User Namе. Если такого User Name в названиях листов нет - то ничего не происходит.
Здоров, Серега. предлагаю на пустом листе написать - "У Вас нет прав доступа либо отключены макросы" - была такая проблема... [vba]
Код
Private Sub Workbook_Open() Dim sh0 As Worksheet, shUser As Worksheet
Set sh0 = ActiveSheet 'узкое место - лучше указать на "пустого" поконкретней
On Error Resume Next Set shUser = Sheets(Environ("UserName")) If Err = 0 Then shUser.Visible = xlSheetVisible sh0.Visible = xlSheetVeryHidden End If On Error GoTo 0
End Sub
[/vba]
Здоров, Серега. предлагаю на пустом листе написать - "У Вас нет прав доступа либо отключены макросы" - была такая проблема... [vba]
Код
Private Sub Workbook_Open() Dim sh0 As Worksheet, shUser As Worksheet
Set sh0 = ActiveSheet 'узкое место - лучше указать на "пустого" поконкретней
On Error Resume Next Set shUser = Sheets(Environ("UserName")) If Err = 0 Then shUser.Visible = xlSheetVisible sh0.Visible = xlSheetVeryHidden End If On Error GoTo 0
макрос скрывает только твой лист-заставку и открывает лист с названием логина пользователя, остальные листы изначально (я так думал и это правильно, т.к. макросы "вырублены" и все листы напоказ, если не скрыты изначально - на макросы так уж сильно надеяться нельзя) "очень" скрыты и с ними он ничего не делает...
Quote (Serge_007)
а вот лист "фыфыы" - остаётся.
макрос скрывает только твой лист-заставку и открывает лист с названием логина пользователя, остальные листы изначально (я так думал и это правильно, т.к. макросы "вырублены" и все листы напоказ, если не скрыты изначально - на макросы так уж сильно надеяться нельзя) "очень" скрыты и с ними он ничего не делает...Саня
макрос скрывает только твой лист-заставку и открывает лист с названием логина пользователя
Точно, так и надо. Но всё равно что-то не так... Смотри, я прикладываю файл. Измени название листа Serge 007 на своё, сохрани файл и открой его. У меня файл открывается на листе Лист 1, а не на Serge 007, как должно быть...
Quote (Саня)
макрос скрывает только твой лист-заставку и открывает лист с названием логина пользователя
Точно, так и надо. Но всё равно что-то не так... Смотри, я прикладываю файл. Измени название листа Serge 007 на своё, сохрани файл и открой его. У меня файл открывается на листе Лист 1, а не на Serge 007, как должно быть...Serge_007
Серёга, а в продолжение идеи Сани попробуй-ка в модуле ЭтаКнига размести такой код: [vba]
Код
Private Sub Workbook_Open() Dim iSht As Worksheet On Error Resume Next For Each iSht In ThisWorkbook.Sheets iSht.Visible = IIf(iSht.Name = Environ("UserName"), xlSheetVisible, xlSheetVeryHidden) Next If Err Then ThisWorkbook.Close SaveChanges:=False End Sub
[/vba]
Только для первой пробы лучше сделать последний If так: [vba]
Код
If Err Then MsgBox "Sheet " & Environ("UserName") & " not found!" ' If Err Then ThisWorkbook.Close SaveChanges:=False
[/vba]
У меня почему-то со своим UserName работало отлично, а когда я вместо Environ("UserName") при тестировании указывал напрямую Serge_007, то не всегда хотела открываться и приходилось извращаться - макросы запрещать чтобы книгу открыть Может, пробел в имени как-то мешает? Кстати, а разве в UserName допустимы пробелы?
Серёга, а в продолжение идеи Сани попробуй-ка в модуле ЭтаКнига размести такой код: [vba]
Код
Private Sub Workbook_Open() Dim iSht As Worksheet On Error Resume Next For Each iSht In ThisWorkbook.Sheets iSht.Visible = IIf(iSht.Name = Environ("UserName"), xlSheetVisible, xlSheetVeryHidden) Next If Err Then ThisWorkbook.Close SaveChanges:=False End Sub
[/vba]
Только для первой пробы лучше сделать последний If так: [vba]
Код
If Err Then MsgBox "Sheet " & Environ("UserName") & " not found!" ' If Err Then ThisWorkbook.Close SaveChanges:=False
[/vba]
У меня почему-то со своим UserName работало отлично, а когда я вместо Environ("UserName") при тестировании указывал напрямую Serge_007, то не всегда хотела открываться и приходилось извращаться - макросы запрещать чтобы книгу открыть Может, пробел в имени как-то мешает? Кстати, а разве в UserName допустимы пробелы?Alex_ST
А мой-то макрос проверил? У меня пашет настолько нормально, что открыть книгу, где нет твоего листа можно только предварительно отключив макросы
А мой-то макрос проверил? У меня пашет настолько нормально, что открыть книгу, где нет твоего листа можно только предварительно отключив макросыAlex_ST
Не находит мой лист, хотя он есть в файле и назван правильно (в МсгБокс тоже отображается правильно). Сейчас разбираться времени нет, работы много, поэтому позже.
Quote (Alex_ST)
А мой-то макрос проверил?
Не находит мой лист, хотя он есть в файле и назван правильно (в МсгБокс тоже отображается правильно). Сейчас разбираться времени нет, работы много, поэтому позже.Serge_007
Серёга, у меня сегодня на работе было свободное время и вот что я накрутил: Для каждого из "нужных" юзеров в книге есть свой лист, имя которого совпадает с именем пользователя компьютера (переменная окружения "UserName" ). Перед закрытием книги все листы пользователей сильно скрываются (SheetVeryHidden). Лист Access_Denied (имя задаётся константой в декларациях модуля ЭтаКнига) показывается (SheetVisible) и книга сохраняется. Лист Access_Denied Защищен от изменений паролем. Проект VBA защищен паролем. ОБА ПАРОЛЯ - пробел. Поэтому даже если на компьютере макросы, пользователь, для которого в книге нет персонального листа, открыть спрятанные листы книги не сможет, а увидит только лист Access_Denied. Если же макросы включены, то книга просто закроется. (для этого нужно исправить последние строки процедуры Workbook_Open так:[vba]
Код
'If Err Then MsgBox "Sheet " & UName & " not found!" ' пытаемся скрыть PublicSheet. Если будет ошибка, то значит все другие уже скрыты If Err Then ThisWorkbook.Close SaveChanges:=False
[/vba]
Единственное, что пока не смог сделать: если с "левого" компа открыть книгу при отключенных макросах, искалечить имя листа Access_Denied и сохраниться, то после следующего открытия со включенными макросами может заглючить, т.к. не найдёт нужный лист.
Серёга, у меня сегодня на работе было свободное время и вот что я накрутил: Для каждого из "нужных" юзеров в книге есть свой лист, имя которого совпадает с именем пользователя компьютера (переменная окружения "UserName" ). Перед закрытием книги все листы пользователей сильно скрываются (SheetVeryHidden). Лист Access_Denied (имя задаётся константой в декларациях модуля ЭтаКнига) показывается (SheetVisible) и книга сохраняется. Лист Access_Denied Защищен от изменений паролем. Проект VBA защищен паролем. ОБА ПАРОЛЯ - пробел. Поэтому даже если на компьютере макросы, пользователь, для которого в книге нет персонального листа, открыть спрятанные листы книги не сможет, а увидит только лист Access_Denied. Если же макросы включены, то книга просто закроется. (для этого нужно исправить последние строки процедуры Workbook_Open так:[vba]
Код
'If Err Then MsgBox "Sheet " & UName & " not found!" ' пытаемся скрыть PublicSheet. Если будет ошибка, то значит все другие уже скрыты If Err Then ThisWorkbook.Close SaveChanges:=False
[/vba]
Единственное, что пока не смог сделать: если с "левого" компа открыть книгу при отключенных макросах, искалечить имя листа Access_Denied и сохраниться, то после следующего открытия со включенными макросами может заглючить, т.к. не найдёт нужный лист.Alex_ST