如何使用 VBA 允许在受保护的工作表中编辑范围?

How can I allow edit ranges in a protected worksheet using VBA?

提问人:Bruno Colares 提问时间:9/26/2023 更新时间:9/26/2023 访问量:73

问:

我只想阻止一些范围。换句话说,我想允许在受保护的工作表中进行编辑。我可以手动执行此操作,甚至可以在执行此操作时录制宏。但是当我尝试运行此过程的代码时,屏幕上会弹出错误窗口。

法典:

ActiveSheet.Protection.AllowEditRanges.Add Title:="Intervalo3", Range:= _
        Range("H18")
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

错误: 运行时错误 1004 应用程序定义或对象定义错误。

我试图在受保护的工作表中记录允许编辑范围的宏,因为我想自动执行。我成功地录制了允许编辑范围和保护工作表的宏。但是当我转到VBA工作区尝试运行此操作背后的代码时,我无法运行,并且弹出了错误窗口。

VBA Excel-2010 工作表

评论

2赞 jkpieterse 9/26/2023
为什么不简单地解锁您希望用户编辑的单元格,然后保护工作表呢?
0赞 Paul 9/26/2023
当我尝试一次您的代码时,它工作正常。如果手动或通过VBA再次运行它,则必须先解锁工作表,否则将出现此错误。
0赞 Bruno Colares 9/26/2023
谢谢你们的帮助。我在试图查明错误以及如何纠正该问题时遇到了问题。它真的帮助了我。

答:

0赞 Darren Bartrup-Cook 9/26/2023 #1

我从来没有真正玩过 - 通常我会按照@jkpieterse建议进行操作,并在保护工作表之前解锁“格式化单元格>保护”对话框中的单元格。容易多了。AllowEditRanges

话虽如此,看起来你不能用与现有对象相同的名称来调用一个对象,如果你第二次运行它,你的代码就会这样做。
如果工作表受保护,则也无法删除命名区域。
AllowEditRangeAllowEditRange

话虽如此,这似乎可以解决问题:

Public Sub Test()

    Dim EditRangeTitle As String
    EditRangeTitle = "Intervalo3"

    With ThisWorkbook.Worksheets("Sheet1")
    
        .Unprotect
    
        Dim AER As AllowEditRange
        For Each AER In .Protection.AllowEditRanges
            If AER.Title = EditRangeTitle Then Exit For
        Next AER
        
        If Not AER Is Nothing Then
            AER.Delete
        End If
        
        .Protection.AllowEditRanges.Add Title:=EditRangeTitle, Range:=.Range("H18")
        .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        
    End With
    
End Sub  

这将适用于包含代码 () 的工作簿。Sheet1ThisWorkbook

延伸阅读:
与...以
每个工作簿
结束...下一个

评论

0赞 Bruno Colares 9/26/2023
非常感谢。它奏效了,对我有很大帮助。我有点头疼,哈哈。