通常可以通过vba在excel中应用数据验证,但我遇到了一个特定的问题
我正在使用间接方法来应用验证,通常当我不使用vba时,我会收到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”或“cu”
因为对于整个项目,cablecode是不变的,我直接提到它, Q11和Z11对于不同的行可以是不同的,所以我们单独提到它们
整个字符串出来了 “is_depth_al_xlpe_values” 类似的不同的permations,所有命名的范围已经定义
答案 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 = ""