【问题标题】:Data validation with vba使用 vba 进行数据验证
【发布时间】:2012-05-09 05:10:50
【问题描述】:

通常可以通过 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 指的是该特定行中的输入

depthvalues 是普通字符串

cablecode 可以有两个值 = "is" 或 "iec"

Q11 可以是“xlpe”或“pvc”

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

因为我直接引用它的整个项目的电缆代码是不变的, Q11 和 Z11 对于不同的行可能是不同的,所以我分别引用它们

整个字符串是 “is_depth_al_xlpe_values” 类似的不同排列,并且所有命名范围都已定义

【问题讨论】:

  • 如果你能把源代码贴出来会更清楚。
  • @EdwinBautista 已添加源代码
  • 错误是什么,错误在哪一行?
  • vba 尝试添加验证时发生错误..我收到运行时错误“1004”“应用程序定义或对象定义错误”..由于验证当前将评估为一个错误,vba 不会让我继续……而 excel 会……

标签: excel excel-2003 vba


【解决方案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 评论后编辑

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

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

其中 Z1 是INDIRECT 失败时要引用的单元格。

【讨论】:

  • 我知道错误是什么......它只是当 Q11 和 Z11 没有指定时,字符串将变为 is_depth_(nothing here)_(nothing here)_values...因为它不是命名范围它给出了一个错误..问题是excel会让我继续,因为稍后我可以输入Q11和Z11并且验证将可用..但vba不会让我继续......
  • 但是在虚拟单元格引用的情况下,原始验证将不存在..如果用户在 Z11 和 Q11 中输入数据,他将不会得到他应该得到的列表
  • 如果命名范围正确且有数据,将被引用。如果出现错误,将参考 Z1(这是一个临时参考)。
  • 它仍然无法正常工作......它没有捕捉到 excel 显示的特定警告,以防间接当前指向错误......(是的,我使用了“ISERROR”)
  • 好吧,我在得到你的提示为“ISERROR”后得到了它,问题是它仍然不会被“ISERROR”语句捕获,因为包含多个单元格的命名范围返回“#value”错误如果您在单元格上使用它们。相反,我使用了“ISREF”这是更好的格式“=IF(ISREF(INDIRECT(cablecode&""temp""&$Q11&""""& $Z11&""_values"")),INDIRECT (cablecode&""_temp""&$Q11&""_""&$Z11&""_values""),NA)"
【解决方案2】:

无法在 VBA 中抑制警告。暂时为参考单元格赋值,稍后将其清除。这将防止在“源当前评估为错误。您要继续”对话框中选择“是”时 UI 避免的运行时错误。

例如

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

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

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

【讨论】:

    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多