尝试更改受保护工作表上的字体颜色时出现运行时错误1004

时间:2019-02-21 13:15:37

标签: excel vba

只要工作表不受保护,下面的代码就可以工作,但是我看不到为什么受保护时它不工作。

所有KeyCell均未锁定。 错误出现在以下行: Range(Target.Address).Font.Color = vbBlack

错误是“应用程序定义的错误或对象定义的错误”

这是整个代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Sheets("MISC").Range("C31") = True Then
        Dim KeyCells As Range
        Set KeyCells = Range("C15:EL15,AA22:ED22,W30:DN30,W34:DN34,S41:DZ41,C13:EL13,AA20:ED20,W28:DN28,W32:DN32,S39:DZ39")

        If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
            Dim objRegex As Object
            Dim RegMC As Object
            Dim RegM As Object
            Dim item As Variant
            Dim DirArray As Variant
            Dim DirArray2 As Variant
            Dim DirArr As Variant
            '------------------------------------------------------------------------------------------------
            Range(Target.Address).Font.Color = vbBlack
            '------------------------------------------------------------------------------------------------
            arr = Sheets("MISC").Range("O4:O145").Value
            lASTrOW = Sheets("MISC").Cells(Rows.Count, "K").End(xlUp).row
            DirArray = Join(Application.Transpose(Sheets("MISC").Range("K4:K" & lASTrOW).Value), "|")

            DirArray2 = Replace(Worksheets("LI").TextBox3.Value, ",", "|")
            DirArr = DirArray & "|" & DirArray2
            '------------------------------------------------------------------------------------------------
            Set objRegex = CreateObject("vbscript.regexp")
            On Error Resume Next
            With objRegex
                .Global = True
                .Pattern = DirArr
                If .test(Range(Target.Address).Value) Then
                    Set RegMC = .Execute(Range(Target.Address).Value)
                    For Each RegM In RegMC
                        If InStr(DirArray2, RegM) Then
                            Range(Target.Address).Characters(RegM.FirstIndex + 1, RegM.Length).Font.Color = RGB(0, 176, 80)
                        ElseIf RegM = "COL" Or RegM = "CRT" Then
                            Range(Target.Address).Characters(RegM.FirstIndex + 1, RegM.Length).Font.Color = RGB(0, 176, 240)
                        Else
                            Range(Target.Address).Characters(RegM.FirstIndex + 1, RegM.Length).Font.Color = RGB(247, 150, 70)
                        End If
                    Next
                End If
            End With
        End If
    End If
End Sub

1 个答案:

答案 0 :(得分:1)

受保护的工作表就是受保护的工作表-用户无法修改锁定单元格中的任何内容-对于VBA也是这样。

因此,当您计划用代码修改任何内容时,必须首先使用工作表的unprotect方法,进行修改并再次设置保护(如果工作表中未使用密码保护,则可以省略密码)。

Const mySecret = "Blablabla"
With ActiveSheet
    .Unprotect mySecret
    ...
    Target.Font.Color = vbBlack
    ...
    .Protect mySecret
End With

有一种方法可以在工作表上设置保护,允许通过代码进行修改:

ActiveSheet.Protect mySecret, UserInterfaceOnly:=True

但是,存在一个小问题:如果保存工作簿,UserInterfaceOnly将被忘记-换句话说,如果重新打开文件,工作表仍将受到保护,但现在又可以通过VBA。

顺便说一句:已经提到过,不需要写Range(Target.Address)。就像指向书架上的一本书,转到目录以获取该书在该书架中的位置(地址)并选择该位置处的书一样。