VBA根据colorindex取消保护单元格 - 运行时错误

时间:2017-06-30 13:20:59

标签: excel-vba vba excel

我是论坛的新手,但不得不承认我在很多场合都使用过这个论坛的VBA代码。这是一个很好的资源。但是我无法让我的最新代码正常运行。 PS我的VBA技能有限。

我的问题:

我在工作簿中有几个格式相同的工作表。工作表中的列可以分类为“实际”数据或“预测”数据。 “预测”列中的单元格有条件地格式化为黄色(颜色索引36)。

我想要做的是锁定每张非黄色纸张上的使用范围内的每个单元格,以防止用户更改包含实际数据的单元格。

我借用了下面的代码并进行了一些调整 - 我可以毫无问题地逐步完成但是当我完全运行它时会得到1004运行时错误。我怀疑这与保护床单有关。我确实已经为工作簿中的每个工作表运行了代码集,但已将其更改为“activesheet”以尝试隔离问题。

非常感谢任何建议。

Option Explicit

Sub LockExceptYellowCells()
Dim ws As Worksheet
Dim c As Range

    ActiveSheet.Unprotect
        For Each c In ActiveSheet.UsedRange
        If c.Interior.ColorIndex <> 36 Then
        c.Locked = True
        Else
        c.Locked = False
        End If

    Next c

    ActiveSheet.Protect

End Sub

2 个答案:

答案 0 :(得分:1)

我已经尝试过你的代码,它适用于我,在一张空白纸上。尝试一下,问题应该在其他地方:

Option Explicit

Sub LockExceptYellowCells()

    Dim c As Range

    ActiveSheet.Unprotect "pesho"

    For Each c In ActiveSheet.UsedRange
        c.Locked = c.Interior.ColorIndex <> 36
    Next c

    ActiveSheet.Protect "pesho"

End Sub

一般情况下,如果您可以排除TrueFalse以及if,而是提供条件,则代码更容易理解。

答案 1 :(得分:0)

保持您的变量和工作表的方式,我清理了代码并添加了&#34; For Each Worksheet&#34;回到它。

Option Explicit

Sub LockExceptYellowCells()
Dim ws As Worksheet
Dim c As Range

For Each ws In ActiveWorkbook.Worksheets
    ws.Unprotect
        For Each c In ws.UsedRange
           c.Locked = c.DisplayFormat.Interior.ColorIndex <> 36
        Next c
    ws.Protect
Next ws

End Sub

我用相同的颜色索引对它进行了测试,然后通过每张纸。它首先取消保护工作表,进行检查,并根据颜色索引对其进行保护。然后它将转到下一张表。

如果仍然无法解决问题,请尝试以下方法:

Option Explicit

Sub LockExceptYellowCells()
Dim ws As Worksheet
Dim c As Range

For Each ws In ActiveWorkbook.Worksheets
    ws.Unprotect
Next ws

For Each ws In ActiveWorkbook.Worksheets
    For Each c In ws.UsedRange
       c.Locked = c.DisplayFormat.Interior.ColorIndex <> 36
    Next c
    ws.Protect
Next ws

End Sub

这个不应该有所作为,但是它的作用是先通过并取消保护每张纸,然后通过并进行颜色保护。