Excel AdvanceFilter vba copyToRange работает только для самой верхней строки

#excel #vba #excel-tables #advanced-filter

#excel #vba #excel-таблицы #расширенный-фильтр

Вопрос:

У меня есть лист «RM» в рабочей книге и еще один лист «ST» в той же рабочей книге. «RM» имеет Table2, а «ST» — таблицу 3

Я использую следующий код для копирования из RM на другой лист «Andy» refName — это критерий в «Andy», а topRowName — строка «Andy!B1:M1»

 Sheets("RM").Range("Table2[#All]").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range(refName), CopyToRange:=Range(topRowName), Unique:= _
        False
  

Пока все хорошо, все работает
Теперь я хочу скопировать из «ST» также в «Andy», но вставить его на несколько строк ниже «topRowName», чтобы он не перезаписывался, поэтому я делаю смещение

 Sheets("ST").Range("Table3[#All]").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range(refName), CopyToRange:=Range(topRowName).Offset(5), Unique:= _
        False
  

но он выдает ошибку 1004 «В извлеченном диапазоне отсутствует или недопустимое имя поля»

Я попытался жестко запрограммировать значения в диапазоне следующим образом

 Sheets("RM").Range("Table2[#All]").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range(refName), CopyToRange:=Range(Andy!B5:M5), Unique:= _
        False
  

Но это все равно не работает. Это потому, что в месте вставки есть таблица? я попытался изменить размер таблицы, чтобы она не конфликтовала с новой вставкой, но это не помогло. Любая помощь приветствуется

Комментарии:

1. Проверьте определения вашего рабочего листа. Как определяется вкладка диапазона (refName)? Может ли CriteriaRange быть на любом листе (я не знаю)? Как определяется диапазон (topRowName)? Range(Andy!B5:M5) неправильный синтаксис. Таблицы 2 и таблица3 могут быть построены по-разному. Попробуйте использовать имена диапазонов таблиц вместо [#All]. Наконец, попробуйте запустить второй фильтр независимо от первого. Если оба работают независимо, но не вместе, проблема будет другой.

2. Это может быть один из немногих случаев, когда Activate требуется. С Advanced Filter CopyToRange помощью метода рабочий лист, на который вы копируете, должен быть ActiveSheet .

Ответ №1:

Спасибо всем, я нашел ответ на причину, по которой это происходило. Мне нужно было очистить содержимое места, в которое я вставляю. По-видимому, Excel не любит копировать содержимое в диапазон, если что-то уже присутствует, в частности, ListObject, такой как таблица. Я предположил, что он просто напишет поверх него.