Обходные пути, чтобы избежать попытки условно защитить ячейки в общей книге - PullRequest
3 голосов
/ 09 марта 2012

Теперь ... У меня есть рабочая книга с 5 вкладками. На вкладке 1 (панель инструментов) у меня есть четыре кнопки - каждая из них представляет собой ссылку на одну из четырех других. Причина этого в кнопках заключается в том, что только пользователи с правами администратора могут просматривать и изменять данные на других четырех вкладках.

Всем другим пользователям не должно быть разрешено изменять какие-либо данные на этих четырех вкладках. Это политика «смотри, но не трогай». О, если немного усложнить, мы решили, что они ДОЛЖНЫ изменить один столбец на каждом листе.

Итак. Это общая рабочая книга. Мой кусок кода:

Private Sub cmdViewHistology_Click()
    If UserPermsLevel = "High" Or UserPermsLevel = "Super" Then
    Worksheets("Histology and Cytology").Visible = True
    Worksheets("Histology and Cytology").Activate
        Exit Sub
    ElseIf (UserPermsLevel = "Normal" Or UserPermsLevel = "Normal and UserName") Then
        Worksheets("Histology and Cytology").Visible = True
        Worksheets("Histology and Cytology").Range("A:I").Locked = True
        Worksheets("Histology and Cytology").Range("J:J").Locked = False
        Worksheets("Histology and Cytology").Protect DrawingObjects:=False, Contents:=True, Scenarios:=False
        Worksheets("Histology and Cytology").Activate
    Else
        MsgBox "Sorry, this command is not available."
    End If
End Sub

Это не работает. Потому что это общедоступно, я знаю, что не могу защитить лист - это позор. Проблема в том ... Мне нужно, чтобы эти администраторы могли все изменить, и мне нужно, чтобы все остальные могли смотреть, но не трогать!

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

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

Благодарю вас

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Возможно, при проверке события SelectionChange, если ActiveCell.Column соответствует тому, что вы хотите разрешить, и отмените защиту листа, любой другой столбец будет защищать. Держите вещи закрытыми для всех, кроме администраторов. - Я хотел предложить, чтобы проверка @Gaffi для UserPermsLevel также была хорошей идеей для включения

1 голос
/ 09 марта 2012

Если вы знаете логин Windows для пользователей с правами администратора (или без прав администратора, в зависимости от того, что проще), вы можете использовать Environ("Username") для проверки списка утвержденных пользователей.

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

Private Sub Worksheet_Change(ByVal Target As Range)
Dim EditableRange As Range
Dim Intersect As Range
    Set EditableRange = Range("A1") ' Set your range appropriately...
    Set Intersect = Application.Intersect(EditableRange, Target)
    If Intersect Is Nothing Then
        'If this is not in the list of editable cells, then check for admin status
        If UserPermsLevel <> "High" And UserPermsLevel <> "Super" Then
            Application.EnableEvents = False
            Application.Undo 'Undo the edits the user made
            Application.EnableEvents = True
            MsgBox "Sorry, this command is not available."
        End If
        'Implied else: allow change
    End If
    'Implied else: allow change

End Sub

Кроме того, вам нужно будет установить этот код на каждой из ваших «нередактируемых» вкладок или поместить его в отдельный модуль, который затем вызывается Private Sub Worksheet_Change(ByVal Target As Range) на каждой из этих вкладок, а не в коде для кнопок которые переключают видимую вкладку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...