SpecialCells(xlCellTypeVisible) не возвращает все значения в массив (Excel 2013)

У меня есть диапазон с 170000 строк в нем. Я фильтрую столбец A для одного значения и возвращаю соответствующие значения в столбце B.

Я хочу, чтобы эти значения выгружались в массив, чтобы я мог быстро бросить их в словарь (с ключом, являющимся значением, которое я отфильтровал столбец A).

Проблема в том, что SpecialCells(xlCellTypeVisible) ведет себя непоследовательно.

Если я проведу тот же тест на меньшем диапазоне, значения просто сбрасываются в массив. Но с таким большим диапазоном, как мой, он возвращает только первое значение в диапазоне. Кроме того, я могу использовать ту же строку для копирования на другой лист. Я просто не могу заставить его заполнить массив.

foo = ws1.Range(tbl1Name & "[ID]").SpecialCells(xlCellTypeVisible)

Работает с небольшими диапазонами, но возвращает только первый результат в таком большом диапазоне, как у меня (менее 50 результатов). foo становится массивом, содержащим все переменные.

ws1.Range(tbl1Name & "[ID]").SpecialCells(xlCellTypeVisible).Copy ws2.Range("A1")

Работает с большим диапазоном и успешно копирует все необходимые данные.

Итак, мой вопрос: как мне заполнить массив без дополнительного шага копирования на пустой лист при автофильтрации большого диапазона таблиц? (Excel 2013)


person Benjamin McIntire    schedule 06.11.2014    source источник
comment
Вы всегда можете попробовать цикл.   -  person Mr. Mascaro    schedule 06.11.2014
comment
Я вижу, что циклы использовались, чтобы обойти ограничение количества строк в предыдущих версиях, но, согласно всему, что я читал, мне не нужен цикл для этого.   -  person Benjamin McIntire    schedule 25.11.2014


Ответы (1)


EDIT: требуется ссылка на "Библиотеку объектов Microsoft Forms 2.0" (должна быть в верхней части списка доступных ссылок). Или добавьте пользовательскую форму в свой проект, и она автоматически добавит ссылку (затем вы можете удалить форму...)

Это должно работать для одного столбца:

Sub Tester()

    Dim rng, txt As String, cb As New DataObject, arr

    Set rng = ActiveSheet.Range("A2:A28").SpecialCells(xlCellTypeVisible)

    rng.Copy
    DoEvents
    cb.GetFromClipboard
    txt = cb.GetText
    arr = Split(txt, vbCrLf)
    Debug.Print LBound(arr), UBound(arr)

End Sub

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

person Tim Williams    schedule 06.11.2014
comment
Получаю перерыв в code Dim cb As New DataObject, и я не вижу библиотеки объектов Microsoft Forms 2.0 в моем списке ссылок... - person Benjamin McIntire; 25.11.2014
comment
Решение состоит в том, чтобы добавить пользовательскую форму, и ссылка будет добавлена ​​автоматически. - person Benjamin McIntire; 25.11.2014