2012-08-16 2 views
0

У меня есть таблица данных с фильтрами верхней строки, у меня есть цикл, который изменяет, какой фильтр необходимо использовать внутри цикла, это переменная filterColumn, которому присваивается новое значение каждый раз цикл проходит.Проблема с макросом макросов Excel с переменной

, когда я пытаюсь использовать filterColumn, чтобы определить, какой фильтр будет 'включен' я получаю сообщение об ошибке

Автофильтр метод Range Class Failed

ActiveSheet.Range("$U$83:$CV$1217").AutoFilter Field:=filterColumn, Criteria1:="<>"

Что такое правильный синтаксис, чтобы использовать переменную, чтобы определить, в каком поле находится фильтр?

Решение проблемы Я нашел решение. Я ссылался на позицию столбцов фильтров в терминах всего рабочего листа, когда на самом деле я должен был ссылаться на число, которое было в группе фильтров. Например, фильтр, который я хотел изменить, был в «CF», который является 84-м столбцом, но мой фильтр, который я хотел изменить, является 64-м в группе.

ответ

2
Dim filterColumn As Integer 
filterColumn = 2 
ActiveSheet.Range("$U$83:$CV$1217").AutoFilter Field:=filterColumn, _ 
    Criteria1:="<>" 
+0

Я пробовал, что изначально у меня был «Dim filterColumn as int», но он все равно не работает в любом случае – aconnelly

+0

Можете ли вы заставить его работать без использования переменной? –

+0

Да, если я изменяю поле: = filterColumn to Field: = 64, он работает для фильтра в 64-й колонке.Таким образом, проблема связана с полем: = filterColumn – aconnelly

1

EDIT: Я пытался @ решение HeadofCatering и изначально не удалось. Однако я заполнил значения в ссылочных столбцах, и он работал (мое решение также потерпело неудачу в обратных условиях - сделайте заголовки столбцов пустыми, и он не работает).

Однако это не совсем похоже на то, что я видел (и, вероятно, вы), - вы можете определенно добавить фильтры к столбцам с пустыми заголовками. Однако в результате неудач, которые я видел, было одно: filterColumn ссылался на столбец, который находился за пределами Application.UsedRange. Возможно, вам захочется проверить, что столбец, на который вы ссылаетесь, фактически находится в пределах Application.UsedRange (простой способ: запустите Application.UsedRange.Select в окне Immediate и посмотрите, выбран ли ваш столбец). Поскольку вы ссылаетесь на приличное количество столбцов, возможно, что нет значений за определенную точку (включая заголовки столбцов), и когда вы укажете столбцы для фильтрации, вы фактически указываете что-то вне своего UsedRange.

Интересные (это ново для меня, а) вещи для проверки принимает чистый лист, подставляя значения в ячейках A1 и B1, выбирая столбцы A:G и вручную добавлять автофильтры - это только добавят фильтров столбцов А и B (связанная ситуация может быть найдена, если вы попытаетесь добавить фильтры на совершенно чистый лист).

Извините за болтовню - скорее всего, это даже не ваша проблема :)


Старый раствор (не работает при использовании условий, описанных выше)

Может быть, я (обратите внимание, что я использовал здесь диапазон выборки):

Sub SOTest() 

Dim ws As Worksheet 
Dim filterColumn As Integer 

' Set the sheet object and declare your variable 
Set ws = ActiveSheet 
filterColumn = 2 

' Now try the filter 
ws.Range("$A$1:$E$10").AutoFilter Field:=filterColumn, Criteria1:="<>" 

End Sub 
+0

OP говорит, что автофильтр работает, если он жестко кодирует 64 вместо переменной. Ссылка на лист не является проблемой. –

+0

@HeadofCatering Да, я отредактировал свой ответ (и оставил старый/неправильный там для потомков :)) - моя лучшая догадка - это проблема «Application.UsedRange», упомянутая выше, но это так, как вы говорите - там должно быть, что-то еще происходит. – RocketDonkey

+0

Не думайте, что usedrange тоже проблема. Если работает жесткое кодирование 64, то передается целочисленная переменная со значением 64. –

Смежные вопросы