Прежде всего, абсолютно необходимо избегать использования 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