vba插入验证列表 - 工作表锁定时出现错误1004?

时间:2014-10-15 15:16:52

标签: excel vba

我有以下vba代码可以正常工作,但是当我锁定/保护我的工作表时它不起作用,即使我没有锁定'锁定'对于单元格格式选项中的相关单元格。

有人可以帮我理解为什么我在工作表被锁定时收到错误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

2 个答案:

答案 0 :(得分:2)

答案是即使您解锁了单元格,数据验证仍然是不受限制的。在应用数据验证之前,您必须取消保护工作表。

答案 1 :(得分:1)

我认为您无法在启用保护时设置验证。

我所做的是在程序开始时删除保护并在最后添加它,记住错误处理,如果发生故障,应该重新设置保护。

我经常创建一个应用保护的类。

说一个名为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

这会导致通过类初始化方法删除保护,然后当实例因任何原因(程序结束,错误)超出范围时,终止触发并将保护应用于其上。