-1

我希望能够通过行号和列名从 Excel 表中检索值(为了代码的可读性和稳健性)。

在公式中,我可以将结构化引用与列标题文本一起使用,并从表中获取一个值,如下所示:

=INDIRECT(ADDRESS(<absolute_line_number>;COLUMN(<table_name>[<column_name>])))

这对于公式来说是健壮的,因为如果用户重命名列,公式中对它的所有结构化引用都将自动更新。

但对于 VBA 代码并非如此。

对于工作表,可以定义Worksheet.CodeName在 VBA 代码中使用,如果用户重命名可见工作表名称,该代码将保持不变。Excel 表 AFAICS 不存在此类属性。


我目前最好的想法是使表格标题为 1 单元格命名范围。然后我可以从 VBA 中的表中获取一个值,如下所示:

<sheet_codename>.Cells(<line_number>,Range("<range_name>").Column)

然而,这让我很困扰,因为命名范围与表断开了连接。例如,如果我重新排列工作表上的表格,范围将保留在旧位置。

有更好的选择吗?“更好”具体指:

  • 可以在表格中重命名和/或重新排列列,至少在工作表内移动表格
4

2 回答 2

0

仔细观察,制作表格标题命名范围没有任何问题。这是因为这些名称被分配给结构化引用而不是原始单元格地址,因此它们将与列一起移动!

名称表条目

On the downside, this name is not printed in the address field (at least, in Office 2007) when selecting the header which is rather inconvenient ('cuz I can't quickly look up the name I should type into the code to get this柱子)。

没有显示范围名称

于 2019-03-11T03:41:49.550 回答
0

评论

ListObject如果列被重命名或重新排列,则a 的每个标题单元格中的注释会保留在那里。

如果(!)您可以隐藏所有评论Application.DisplayCommentIndicator = xlNoIndicator(所有评论既不能被红色三角形识别,也不能在鼠标悬停期间可见),这可能是一种解决方法:

Private Sub RecognizeColumnsOfListObject()
    Dim lo As ListObject
    Dim lc As ListColumn
    For Each lo In ActiveSheet.ListObjects
        For Each lc In lo.ListColumns
            Debug.Print lc.Index    ' not unique, always 1, 2, 3, ...
            Debug.Print lc.Name     ' not unique, changeable
            If Not lc.Range.Cells(1).Comment Is Nothing Then
                Debug.Print lc.Range.Cells(1).Comment.text ' unique
            End If
        Next lc
    Next lo
End Sub

命名范围

如果我给每个标题单元格ListObject命名,如果我重新排列 ListObject,它会随列一起移动。作为它的Name.ValueorName.RefersTo开头,=<ListObjectName>...我得到了绝对地址:

Dim n As Name
With <sheet_codename>
    For Each n In .Names
        Debug.Print .Range(Mid(n.RefersTo, 1)).Address
    Next n
End With
于 2019-03-10T11:11:09.613 回答