使用变量时,通过excel中的VBA设置验证失败

使用变量时,通过excel中的VBA设置验证失败,vba,excel,Vba,Excel,我正在尝试使用VBA为一系列单元格设置数据验证。我得到一个运行时错误1004(非常有用)“应用程序定义或对象定义错误”与此代码 With rngRangeToCheck.Cells(lrownum, 1).Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:=choice .

我正在尝试使用VBA为一系列单元格设置数据验证。我得到一个运行时错误1004(非常有用)“应用程序定义或对象定义错误”与此代码

 With rngRangeToCheck.Cells(lrownum, 1).Validation
    .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=choice
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
End With
在公式1中,choice是传递给函数的变量,类似于代码所在工作簿中的“=SomeNamedRange”

错误发生在代码的
.Add
部分

如果我将公式1硬编码为
Formula1:=“=SomeNamedRange”
,它工作起来没有问题。我真的不想硬编码它,因为我这样做有很多可能的“选择”值,我认为这比干净的代码要少

几天来,我一直在烧掉谷歌和大约3本不同的书,试图解决这个问题


有什么建议吗?谢谢你帮了一个新手。

你确定你选择的
变量的值是你认为的值吗?也许你应该在
.Add
行之前设置一个断点,看看你传递了什么。我在Excel2003和2007中测试了代码,它可以正常工作。只有当我给出公式1和无效范围引用时,我才得到错误1004

你能试着运行这是一个新的未接触的工作簿,看看它是否适合你(当然适合我):


(这实际上应该是一条评论,而不是一个答案,但我需要发布代码,这样做更容易。如果我有答案,我会编辑它作为我的答案。)

这可能也应该是一条评论,特别是因为这篇文章太旧了……我也有同样的问题,在某些时候它会起作用,而在其他时候则不会。使用动态命名的范围。我找到的解决办法是暂时解锁工作表

Private Sub FixDropdownLists()

Sheet1.Unprotect Password:="afei31afa"
Dim cellv As Range

For Each cellv In Sheet1.Range("B18:E18,B32:E32")
    With cellv.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=Office_Locations"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = "Invalid Input"
        .InputMessage = ""
        .ErrorMessage = "Select the location only from the dropdown list."
        .ShowInput = False
        .ShowError = True
    End With
Next cellv
Sheet1.Protect Password:="afei31afa"
End Sub

这是一篇很老的帖子,但对于任何和我有相同问题的人来说,我的问题是如何解决的:

我刚换了新的

With Range(Cell1,Cell2).Validation
分开

Range(Cell1,Cell2).Select
With Selection.Validation

还有tadaaa!它可以工作:)

确保您没有进入验证。添加行/列中的公式。例如“=R2C2:R3C3”给我带来了问题,我一改为“B2:C3”它就工作了。此外,区域中的单元格中必须包含值,否则将出现应用程序错误。

该问题几乎肯定是由命名区域的上下文与Excel中的当前上下文不同引起的


调用
Validation.Add
时,Excel将在应用程序的当前上下文(而不是工作簿或工作表)中计算公式(返回的是
范围
对象)。因此,如果命名范围是基于图纸的,并且该图纸当前未处于活动状态,则该范围将无法工作。如果命名区域存在于一个工作簿中,但另一个工作簿处于活动状态,则它将不起作用。这就是为什么选择一个随机单元格的解决方案解决了这个问题,也是执行
。选择
,然后进行
选择的解决方案。验证

我使用间接函数引用了命名位置,一切运行正常。然而,用户报告了一些常规的、看似随机的错误,我从日志文件中看到,这个Validation.add导致了这个问题。 问题是,Excel工具在后台运行,而用户操作的不同Excel文件在执行此操作时可能有焦点

没有测试以下代码。希望能有帮助

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= xlBetween, Formula1:="=INDIRECT(""[" & ThisWorkbook.Name & "]" & sht_sfDocumentation.Name & "!" & gstrRANGE_NamedTableRange & """)"

当我在Debug中查看它时,它将值显示为“=SomeNamedRange”清除为day。它在正确的范围内,所以那也不是坏人。。。你的代码也适用于我。该死的,如果我能找出问题所在。在工作表上的选项按钮上,该子项被称为“单击”事件。这会有所不同吗?谢谢遗憾的是,没有。可爱的网络过滤器@work。不过,我很感谢你的帮助。虽然我很讨厌这样做,但我可能不得不去把它硬编码了。。真奇怪。实际上,我在另一个工作簿中有相同的代码,并且它可以正常工作。真奇怪…谢谢你的帮助!我会坚持下去的!好啊现在它变得更奇怪了。有时它是有效的,没问题。特别是如果我直接从IDE运行它,而不是从控件激活。如果我尝试一个控件来激活它,它就会失败,出现上面的错误。然后它甚至不能直接从IDE工作——即使没有任何变化!我放弃!在这方面无法帮助您,但看起来您并不是唯一遇到问题的人:-也许其他论坛中的某个论坛有您正在寻找的答案。SomeNamedRange是否与选项按钮位于同一页上?如何确定范围(工作簿、工作表)?工作簿中是否有其他名称相同,但范围不同?它位于同一工作表中。已确定工作簿的作用域。我在运行代码之前,通过在工作表上随机选择一个单元格来运行代码,虽然有点粗糙,但还是成功地实现了这一点。似乎有效。虽然我不知道如何…这也碰巧是我的问题。似乎1004个错误可能由于各种原因而发生。它只是在说“我不能这么做。”
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= xlBetween, Formula1:="=INDIRECT(""[" & ThisWorkbook.Name & "]" & sht_sfDocumentation.Name & "!" & gstrRANGE_NamedTableRange & """)"