Итак, прежде всего, я хочу написать код VBA, который позволяет мне выбрать определенный диапазон листа Excel, чтобы затем скопировать НЕКОТОРЫЕ из необходимых значений на другой лист. Проблема в том, что в листе Excel, из которого я беру информацию, применены некоторые фильтры.

Итак, я нашел решение с помощью метода (?). SpecialCells (xlCellTypeVisible), но проблема снова в том, что он работает для 1 столбца, но не для диапазонов с более чем одним столбцом. Для диапазонов с более чем одним столбцом выбирается только первая строка.

Dim rng As Range
Set rng = src.Worksheets("l04").Range(src.Worksheets("l04").Range("Z7:AK7"), src.Worksheets("l04").Range("Z7:AK7").End(xlDown)).SpecialCells(xlCellTypeVisible)

Мой ожидаемый результат от этой строки кода должен заключаться в том, что Range rng установлен от Z7 до AK7 вплоть до максимального количества строк, но только тех, которые видны.

Edit1: изменено SpecialCell -> SpecialCells

0
Ayibogan 21 Окт 2019 в 09:38
2
SpecialCell -> SpecialCells
 – 
DisplayName
21 Окт 2019 в 09:54
См. Пример кода в ответе, который я предоставил на этой странице: stackoverflow.com/questions/45626312/…
 – 
Tony M
21 Окт 2019 в 10:01

2 ответа

Dim cell As Range
Dim lastRow As Long
With src.Worksheets("104")
    lastRow = .Cells(.Rows.Count, "Z").End(xlUp).row
    With .Range("Z7:AK" & lastRow)
        For Each cell In .Columns(1).SpecialCells(xlCellTypeVisible)
            Debug.Print Intersect(.Cells, cell.EntireRow).Address ' change this to what you actually need to grab from each visible cell
        Next
    End With
End With
1
DisplayName 21 Окт 2019 в 15:52
Хорошо, я попробовал это, и это не сработало, как я предполагал, но я думаю, что обнаружил проблему, с которой столкнулся: .SpecialCells (xlCellTypeVisible) буквально сортирует КАЖДУЮ строку, в которой есть столбец, который не имеет значения. Есть ли способ сделать «сортировку строк» ​​зависимой от одного столбца? Так, например: если столбец Z имеет значение, включите эту строку в диапазон.
 – 
Ayibogan
21 Окт 2019 в 11:00
@Ayibogan, см. Отредактированный код. Если это помогло решить ваш вопрос, отметьте ответ как принятый Спасибо
 – 
DisplayName
21 Окт 2019 в 14:17
Спасибо за отредактированный код, но я думаю, вы не поняли мою проблему: я хочу, чтобы диапазон был от Z7 до AK1048576, но получать ТОЛЬКО строки, которые имеют ВИДИМОЕ значение в столбце Z.
 – 
Ayibogan
21 Окт 2019 в 14:29
Посмотрите, проблема с xlCellTypeVisible заключается в том, что он буквально сортирует каждую ячейку, которая невидима / не имеет значения. Однако я хочу, чтобы КАЖДАЯ строка, в которой столбец Z имеет значение, включалась в диапазон, даже если значение равно 0 / пусто. Разве это не возможно? Должен ли я вместо этого попытаться сохранить эти ячейки в двумерном массиве?
 – 
Ayibogan
21 Окт 2019 в 14:49

Основываясь на некоторых подсказках в вашем вопросе, вы можете обнаружить, что использование метода пересечения является выгодным.

Dim rng as Range

With src.Worksheets("l04")

    'gets all visible cells within the used range on your sheet    
    set rng = .UsedRange.SpecialCells(xlCellTypeVisible) 

    'Use the Intersect method to select specific columns
    set rng = Intersect(rng, .range("AB:AB, AD:AD"))

End With

Примечание. При этом выбирается не последняя строка (т.е. строка 1 048 576), а только последняя строка с данными в указанном диапазоне.

0
Judge 21 Окт 2019 в 10:31