Предполагается, что приведенный ниже код скопирует все соответствующие строки REGION, например. АЗИЯ (ПРИМ. БЛИЖНИЙ ВОСТОК), но по какой-то причине ничего не происходит, если первая строка (без заголовка) не «АЗИЯ (ПРИМ. БЛИЖНИЙ ВОСТОК)».
Sub copy_data()
Dim count_col As Integer
Dim count_row As Integer
Dim og As Worksheet
Dim wb As Workbook
Dim region As String
Set og = Sheet1
region = og.Cells(1, 1).Text
Set wb = Workbooks.Add
wb.Sheets("Sheet1").Name = region
og.Activate
count_col = WorksheetFunction.CountA(Range("A4", Range("A4").End(xlToRight)))
count_row = WorksheetFunction.CountA(Range("A4", Range("A4").End(xlDown)))
ActiveSheet.Range("A4").AutoFilter Field:=2, Criteria1:=region
og.Range(Cells(4, 1), Cells(count_row, count_col)). _
SpecialCells(xlCellTypeVisible).Copy
wb.Sheets(region).Cells(1, 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
og.ShowAllData
og.AutoFilterMode = False
End Sub
Если первая строка содержит АЗИЯ (ПРИМ. БЛИЖНИЙ ВОСТОК), она останавливается на второй строке и т. д.


Cells(count_row, count_col) не является правой нижней ячейкой таблицы, поскольку таблица начинается не с A1. Для вашего сценария count_row=8 и count_col=4. Автофильтр применяется к диапазону A4:D8.
, исключая нужные строки, в которых указан регион ASIA (EX. NEAR EAST).og.Range(Cells(4, 1), Cells(count_row, count_col))
Код манипулирует двумя листами, пожалуйста, определите все объекты Range (Range(), Cells()) с помощью объекта листа.
Activate не обязательно, пожалуйста, прочитайте:
Как избежать использования Select в Excel VBA
Документация Майкрософт:
Sub copy_data()
Dim count_col As Long
Dim count_row As Long
Dim og As Worksheet
Dim wb As Workbook, sht As Worksheet
Dim region As String
Const START_CELL = "A4"
Set og = Sheet1
region = og.Cells(1, 1).Text
Set wb = Workbooks.Add
Set sht = ActiveSheet
sht.Name = region
With og.Range(START_CELL)
count_col = .End(xlToRight).Column
count_row = og.Cells(og.Rows.Count, 1).End(xlUp).Row - .Row + 1
.AutoFilter Field:=2, Criteria1:=region
.Resize(count_row, count_col).SpecialCells(xlCellTypeVisible).Copy
End With
sht.Cells(1, 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
og.ShowAllData
og.AutoFilterMode = False
End Sub
sperated (т. е. таблица окружена пустыми строками и столбцами), вы можете использовать CurrentRegion.Документация Майкрософт:
With og.Range(START_CELL)
.AutoFilter Field:=2, Criteria1:=region
.CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
End With
Спасибо также за объяснение, почему вышеизложенное не сработало! Для фона: я использовал видео на YouTube, в котором указан приведенный выше код. Когда вы пишете «пожалуйста, определите весь объект Range (Range(), Cells()) с объектом листа», вы имеете в виду, например, эту строку «With og.Range(START_CELL)»?
Я добавил примечание для CurrentRegion. Это может быть полезно и для вас.
Range(START_CELL) эквивалентен ActiveSheet.Range(START_CELL), но ActiveSheet может не быть предполагаемым листом. Поэтому лучше и надежнее всегда использовать <SheetObject>.Range(..).
Range(Range(), Cells()) с помощью объекта листа.