使用vba进行数据验证

时间:2012-05-09 05:10:50

标签: excel excel-vba excel-2003 vba

通常可以通过vba在excel中应用数据验证,但我遇到了一个特定的问题

我正在使用间接方法来应用验证,通常当我不使用vb​​a时,我会收到excel警告“源当前评估为错误,你想继续吗?” (这是因为间接引用的单元格可能是空的),现在我可以通过单击“是”轻松跳过excel中的此错误

这是链接http://www.contextures.com/xldataval02.html(相关验证列表)

但是当我尝试使用vba执行相同的操作时,我收到运行时错误,没有友好的提示允许我继续。我如何处理这种错误。

错误恢复不起作用,因为然后vba根本不应用验证。

这是代码

Set rng = ThisWorkbook.Sheets("input").Range("AB11:AB65536")
With rng.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:= _
    "=INDIRECT(cablecode&""_depth_""&$Q11&""_""&$Z11&""_values"")"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With

cablecode是一个静态命名范围

Q11和Z11指的是该特定行的输入

深度是普通字符串

cablecode可以有两个值=“is”或“iec”

Q11可以是“xlpe”或“pvc”

Z11可以是“al”或“c​​u”

因为对于整个项目,cablecode是不变的,我直接提到它, Q11和Z11对于不同的行可以是不同的,所以我们单独提到它们

整个字符串出来了 “is_depth_al_xlpe_values” 类似的不同的permations,所有命名的范围已经定义

2 个答案:

答案 0 :(得分:1)

我认为以下一行需要修正

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:= _
    "=INDIRECT(cablecode&""_depth_""&$Q11&""_""&$Z11&""_values"")"

dim cellToBeReferred as string
cellToBeReferred = cablecode & "_depth_" & Range("$Q11").Value & "_" _
& Range("$Q11").Value & "_values"

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
    xlBetween, Formula1:= _
    "=INDIRECT(" & cellToBeReferred  & ")"

取出字符串将帮助您调试问题并确定命名范围的值是什么,您需要参考。查看cellToBeReferred结果的值,并使用上面的内容更正连接。

阅读OP评论后编辑

在这种情况下,用INDIRECT包围ISERROR并给出一个虚拟单元格引用。 例如,

"=IFERROR(INDIRECT(" & cellToBeReferred  & "), Z1)"

如果INDIRECT失败,Z1是要引用的单元格。

答案 1 :(得分:0)

无法在VBA中取消警告。临时为参考单元格分配一个值,然后稍后将其清除。在将“源当前评估为错误。是否要继续”对话框中选择“是”时,这将避免UI避免的运行时错误。

例如。

thisworkbook.range("Q11").value = "1"

'data validation - i.e. Formula1:="=INDIRECT(Q11)"

thisworkbook.range("Q11").value = ""