数据验证中的VBA错误:应用程序定义的错误或对象定义的错误

数据验证中的VBA错误:应用程序定义的错误或对象定义的错误,vba,excel,Vba,Excel,我有以下代码 Set works1 = ThisWorkbook.Worksheets("Sheet1") Set works2 = ThisWorkbook.Worksheets("Sheet2") Set rangeval1 = works1.Cells(11 , 4) Set rangeval2 = works2.Range("j322:j325") With rangeval1.Validation .Delete .Add Type:=xlValidateList, A

我有以下代码

Set works1 = ThisWorkbook.Worksheets("Sheet1")
Set works2 = ThisWorkbook.Worksheets("Sheet2")
Set rangeval1 = works1.Cells(11 , 4)
Set rangeval2 = works2.Range("j322:j325")

With rangeval1.Validation
   .Delete 
   .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _
    Formula1:="='" & works2.name & "'!" & rangeval2.Address          "Line with the error"

 End With

我无法找出错误是什么,因为代码对我来说似乎是正确的

我猜您在运算符后面缺少一个逗号。它应该是Add类型:=xlValidateList,AlertStyle:=xlValidAlertStop,运算符:=xlBetween,公式1:=“='”&works2.name&“!”&rangeval2.Address。请让我知道

它从sheet2下拉列表中获取值

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=("='" & works2.Name & "'!" & rangeval2.Address)

更新代码

    Sub start()
Set works1 = ThisWorkbook.Worksheets("Sheet1")
Set works2 = ThisWorkbook.Worksheets("Sheet2")
Set rangeval1 = works1.Cells(11, 4)
Set rangeval2 = works2.Range("d2:d5")

With rangeval1.Validation
   .Delete
   .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=("='" & works2.Name & "'!" & rangeval2.Address)

 End With
End Sub

我不知道为什么斯利拉姆的答案对你不起作用

以下内容适合我

Option Explicit

Sub test()
    Dim works1 As Worksheet
    Dim works2 As Worksheet
    Dim rangeval1 As Range
    Dim rangeval2 As Range

    Set works1 = ThisWorkbook.Worksheets("Sheet1")
    Set works2 = ThisWorkbook.Worksheets("Sheet2")
    Set rangeval1 = works1.Cells(11, 4)
    Set rangeval2 = works2.Range("j322:j325")

    With rangeval1.Validation
        .Delete
        .Add _
            Type:=xlValidateList, _
            AlertStyle:=xlValidAlertStop, _
            Operator:=xlBetween, _
            Formula1:="='" & works2.Name & "'!" & rangeval2.Address
    End With
End Sub
注意顶部的显式选项,然后用类型声明每个变量。您的代码中可能已经有了这一点。但很难说你在问题中发布了什么

如果仍然不起作用,请检查您的工作表是否真的命名为
Sheet1
Sheet2

注意:

我刚刚发现一个bug,如果当前Excel选择是一个图表,则不能使用VBA的
Add
方法更改验证


这可能是您面临的问题。

我以前也遇到过同样的问题。问题是您需要激活要创建验证的工作表并将其选中。最重要的是,您需要选择要创建验证的范围

currentSheet.Activate
currentSheet.Range("A3").EntireRow.Insert

currentSheet.Cells("C3").Select

With currentSheet.Cells("C3").Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, 
    Formula1:="A,B,C,D"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .errorMessage = ""
    .ShowInput = True
    .ShowError = True
End With

请确保您的工作表没有受到保护,如果这样,请取消工作表的保护并重试,它将正常工作

我遇到了这个问题,问题是它第一次起作用,但以后没有任何一次起作用。问题是我试图将验证(.validation.add)添加到一个已经有列表验证的单元格中。我必须在问题之前插入一行以清除验证(.validation.Delete)。

我忘了在问题中添加逗号,但它在VBA编辑器的代码中,但我仍然得到相同的结果error@Gajju:如果顶部有“option explicit”语句,请删除它,然后尝试运行代码。让我知道我写代码的表格,我没有在top@Gajju:那太好了。应该这样。我正在根据我的最新更新(检查答案)使用您的代码,我已将其放在表2中。检查一下,让我知道。仅更改范围值。还要确保参考Excel Library哪个版本的Excel?Excel 2007和早期版本不允许在数据验证中直接引用其他工作表-您必须命名范围。