我是论坛的新手,但不得不承认我在很多场合都使用过这个论坛的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
答案 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
一般情况下,如果您可以排除True
和False
以及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
这个不应该有所作为,但是它的作用是先通过并取消保护每张纸,然后通过并进行颜色保护。