Имитация объекта AdvancedFilter CriteriaRange через массив - PullRequest
2 голосов
/ 20 сентября 2019

Справочная информация

Это может оказаться довольно глупым вопросом, однако я все же хочу задать его, чтобы быть уверенным.Недавно я познакомился с AdvancedFilter через VBA, и чтение параметра CriteriaRange принимает тип данных Variant. Я думал, что он мог бы взять массив вместо фактического * 1012.* как следует из названия.

Пример данных

Для этого я настроил простой набор данных:

| Hdr1 | Hdr2 | Hdr3 |
|------|------|------|
| A    | X    | 1    |
| B    | Y    | 2    |
| A    | Z    | 3    |
| A    | Y    | 4    |
| B    | Y    | 5    |
| A    | Z    | 6    |

Эти данные находятся на листе с CodeName «Источником».Кроме того, я добавил лист «Место назначения», где я хочу, чтобы отфильтрованные критерии были вставлены через xlFilterCopy.

Код

Простой рабочий код будет выглядеть так:

Sub FilterTest()

Dim rng as range
Dim arr(1 To 2, 1 To 3) As Variant

arr(1, 1) = "Hdr1"
arr(1, 2) = "Hdr2"
arr(1, 3) = "Hdr3"
arr(2, 1) = "A"
'arr(2, 2) = "" 'Leaving empty for now
'arr(2, 3) = "" 'Leaving empty for now

Set rng = Destination.Range("A1:C2")
rng = arr

Source.Range("A1:C7").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=rng, CopyToRange:=Destination.Range("A4")

End Sub

Проблема / Любопытство

Поскольку вышеприведенное работает нормально, мне любопытно, есть ли способ избежатьзаполнение CriteriaRange до применения AdvancedFilter или даже непосредственное использование массива arr.Как я полагаю, мы не можем этого сделать, но мне любопытно, что это не так.

В то время как заполнение rng равномерного размера с помощью arr работает, очевидно, следующая строка выдаст ошибку (1004):

Source.Range("A1:D7").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=arr, CopyToRange:=Destination.Range("A4")

Тип данных Variant для CriteriaRange представляется ожидаемым (согласно документации), но, по-видимому, только объекты Range являются фактическими рабочими параметрами.

Любой определенный ответ относительно того, возможно ли это?=) * +1058 *

...