代码之家  ›  专栏  ›  技术社区  ›  Dheer

保护Excel中的单元格,但允许用VBA脚本修改这些单元格

  •  51
  • Dheer  · 技术社区  · 16 年前

    我正在使用Excel,其中某些字段允许用户输入,其他单元格将受到保护。我使用了“工具”“保护工作表”,但是这样做之后,我无法更改VBA脚本中的值。我需要限制工作表以停止用户输入,同时允许VBA代码根据某些计算更改单元格值。

    6 回复  |  直到 7 年前
        1
  •  82
  •   to StackOverflow    16 年前

    试用使用

    Worksheet.Protect "Password", UserInterfaceOnly := True
    

    如果userInterfaceOnly参数设置为true,则VBA代码可以修改受保护的单元格。

        2
  •  16
  •   Robert Mearns    16 年前

    通过执行这些操作,可以通过代码修改工作表。

    • 解除保护
    • 修改
    • 保护

    在代码中,这将是:

    Sub UnProtect_Modify_Protect()
    
      ThisWorkbook.Worksheets("Sheet1").Unprotect Password:="Password"
    'Unprotect
    
      ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
    'Modify
    
      ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password"
    'Protect
    
    End Sub
    

    这个 弱点 此方法的一个特点是,如果代码被中断,错误处理无法捕获代码,工作表可能会处于未保护状态。

    代码可能是 改进 通过采取这些行动

    • 再保护
    • 修改

    这样做的代码是:

    Sub Re-Protect_Modify()
    
    ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
     UserInterfaceOnly:=True
    'Protect, even if already protected
    
      ThisWorkbook.ActiveSheet.Range("A1").FormulaR1C1 = "Changed"
    'Modify
    
    End Sub
    

    此代码更新了工作表上的保护,但_userinterfaceOnly_设置为true。这允许VBA代码修改工作表,同时保护工作表不受用户通过UI输入的影响,即使执行被中断。

    此设置是 迷路的 当工作簿关闭并重新打开时。工作表保护仍保持不变。

    因此,在任何试图修改工作表的过程开始时都需要包含“重新保护”代码,或者在打开工作簿时只运行一次。

        3
  •  3
  •   ddimitrov    16 年前

    我认为您不能将工作表的任何部分设置为只能由VBA编辑。 ,但是您可以做一些基本上具有相同效果的事情--您可以在需要进行更改之前取消对VBA中的工作表的保护:

    wksht.Unprotect()
    

    完成后重新保护:

    wksht.Protect()
    

    编辑:看起来这个解决方法可能已经解决了迪尔的直接问题,但是对于后来遇到这个问题/答案的人来说,我的答案的第一部分是错误的,正如乔在下面指出的。你 可以 保护工作表仅可由VBA编辑,但似乎只有在代码中调用“worksheet.protect”时才能设置“userinterfaceonly”选项。

        4
  •  2
  •   Undo ptrk    11 年前

    一个基本但简单易懂的答案:

    Sub Example()
        ActiveSheet.Unprotect
        Program logic...
        ActiveSheet.Protect
    End Sub
    
        5
  •  1
  •   hegemon    8 年前

    作为解决方案,您可以创建 隐藏工作表 ,它将保存更改的值。可见、受保护工作表上的单元格应使用简单公式显示隐藏工作表中的值。

    你将能够 通过隐藏工作表更改显示的值 ,而您的用户将无法对其进行编辑。

        6
  •  0
  •   Alan    8 年前

    我选择了要锁定在Sheet1中的单元格,并将建议的代码放在open_Workbook()函数中,工作得很有魅力。

    ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password", _
    UserInterfaceOnly:=True
    
    推荐文章