2015-10-01 1 views
1

Я пытаюсь автоматизировать обработку различных отчетов, которые мне просто нужно фильтровать и подсчитывать строки. В настоящее время у меня есть сценарий PowerShell, который открывает каждый отчет и запускает несколько макросов. Это примерно в рабочем состоянии, но теперь я хотел бы сделать его немного более умным и поймать некоторые из неудач, поэтому я мог бы задать несколько вопросов, но я буду придерживаться одной проблемы для каждого.Как я могу автофильтировать, когда я не уверен, какой столбец он будет?

Отчеты имеют похожие, но не идентичные макеты. Я ищу конкретное имя столбца, а затем автофильтр. У меня есть очень простой и bodged вместе макрос, который в настоящее время делает это, и работает (в большинстве случаев), например, иногда колонки я хочу А или Б:

If Worksheets(1).Range("A1") Like "*word" Then 
    Worksheets(1).Range("A1").AutoFilter Field:=1, Criteria1:="=criteria1", Operator:=xlOr, Criteria2:="=criteria2" 

ElseIf Worksheets(1).Range("B1") Like "*word" Then 
    Worksheets(1).Range("A1").AutoFilter Field:=2, Criteria1:="=criteria", Operator:=xlOr, Criteria2:="=criteria2" 

Будем надеяться, что дает текущую картину.

Теперь я хочу вместо этого выполнить поиск заголовка поля, который я ищу, а затем отфильтровать этот столбец, поэтому, если формат отчета в будущем изменится, мой макрос не сломается. Нечто похожее на:

ColNum = Application.Match("*header", Range("A:Z"), 0) 
ColNumInt = CInt(ColNum) 

If ColNumInt > 0 Then 
    ActiveSheet.Range("A1").AutoFilter Field:=ColNumInt, Criteria1:="=criteria1*", Operator:=xlAnd 
End If 

Но это дает ошибку «метод автофильтр класса Range не удалось», Googlefu говорит отключить фильтры, но они уже выключен. Поэтому я немного застрял.

ответ

2

Эта часть всегда будет терпеть неудачу:

ColNum = Application.Match("*header", Range("A:Z"), 0) 

поскольку матч работает только на одной строке или столбце. Таким образом, ваш код на самом деле возвращает Error 2042, который затем преобразуется в 2042 CInt. Я думаю, у вас нет такого количества столбцов данных, поэтому автофильтр терпит неудачу. Использование:

ColNum = Application.Match("*header", Range("A1:Z1"), 0) 
If Not IsError(ColNum) Then 
... 
End If 
+0

Это сработало, спасибо. Из интереса есть лучший способ следить за такими ошибками? – Chris

+1

Лучше, каким образом? 'IsError' поймает какую-либо ошибку здесь. – Rory

+0

Извините, как и в том, что я не понимал, что Match выбрасывает ошибку, и это была настоящая причина отказа фильтра, проходящая через макрос. Может ли это быть «обработано» лучше? – Chris

1

Это должно сработать для вас.

Sub Button1_Click() 
    Dim r As Range 
    Dim c As Integer 

    Set r = Range("A1:B1").Find(what:="*word*", lookat:=xlWhole) 
    c = r.Column 
    ActiveSheet.AutoFilterMode = 0 

    Columns(c).AutoFilter Field:=1, Criteria1:="*criteria1*" 
End Sub 
+0

Спасибо за ответ, я провел быстрый тест, и это тоже сработало. Я пометил предыдущий ответ так же правильно, как и меня особенно интересовал, как ошибка была преобразована и прошла, поэтому, надеюсь, это также поможет другим. – Chris

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