2016-12-06 2 views
3

Я пытаюсь отфильтровать определенные критерии, в данном случае Anything Like -SERVICE CODE Я фильтрую это в имени столбца, а не в столбце, представленном A: A. Часть FIrst кода работает нормально, оператор If - это то, где у меня возникают проблемы. Я создал оператор If, чтобы иметь возможность сделать что-то, если есть фактический ряд данных, который отображается для фильтра -SERVICE CODE, в этом случае он должен показывать «Данные», если есть хотя бы одна строка, которая фильтруется, проблема в том, что он показывает сообщение «Данные», даже если нет ничего, что показано при фильтрации.Excel VBA - IF Autofilter не содержит записей, MsgBox

Я пытаюсь выяснить, как получить Msg of No Data, чтобы показывать правильно, когда нет ничего, что соответствует критериям фильтра.

Спасибо,

Sub Filter results() 

Dim rng As Range, res As Variant 

Set rng = ActiveSheet.AutoFilter.Range.Rows(1) 
res = Application.Match("Errors", rng, 0) 
rng.AutoFilter Field:=res, Criteria1:="*-SERVICE CODE*" 

If rng.SpecialCells(xlCellTypeVisible).Count > 1 Then 
    MsgBox "Data" 
Else 
    MsgBox "No Data" 
End If 

End Sub() 
+0

У вас всегда есть ячейки в 'rng'? Если так, функция 'Count' возвращает количество ячеек, независимо от того, есть ли в них данные или нет? Не уверен, просто предложение. Можете ли вы прокомментировать, что возвращает 'rng.SpecialCells (xlCellTypeVisible)'? – AER

+0

Похож, что 'rng' - это строка заголовка, поэтому она всегда видна и всегда возвращает больше 1. Измените диапазон видимых ячеек, которые вы считаете' A: A', и он должен работать нормально. –

+0

@AER Здравствуйте, он возвращает только строку заголовка, если критерии не совпадают. – MrLockett

ответ

1

Используя код, я определил последнюю строку использованного диапазона (при условии, что всегда есть данные в столбце A, переключитесь на другой с olumn if not), поскольку любые ячейки за последней строкой будут отображаться как видимые. Затем видимый счетчик выполняется только в этом столбце до последней строки.

Sub FilterResults() 

Dim rng As Range, res As Variant, lrow As Long 

Set rng = ActiveSheet.AutoFilter.Range.Rows(1) 
res = Application.Match("Errors", rng, 0) 
rng.AutoFilter Field:=res, Criteria1:="*-SERVICE CODE*" 

lrow = ActiveSheet.Cells(Rows.Count, res).End(xlUp).Row + 1 

If ActiveSheet.Range(Cells(1, res), Cells(lrow, res)).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then 
    MsgBox "Data" 
Else 
    MsgBox "No Data" 
End If 

End Sub 
+0

Сделано отредактировано, протестировано и работает на моей машине: '.cells.count' –

+0

Это сработало, мне пришлось изменить число после подсчета, чтобы скорректировать число столбцов, в этом случае столбец U, который равен« 21 », , Последующий вопрос, есть ли способ сделать эту работу основанной на именах столбцов? Эти столбцы часто меняются, и когда новый пользователь использует отчет, я хочу, чтобы обслуживание было минимальным, поэтому вместо ссылки на столбцы U1: U есть способ ссылаться на него по имени? Большое вам спасибо за вашу помощь. – MrLockett

+0

Перемещено вычисление 'lrow' и повлияло на номер столбца' res', теперь оно считается последним сообщением об ошибке как последней строкой, но поскольку это все, что вы ищете, оно работает. оператор if был изменен для подсчета столбца 'res'. –

1

вы могли бы использовать Application.WorksheetFunction.Subtotal(103, rng.Resize(, 1)), чтобы проверить, сколько клеток были отфильтрованы и проверить есть больше чем один (заголовки будут всегда фильтруется) в колонке

как в этом мало рефакторинга кода

Sub FilterResults() 
    Dim res As Variant 

    With ActiveSheet.Rows(1) 
     res = Application.Match("Errors", .Cells, 0) 
     If Not IsError(res) Then 
      .AutoFilter Field:=res, Criteria1:="*-SERVICE CODE*" 
      If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then '<--| if any cell filtered other than header (which is in row 3) 
       MsgBox "Data" 
       With .SpecialCells(xlCellTypeVisible) 
        ' code 
       End With 
      Else 
       MsgBox "No Data" 
      End If 
     End If 
    End With 
End Sub 
+0

@MrLockett, вы попробовали это? – user3598756

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