«CodeName» для столбца таблицы Excel для использования в VBA - PullRequest
0 голосов
/ 10 марта 2019

Я хотел бы иметь возможность получать значения из таблицы 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)

Это, однако, беспокоит меня, потому что именованные диапазоны отключены от таблицы.Например, если я переставлю таблицы на листе, диапазоны останутся на прежнем месте.

Есть ли лучший вариант? «Лучше» означает конкретно:

  • Переживает переименование и / или перестановку столбцов в таблице, перемещая таблицу по крайней мере в пределах листа

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Комментарий

Комментарий в каждой ячейке заголовка ListObject остается там, если столбец переименован или переставлен.

Если (!) , вы можетескрыть все комментарии 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.Value или Name.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
0 голосов
/ 11 марта 2019

При ближайшем рассмотрении, нет ничего плохого в создании заголовков таблиц именованных диапазонов. Это потому, что такие имена присваиваются структурированной ссылке, а не необработанному адресу ячейки, , поэтому они будут перемещаться вместе с колонкой!

names table entry

С другой стороны, это имя не печатается в поле адреса (по крайней мере, в Office 2007) при выборе заголовка, что довольно неудобно (потому что я не могу быстро найти имя, которое я должен ввести в коде чтобы получить этот столбец).

no range name shown

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...