выбор SpecialCells (xlCellTypeVisible) из определенных столбцов таблицы ListObject

Я пытаюсь получить в объект диапазона только видимые ячейки определенных столбцов таблицы ListObject.

Похоже, это не работает.

dim rng as range
with activesheet.listobjects("Tab_data").databodyrange
    set rng=.specialcells(xlcelltypevisible)
end with

но это работает, когда я выбираю весь диапазон, а затем смещаю 1-й столбец, чтобы выбрать другие 2 обязательных столбца!

dim rng as range
with activesheet.usedrange
    Set rng = .Offset(1, 1).Resize(.Rows.Count-1, .Columns.Count-1).SpecialCells(xlCellTypeVisible)
end with

но я не могу использовать приведенное выше в формуле, поскольку моя формула относится только к 2 столбцам в листобъекте, показанном ниже:

введите описание изображения здесь

Формула UDF на листе:

=TagCloud(RngWrdLst as Range)

и я использую его как:

=TagCloud(tab_data[[Brands]:[Index]])

Как вы можете видеть на изображении, мне нужны только видимые диапазоны ячеек из столбцов «Бренды» и «Индекс», а не ячейки из столбца «КОЛОНКА».

Итак, видимые диапазоны, которые я хотел бы иметь:

"$B$2:$C$3,$B$45:$C$45,$B$75:$C$78"

редактировать для @Jeeped:

Если у меня есть функция UDF, которая вызывается из ячейки листа и передается диапазон ListObject столбцов B и C (только эти столбцы, а не весь диапазон данных), то как мне найти видимый диапазон RngWrdLst?

e.g.

звонок с листа:

=TagCloud(tab_data[[Brands]:[Index]])

Определение функции:

Function TagCloud(RngWrdLst As Range)
Dim VisibleRng As Range

With RngWrdLst
    Set VisibleRng = Intersect(.SpecialCells(xlCellTypeVisible), Union(.Columns(2), .Columns(3)))
    Debug.Print VisibleRng.Address(0, 0)
End With

'   do something with the visibleRng......
End Function

Кстати, RngWrdLst будет содержать 2 столбца B и C. Итак, как мне изменить ваш код и получить только видимый диапазон из функции?


person sifar    schedule 23.03.2016    source источник
comment
Уже есть собственные функции рабочего листа, такие как SUBTOTAL и AGGREGATE что делать это. Какой у тебя финал?   -  person    schedule 24.03.2016
comment
@jeeped Я фактически фильтрую листобъект с помощью списка, который заполнен элементами из 1-го столбца объекта списка. Конечная игра - использовать видимые слова из 2-го столбца и их индексы из 3-го столбца, чтобы создать облако тегов слов. Размер шрифта слов будет зависеть от его индекса. Цвет шрифта - это любой выбранный цветовой градиент от светлого к темному (от большого к маленькому).   -  person sifar    schedule 24.03.2016
comment
@jeeped кажется, что listobject действительно не скрывает строки (особенно целые строки), поэтому полный адрес диапазона отображается как видимый адрес. Принимая во внимание, что Activesheet.usedrange, похоже, принимает во внимание все строки как скрытые, поэтому он может указать адрес видимого диапазона.   -  person sifar    schedule 24.03.2016
comment
Мне действительно нужен обходной путь, чтобы получить видимый диапазон из диапазонов столбцов listobject, которые передаются функции. Кроме того, Subtotal и Aggregate хороши для подсчета количества видимых строк, но они не возвращают объект видимого диапазона из объекта списка.   -  person sifar    schedule 24.03.2016
comment
Ваш первый фрагмент кода должен работать. Вы проверили, что было возвращено для rng.Address в ближайшем окне?   -  person Excel Developers    schedule 24.03.2016
comment
какой код вы имели в виду? да, он показывает только полный диапазон, то есть A1: C201 или B1: C201 и т. д.   -  person sifar    schedule 24.03.2016
comment
см. раздел редактирования для @Jeeped: в моем исходном сообщении ... проще говоря, я не могу отправить параметр диапазона в определяемую пользователем функцию, вызываемую из ячейки рабочего листа, и, наконец, получить видимый диапазон из этой функции. Пожалуйста, обратите внимание, функция будет работать, если я не отправлю в нее какие-либо параметры, но это противоречит моей первоначальной цели.   -  person sifar    schedule 24.03.2016


Ответы (1)


Используйте метод пересечения на метод объединения нужных столбцов.

Dim rng As Range
With ActiveSheet.ListObjects("Tab_data").DataBodyRange
    Set rng = Intersect(.SpecialCells(xlCellTypeVisible), _
                        Union(.Columns(2), .Columns(3)))
    Debug.Print rng.Address(0, 0)
End With

Или же сместите первый столбец вправо и измените размер на один столбец меньше, чем . Свойство DataBodyRange содержит.

Dim rng As Range
With ActiveSheet.ListObjects("Tab_data").DataBodyRange
    With .Resize(.Rows.Count, .Columns.Count - 1).Offset(0, 1)
        Set rng = .SpecialCells(xlCellTypeVisible)
    End With
    Debug.Print rng.Address(0, 0)
End With

В зависимости от того, что вы хотите делать с rng, вам, возможно, придется пройти через Range.Areas свойство.

person Community    schedule 23.03.2016
comment
здорово. 1-й работает нормально, но 2-й дает мне только столбец B, а не B и C. Также мой вопрос: я вызываю функцию tagcloud, передавая ей диапазон listobject под названием RngWrdLst. RngWrdLst состоит из столбцов B и C. как мне узнать видимые ячейки этого диапазона в коде? - person sifar; 24.03.2016
comment
1) Извините за второе. Я неправильно набрал смещение столбца как 0, а не 1. Изменено выше. 2) Если вы пройдете acrtoss rng, это все, что вам нужно сделать. Он может иметь более одной области (см. Ссылку выше), но в нем есть все ячейки. - person ; 24.03.2016
comment
приведенное выше по-прежнему дает мне только столбец C, а не B и C. Кроме того, мой основной запрос для реализации вашего кода будет заключаться в том, что у меня есть функция, вызываемая из ячейки, передающей столбцы B, C объекта ListObject, тогда как мне найти видимые ячейки этого диапазона? - person sifar; 24.03.2016
comment
а) Вау ... Я правда сегодня не думаю. Когда диапазон смещен, нет необходимости его пересекать. б) Написанный мной код вернет диапазон, если он написан как функция. - person ; 24.03.2016