在Excel中通过VBA进行validation在使用variables时失败

我正在尝试使用VBA为一系列单元格设置数据validation。 我得到了一个运行时错误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 

在Formula1中,choice是一个传递给函数的variables,类似于代码所在的工作簿中的“= SomeNamedRange”

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

如果我将Formula1:="=SomeNamedRange"硬编码为Formula1:="=SomeNamedRange"那么它的工作原理没有问题。我真的没有对它进行硬编码,因为我正在为“choice”做很多可能的值,我认为是不太干净的代码。

我已经烧了谷歌和大约3天不同的书,现在试图解决这个问题。

有什么build议么? 感谢您帮助新手出去。

你确定你的choicevariables的价值是你认为的吗? 也许你应该在.Add行之前设置一个断点,看看你传递了什么。我在Excel 2003和2007中testing了代码,它没有任何问题。 只有当我给公式1和无效的范围参考时,我得到错误1004。

你可以尝试运行这是一个新的未触及的工作簿,看看它是否适用于你(当然对我来说):

 Sub Test() 'Setup ' ActiveSheet.Range("B1:B2").Name = "SomeNamedRange" ActiveSheet.Range("B1").Value = "Apples" ActiveSheet.Range("B2").Value = "Oranges" Dim lrownum As Long lrownum = 1 Dim choice choice = "=SomeNamedRange" Dim rngRangeToCheck As Excel.Range Set rngRangeToCheck = ActiveSheet.Range("A1:A10") 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 End Sub 

(这实际上应该是一个评论,而不是一个答案,但我需要发布代码,这样就更容易了,如果我想出来,我将编辑这个答案。

这可能也应该是一个评论,特别是因为这个职位是如此之久…我有同样的问题,它会在一些时间,而不是其他人。 使用dynamic命名的范围。 我find的解决办法是暂时解锁表格。

 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 

这是一个相当古老的post,但对于任何人在这里与我所做的相同的问题,这里是问题是如何解决我的情况:

我刚刚取代了

 With Range(Cell1,Cell2).Validation 

一部分

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

和tadaaa! 有用 :)

问题几乎可以肯定是由于命名范围的上下文与Excel中的当前上下文有所不同。

当调用Validation.Add ,Excel会在应用程序的当前上下文中评估公式(即返回Range对象),而不是工作簿或工作表。 所以,如果命名的范围是基于工作表的,并且该工作表目前不处于活动状态,则无法工作。 如果命名的范围存在于一个工作簿中,但是另一个工作簿处于活动状态,则不起作用。 这就是为什么你select一个随机单元格的解决方法解决了这个问题,也是执行.SelectSelection.Validation的解决scheme。

确保您没有传入validation。添加行/列中的公式。 例如“= R2C2:R3C3”给我带来了问题,只要我把它改成“B2:C3”就行了。 此外,范围中的单元格必须具有值,否则将会出现应用程序错误。