vba插入validation列表 – 工作表被locking时出现错误1004?

我有以下vba代码,它工作正常,但是当我locking/保护我的工作表时,即使我已经在单元格格式选项中未勾选“locking”相关单元格,它也不起作用。

有人可以帮我理解为什么当工作表被locking时,我得到一个错误1004应用程序定义或对象定义的错误? 谢谢

Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False Application.DisplayAlerts = False If Range("B10").Value <> "" Then Dim MyList(9) As String MyList(0) = "60 Days EOM" MyList(1) = "60 Days DOI" MyList(2) = "45 Days EOM" MyList(3) = "45 Days DOI" MyList(4) = "30 Days EOM" MyList(5) = "30 Days DOI" MyList(6) = "14 Days DOI" MyList(7) = "10 Days EOM" MyList(8) = "7 Days DOI" MyList(9) = "Immediate Payment" With Range("N38").Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=Join(MyList, ",") End With If Intersect(Target, Target.Worksheet.Range("N38")) Is Nothing Then Range("N38").Value = "60 Days EOM" End If Else Range("N38").Validation.Delete Range("N38").Value = "" End If End Sub 

答案是,即使您解锁了单元格,数据validation仍然是禁用的。 在应用数据validation之前,您必须取消保护表单。

启用保护后,我认为您不能设置validation。

我所做的是在程序开始时删除保护,并在最后添加它,记住error handling,在失败的情况下应该设置保护。

我经常创build一个适用保护的课程。

说一个叫做cProtect的类

 Option Explicit Private Sub Class_Initialize() Sheet1.Unprotect End Sub Private Sub Class_Terminate() Sheet1.Protect End Sub 

在我的程序中,我开始:

 Dim protect as cProtect Set protect = new cProtect 

这导致通过类的初始化方法去除保护,然后当出于任何原因(过程结束,错误)的实例超出范围时,终止触发和保护被应用回去。