【问题标题】:Including Excel Object Names in VBA Validate Lists在 VBA 验证列表中包含 Excel 对象名称
【发布时间】:2017-07-03 19:08:52
【问题描述】:

在另一个问题的回答中,我看到了一个验证列表条目的建议示例:

 With rng.Validation
     .Delete 'delete previous validation
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
     Formula1:="='" & ws.Name & "'!" & range1.Address
 End With

这很好用,但如果可能的话,与其在 Formula1 中包含工作表的名称,我宁愿包含 Excel 对象名称(例如 Sheet1、Sheet2 等)。这样,如果有人选择重命名工作表,那么宏仍然可以在未经编辑的情况下工作。

这可能吗?如果可以,请问将其包含在 Formula1 中的最佳方法是什么?

【问题讨论】:

  • 命名范围默认对工作簿是全局的,不需要工作表名称
  • 如果有人重命名工作表,该宏仍然有效。只是名称更改后验证将不起作用,因为最初运行的 Formula1 结果在之后将不正确。重新运行宏会立即解决这个问题。 Formula1 采用字符串格式的“常规” excel 公式,因此无法使用对象的名称。
  • 编辑:我的错 - 实际上,当用户更改工作表名称时,Excel 会自动更新公式。您发布的代码只是从工作表变量中获取名称。根本没有必要参考其他任何东西。换句话说,“这样,如果有人选择重命名工作表,那么宏在未经编辑的情况下仍然可以工作。” - 这不适用。
  • 原谅我,我是新手。我现在创建了一个小测试,在我的版本中,当我更改工作表名称、保存并关闭工作簿并重新打开它时,宏失败了。
  • 我怀疑我错误地设置了 WS.name - 我使用了“Dim WS As Worksheet”,然后使用了“Set WS = ThisWorkbook.Worksheets("Configuration")”。当我将工作表的名称从“配置”更改为“埃里克”(我知道,我知道)我得到“运行时错误'9':”“下标超出范围”

标签: excel validation excel-2010 vba


【解决方案1】:

简单地使用,我推荐在所有情况使用,范围的地址,包括工作表的名称​​隐式

Formula1:="=" & range1.Address(External:=True)

External:=True 将在引用中包含父工作表,无论它目前是什么,但以后会发生变化。

附言工作表的名称将出现在公式中,但如果用户更改工作表名称,Excel 将自动更新所有引用它的公式,除非在 INDIRECT 函数内。所以你担心的问题不是真正的问题。

将此视为设置外部引用的唯一推荐方式。

【讨论】:

  • 这仍然会在宏执行时将公式 1 设置为原样 - 当用户根据 OP 更改工作表名称时会出现此问题。但是 - 我刚刚测试过,这首先不是问题,因为 Excel 实际上会更新公式。
  • 我创建了一个小型工作簿模型。我没有使用 range1,而是使用“WS_Range”并将其设置如下:“Dim WS_Range As Range”“With Sheet2”“Set WS_Range = .Range(.Cells(2, 5), .Cells(2, 11)) " "End With" 然后我使用了 "Formula1:=WS_Range.Address(External:=True)" 在目标单元格中​​我没有得到数据验证,该单元格只包含 "'WS_Range.Address(External:=True)" 什么请问我错过了吗?
  • @Gary 在开头添加"="&,公式应以"=" 开头。 Formula1:="=" & WS_Range.Address(External:=True)
  • @A.S.H - 完美,谢谢。我真的花了几天时间在这个上。非常感谢
猜你喜欢
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
相关资源
最近更新 更多