Фильтрация в столбце и копирование данных из другого столбца - PullRequest
0 голосов
/ 11 марта 2020

У меня есть код ниже, где он фильтрует 1 в столбце AT с листа 1 и пытаюсь скопировать данные в столбцах AS, E, C и вставить в лист 2. Проблема в том, что он не может скопировать все данные в E и C, если в середине есть пробелы, поскольку end (xldown) может копировать только до первой пустой ячейки. Может ли кто-нибудь помочь мне исправить это так, чтобы после фильтрации 1 в столбце AT код мог копировать данные в столбцах E и C от начала до конца.


        Worksheets(worksheet1).select
Rows("3:3").select
Selection.autofilter
Range(AT).slect
Activehseet.Range("$A$3:$AT$1185").Autofilter Field:=46, Criteria:="1"
Range("AS4").Select
Range(Selction, Selection.End(xldown)).select
Selection.copy
  • так же, как выше для копирования данных в столбцы E и C

1 Ответ

0 голосов
/ 11 марта 2020

Прежде всего, абсолютно необходимо избегать использования Select в Excel VBA для создания надежного кода.

Вторая проблема заключается в том, что, как вы узнали, Selection.End(xlDown) будет go вниз до следующей свободной ячейки. Чтобы найти самую последнюю использованную ячейку в столбце, вам нужно начать с самой последней ячейки и go xlUp:

Set LastUsedCell = Cells(Rows.Count, "AS").End(xlUp)

Таким образом, чтобы избавиться от всех .Select и Selection операторы сначала объявляют переменную, которая работает как ссылка на ваш рабочий лист:

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("SheetName")

Теперь вы можете получить доступ к этому рабочему листу, используя ws без необходимости его выбора. Затем вам нужно найти последнюю использованную строку в столбце AT. В противном случае ваш фильтр, использующий Range("$A$3:$AT$1185"), ограничен 1185.

Dim LastUsedCell As Range
Set LastUsedCell = ws.Cells(ws.Rows.Count, "AS").End(xlUp)

ws.Range("$A$3", LastUsedCell).Autofilter Field:=46, Criteria:="1"

Если вы теперь хотите копировать только отфильтрованные данные, вам нужно убедиться, что вы получаете только видимые ячейки в отфильтрованном диапазоне, потому что ws.Range("$A$3", LastUsedCell) будет относиться ко всем ячейкам в этом диапазоне, а не только к тем, которые вы отфильтровали.

Dim FilteredData As Range
On Error Resume Next  'next line will throw an error if there are no visible cells
Set FilteredData = ws.Range("$A$4", LastUsedCell).SpecialCells(xlCellTypeVisible)
On Error Goto 0  'don't forget to re-enable error reporting!

Наконец, вам нужно проверить, были ли обнаружены видимые ячейки:

If FilteredData Is Nothing Then
    MsgBox "No filtered data found"
    Exit Sub
End If

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