Код VBA не копирует полный набор данных

Предполагается, что приведенный ниже код скопирует все соответствующие строки 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

Если первая строка содержит АЗИЯ (ПРИМ. БЛИЖНИЙ ВОСТОК), она останавливается на второй строке и т. д.

Почему мне не следует загружать изображения кода/данных/ошибок? . Пожалуйста, создайте таблицу MD с помощью онлайн-инструмента Генератор таблиц. Что содержится в ячейке А4? Ваш код манипулирует двумя листами, пожалуйста, определите все объекты Range (Range(), Cells()) с помощью объекта листа.
taller 09.06.2024 21:18
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
1
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • 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

Документация Майкрософт:

Свойство Range.Resize (Excel)

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.

Документация Майкрософт:

Свойство Range.CurrentRegion (Excel)

    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)»?

Malganas 09.06.2024 21:44

Я добавил примечание для CurrentRegion. Это может быть полезно и для вас.

taller 09.06.2024 21:46
Range(START_CELL) эквивалентен ActiveSheet.Range(START_CELL), но ActiveSheet может не быть предполагаемым листом. Поэтому лучше и надежнее всегда использовать <SheetObject>.Range(..).
taller 09.06.2024 21:48

Другие вопросы по теме