Вопрос:

Столбец заполнения таблицы Excel VBA (ListObject) с результатом операции между другими столбцами таблицы

excel vba excel-vba

545 просмотра

2 ответа

37 Репутация автора

В Excel VBA я не могу найти способ заполнить столбец (ListColumns) в таблице (ListObjects) с помощью операции над двумя или более столбцами таблицы, используя номер индекса вместо использования заголовков в строке. Так, например, я знаю, что это работает при использовании:

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

Но, скажем, «Распространение» - это столбец 10, а «Текущий» - это столбец 5, а «Исторический» - это столбец 7. Есть ли способ сделать что-то вроде следующего, чтобы заполнить столбец? Я знаю, что это не работает, но я надеюсь, что есть что-то похожее, что я делаю, поскольку я пробовал различные методы и не могу найти это в поиске.

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

Спасибо за помощь.

Автор: fmc100 Источник Размещён: 08.11.2017 10:33

Ответы (2)


2 плюса

2192 Репутация автора

Решение
lo.ListColumns(10).DataBodyRange = "=[" & lo.ListColumns(5).Name & "]-[" & lo.ListColumns(7).Name & "]"
Автор: Excelosaurus Размещён: 08.11.2017 10:39

0 плюса

3982 Репутация автора

Есть ли конкретная причина, по которой вы хотите использовать INDEX, а не заголовок столбца? Использование жестко закодированных индексных чисел не делает надежный код ... это означает, что если вы (или кто-то еще) позже измените компоновку своей таблицы, вам придется просмотреть свой код и изменить эти жестко закодированные ссылки. Это именно то, что ссылка ListObject была разработана, чтобы избежать (как с точки зрения VBA и формул).

Гораздо лучше использовать заголовки столбцов, как в вашем примере. Если есть вероятность, что кто-то изменит имена столбцов, тогда установите Именованный диапазон, чтобы он указывал на соответствующие списки столбцов и ссылался на эти именованные диапазоны в вашем коде.

Если все, что вы хотите сделать, это найти номер 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)
Автор: jeffreyweir Размещён: 09.11.2017 12:45
32x32