【问题标题】:Excel VBA Fill Table(ListObject) Column With Result of Operation Between Other Table ColumnsExcel VBA填充表(ListObject)列与其他表列之间的操作结果
【发布时间】:2018-04-21 19:08:53
【问题描述】:

在 Excel VBA 中,我找不到使用索引号而不是使用字符串中的标题对表的两个或多个列进行操作来填充表 (ListObjects) 中的列 (ListColumns) 的方法。因此,例如,我知道这在使用时有效:

lo.ListColumns("Spread").DataBodyRange = "=[Current]-[Historic]"

但是说“点差”是第 10 列,“当前”是第 5 列,“历史”是第 7 列。有没有办法执行以下操作来填充该列?我知道这不起作用,但我希望有类似的东西,因为我尝试了各种方法并且无法在搜索中找到它。

lo.ListColumns(10).DataBodyRange = lo.ListColumns(9).DataBodyRange - _ 
                                   lo.ListColumns(10)

感谢您的帮助。

【问题讨论】:

    标签: vba excel


    【解决方案1】:
    lo.ListColumns(10).DataBodyRange = "=[" & lo.ListColumns(5).Name & "]-[" & lo.ListColumns(7).Name & "]"
    

    【讨论】:

    • 危险。后来有人插入或删除了一个表列,宏做错了事。最好不要像这样将引用硬编码到 VBA 中。
    • 虽然我完全同意,但问题很明确,我选择相信 OP 知道他/她在做什么。
    • 是的,我知道你给了他们的要求。只是他们要求的东西可能对他们的健康有害。在这种情况下,我想明确指出他们向他们提出的问题以及谷歌未来带来的任何其他人的问题。将来可能会为某人避免一个令人尴尬的、限制职业生涯的错误。
    【解决方案2】:

    您是否有特定原因要使用 INDEX 而不是列标题?使用硬编码的索引号并不能生成健壮的代码……这意味着如果您(或其他人)以后更改表格的布局,您必须检查您的代码并修改那些硬编码的引用。这正是 ListObject 参考旨在避免的(在 VBA 和公式方面)。

    使用列标题要好得多,就像在您的示例中一样。如果有人可能会更改列名,则设置一个命名范围以指向相关的 ListColumns,并在您的代码中引用这些命名范围。

    如果出于某种原因您只想找到 INDEX 编号,那么只需执行以下操作:

    Dim lo as ListObject
    Dim lc as ListColumn
    
    On Error Resume Next
    Set lc = lo.ListColumns("sName")
    On Error GoTo 0
    

    ...然后你可以测试是否找到了

    If Not lc Is Nothing Then Msgbox(lc.Index)
    

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      相关资源
      最近更新 更多