只要工作表不受保护,下面的代码就可以工作,但是我看不到为什么受保护时它不工作。
所有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
答案 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)
。就像指向书架上的一本书,转到目录以获取该书在该书架中的位置(地址)并选择该位置处的书一样。