避免尝试有条件地保护共享工作簿中的单元格的变通方法

时间:2012-03-09 15:58:06

标签: excel vba excel-vba

现在......我有一个包含5个标签的工作簿。在标签1(仪表板)上,我有四个按钮 - 每个按钮基本上是指向其他四个按钮之一的链接。使用按钮的原因是只有对工作簿具有“admin”权限的用户才能更改其他四个选项卡上的数据。

不应允许所有其他用户更改其他四个标签上的任何数据。这是一个“看起来但不接触”的政策。哦 - 为了使它复杂一点,我们决定他们应该能够在每个工作表上更改一列。

因此。这是一个共享的工作簿。我的代码:

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 个答案:

答案 0 :(得分:1)

如果您知道管理员用户(或非管理员,无论哪个更容易)的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)调用,而不是代码切换可见标签的按钮。

答案 1 :(得分:1)

如果ActiveCell.Column是您想要允许的任何内容并且取消保护工作表,则可能检查SelectionChange事件,任何其他列都会声明保护。除了管理员以外,其他所有人都要锁定。 - 我的意思是建议@Gaffi检查UserPermsLevel是一个好主意,也可以合并