Vba excel количество строк в фильтре

 

Галина

Пользователь

Сообщений: 54
Регистрация: 25.12.2014

Добрый день!

Есть автофильтр примененный к таблице. Макросом фильтрую данные.
Как мне узнать сколько значений (=строк) отобразилось автофильтром?
Может отобразилась одна-две а может ноль. Нужна цифра отображенных строк.

 

yozhik

Пользователь

Сообщений: 957
Регистрация: 01.01.1970

#2

24.03.2017 12:53:35

добавьте в код

Код
MsgBox Application.WorksheetFunction.Subtotal(3, Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)))
 

Галина

Пользователь

Сообщений: 54
Регистрация: 25.12.2014

А у меня на ноль записей и на одну запись ставит единицу. Вот пример прикрепила. Если будет ноль записей у меня другая обработка должна пойти, т.е. важно отличать.

 

yozhik

Пользователь

Сообщений: 957
Регистрация: 01.01.1970

#4

24.03.2017 13:27:40

может кто проще предложит, но можно добавить проверку, существует ли критерий фильтра. Если нет, то и не фильтровать и присваивать переменной ноль

а и вообще если фильтр по одному полю — посчитать без фильтра количество «Чуркиных-Ивановых» и все

Код
Sub фильтр()
crit = "Чуркин"
If Not Columns(1).Find(what:=crit) Is Nothing Then
ActiveSheet.Range("$A$1:$AW$400000").AutoFilter Field:=1, Criteria1:=crit
q = Application.WorksheetFunction.Subtotal(3, Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)))
Else
q = 0
End If
MsgBox q
End Sub

Изменено: yozhik24.03.2017 13:30:25

 

Галина

Пользователь

Сообщений: 54
Регистрация: 25.12.2014

Нет, фильтр по нескольким полям в рабочем файле.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Вариант: в нужном диапазоне перебираем строки: если видимая (не скрыта), увеличиваем переменную на единичку.
Файл не смотрел.

 

yozhik

Пользователь

Сообщений: 957
Регистрация: 01.01.1970

#7

24.03.2017 14:19:54

вариант без проверок

Код
MsgBox Application.WorksheetFunction.Subtotal(3, Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1))) - 1

Subtotal в подсчет включает и строку с фильтром, отнимает 1

 

Владимир

Пользователь

Сообщений: 8196
Регистрация: 21.12.2012

E1:
=ПРОМЕЖУТОЧНЫЕ.ИТОГИ(3;A:A)-1

«..Сладку ягоду рвали вместе, горьку ягоду я одна.»

 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

#9

24.03.2017 15:01:43

ну можно ж высчитать если использовать

Range.SpecialCells

 xlCellTypeVisible  Для примера:
Range(«a1:a4»).SpecialCells(xlCellTypeVisible).Count

По вопросам из тем форума, личку не читаю.

If you try to count the number of rows in the already autofiltered range like this:

Rowz = rnData.SpecialCells(xlCellTypeVisible).Rows.Count

It will only count the number of rows in the first contiguous visible area of the autofiltered range. E.g. if the autofilter range is rows 1 through 10 and rows 3, 5, 6, 7, and 9 are filtered, four rows are visible (rows 2, 4, 8, and 10), but it would return 2 because the first contiguous visible range is rows 1 (the header row) and 2.

A more accurate alternative is this (assuming that ws contains the worksheet with the filtered data):

Rowz = ws.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1

We have to subtract 1 to remove the header row. We need to include the header row in our counted range because SpecialCells will throw an error if no cells are found, which we want to avoid.

The Cells property will give you an accurate count even if the Range has multiple Areas, unlike the Rows property. So we just take the first column of the autofilter range and count the number of visible cells.

The problem is that RowCount returns 1 instead of visible rows after filtering.

RowCount = Cells(Rows.Count, colIndex).End(xlUp).SpecialCells(xlCellTypeVisible).Row

Sub showEightmonth(ws, colName, colIndex)
Dim RowCount As Integer
    ws.Activate
    MsgBox ws.Name
    RowCount = Cells(Rows.Count, colIndex).End(xlUp).Row
    Set Rng = Range(colName & "1:" & colName & RowCount)

    If ws.AutoFilterMode = True Then
    ws.AutoFilter.ShowAllData
    End If

    Rng.Select
    Rng.NumberFormat = "mm/dd/yyyy hh:mm:ss"
    d = Format(DateAdd("m", -8, Date), "mm/dd/yyyy 07:00:00")
    Range(colName & "1").AutoFilter Field:=colIndex, Criteria1:="<" & d
    RowCount = Cells(Rows.Count, colIndex).End(xlUp).SpecialCells(xlCellTypeVisible).Row
    'Delete filtered row if RowCount > 1, as row 1 is the header row
    If RowCount > 1 Then
        delRow = colName & "2:" & colName & RowCount
        ActiveSheet.Range(delRow).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End If
    If ws.AutoFilterMode = True Then
    ws.AutoFilter.ShowAllData
    End If

End Sub

Community's user avatar

asked Jun 19, 2019 at 10:04

NordicFox's user avatar

To count the rows that are visible after applying a filter you would have to do this:

Sub countNonFiltered()

Dim sht As Worksheet
Dim colIndex As Long
Dim firstrow As Long
Dim RowCount As Long
Set sht = ThisWorkbook.Worksheets("worksheet name")
colIndex = 1    'let's assume you're interested in column A
firstrow = 2    'Let's assume your header is in row 1 and the data starts from row 2

With sht
    RowCount = .Range(.Cells(Rows.Count, 1).End(xlUp), .Cells(firstrow, colIndex)).SpecialCells(xlCellTypeVisible).Count
    Debug.Print RowCount
End With

End Sub

For demonstration purposes the code above prints the number of the visible rows in the immediate window.

Keep in mind that this:

Cells(Rows.Count, colIndex).End(xlUp)

is a range consisting of only one single cell. What you need instead is a range consisting of all the cells that belong to the rows that are still visible after applying the filter.

Also keep in mind that when you’re using variables that hold either row or column indexes, they should be declared as Long.

answered Jun 19, 2019 at 10:20

Stavros Jon's user avatar

Stavros JonStavros Jon

1,6852 gold badges6 silver badges17 bronze badges

0

0 / 0 / 0

Регистрация: 16.12.2010

Сообщений: 11

1

Определить количество отфильтрованных строк

20.12.2010, 14:49. Показов 17748. Ответов 8


Студворк — интернет-сервис помощи студентам

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



0



1508 / 478 / 56

Регистрация: 10.04.2009

Сообщений: 8,008

20.12.2010, 14:52

2

можете выложить то, что уже есть??



0



a.novikov

0 / 0 / 0

Регистрация: 16.12.2010

Сообщений: 11

20.12.2010, 15:52

 [ТС]

3

Дело в том, что еще ничего нету… Мне нужно, чтобы по отфильтрованным строкам пробегалась процедура

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   ' проход по основному листу
    For i = 2 To Sheets("Лист1").UsedRange.Rows.Count
        ' проход по скидкам
        For j = 2 To Sheets("Лист2").UsedRange.Rows.Count
            ' проверко
            If Sheets("Лист1").Range("C" & i).Value = Sheets("Лист2").Range("A" & j).Value And _
             DateValue(Sheets("Лист1").Range("B" & i).Value) >= Sheets("Лист2").Range("C" & i).Value And _
             DateValue(Sheets("Лист1").Range("B" & i).Value) <= Sheets("Лист2").Range("D" & i).Value Then
                ' форматирование
                With Sheets("Лист1").Range("C" & i).Interior
                    .Pattern = xlSolid
                    .PatternColorIndex = xlAutomatic
                    .ThemeColor = xlThemeColorAccent3
                    .TintAndShade = 0.399975585192419
                    .PatternTintAndShade = 0
                End With

т.е. на одном листе хранится перечень данных, а на основном листе (лист1) находится многотысячное количество строк, которые отфильтрованы. Вот среди отфильтрованных строк, необходимо найти определенные данные и закрасить цветом



0



1508 / 478 / 56

Регистрация: 10.04.2009

Сообщений: 8,008

20.12.2010, 16:38

4

В Эксле я ноль



0



0 / 0 / 0

Регистрация: 16.12.2010

Сообщений: 11

21.12.2010, 11:09

 [ТС]

5

может кто-то еще что подскажет



0



693 / 99 / 10

Регистрация: 25.06.2011

Сообщений: 718

21.02.2012, 20:11

6

a.novikov, а не закрашение вам нужны?



0



toiai

3217 / 966 / 223

Регистрация: 29.05.2010

Сообщений: 2,085

21.02.2012, 21:17

7

Visual Basic
1
2
3
4
5
6
With Sheets("Лист1")
       ' для каждого видимого ряда
       For each aRow in .Range(cells(1,1),cells(.UsedRange.Rows.Count,1).Specialcells(12).Row
        ......
       Next
end with



2



Апострофф

Заблокирован

21.02.2012, 21:19

8

Как-то так, наверно —

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
    For i = 2 To Sheets("Лист1").UsedRange.Rows.Count
      If Sheets("Лист1").Rows(i).RowHeight Then
        'Debug.Print "Строка " & i & " Лист1 видна!"
        For j = 2 To Sheets("Лист2").UsedRange.Rows.Count
          If Sheets("Лист2").Rows(j).RowHeight Then
            'Debug.Print "Строка " & j & " Лист2 видна!"
            ' проверко
            'далее по тексту
          endif
        next j
      End If
    Next i

А мы, как обычно, по колхозному



2



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

21.02.2012, 22:30

9

Диапазон, в котором работает автофильтр на активном листе, включая заголовок — это
activesheet.autofilter.range
Диапазон отфильтрованных (видимых) строк — это
activesheet.autofilter.range.specialcells(xlcellty pevisible)
Пробежать циклом по отфильтрованным строкам исключая заголовок можно так:

Visual Basic
1
2
3
4
5
6
7
8
Sub bb()
Dim r
With ActiveSheet.AutoFilter.Range
    For Each r In .Rows(2).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Rows
        r.Select 'например
    Next
End With
End Sub



0



Подсчет строк отфильтрованных данных

octopus

Дата: Четверг, 01.09.2016, 09:56 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Добрый день! не могу понять как в VBA узнать сколько строк в отфильтрованных данных.
В моем примере отфильтрованных строк 20, а макрос считает 40.

К сообщению приложен файл:

__—.xlsm
(17.2 Kb)


Не судите строго новичка…..

 

Ответить

SLAVICK

Дата: Четверг, 01.09.2016, 10:21 |
Сообщение № 2

Группа: Модераторы

Ранг: Старожил

Сообщений: 2290


Репутация:

766

±

Замечаний:
0% ±


2019

можно так:
[vba]

Код

Sub Скругленныйпрямоугольник1_Щелчок()
    LastRow = Sheets(«Лист1»).Cells(Rows.Count, 2).End(xlUp).Row
    [D1] = Range(«a2:a» & LastRow).SpecialCells(xlCellTypeVisible).Count
End Sub

[/vba]

К сообщению приложен файл:

9183267.xlsm
(15.5 Kb)


Иногда все проще чем кажется с первого взгляда.

 

Ответить

octopus

Дата: Четверг, 01.09.2016, 10:41 |
Сообщение № 3

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

SLAVICK, огромное спасибо! Очень выручили! hands


Не судите строго новичка…..

 

Ответить

#excel #vba #function #count

#excel #vba

Вопрос:

Я использую приведенный ниже код, чтобы получить количество отфильтрованных строк данных в VBA, но при получении количества отображается ошибка времени выполнения:

«Требуется объект».

Не могли бы некоторые сообщить мне, какие изменения необходимы?

 Set rnData = .UsedRange

With rnData
    .AutoFilter Field:=327, Criteria1:=Mid(provarr(q), 1, 2)
    .Select
    .AutoFilter Field:=328, Criteria1:=Mid(provarr(q), 3, 7)
    .Select
    .AutoFilter Field:=330, Criteria1:=Mid(provarr(q), 10, 2)
    .Select
    .AutoFilter Field:=331, Criteria1:=Mid(provarr(q), 12, 2)
    .Select

     Rowz = .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Rows.count

     ....
End With
  

Ответ №1:

Если вы попытаетесь подсчитать количество строк в уже автоматически отфильтрованном диапазоне следующим образом:

 Rowz = rnData.SpecialCells(xlCellTypeVisible).Rows.Count
  

Будет учитываться только количество строк в первой непрерывной видимой области автоматически отфильтрованного диапазона. Например, если диапазон автофильтра составляет строки с 1 по 10, а строки 3, 5, 6, 7 и 9 отфильтрованы, видны четыре строки (строки 2, 4, 8 и 10), но оно вернет 2, потому что первый непрерывный видимый диапазон — это строки 1 (строка заголовка) и 2.

Более точной альтернативой является это (при условии, что ws содержит рабочий лист с отфильтрованными данными):

 Rowz = ws.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
  

Мы должны вычесть 1, чтобы удалить строку заголовка. Нам нужно включить строку заголовка в наш диапазон подсчета, потому что SpecialCells выдаст ошибку, если ячейки не найдены, чего мы хотим избежать.

Cells Свойство предоставит вам точное количество, даже если диапазон имеет несколько областей, в отличие от Rows свойства. Итак, мы просто берем первый столбец диапазона автофильтра и подсчитываем количество видимых ячеек.

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

1. Спасибо за ваш ответ. Я использую Excel 2007. в приведенном выше коде отображается сообщение об ошибке как «Объект не поддерживает это свойство или метод».

2. Я думаю, что я только что понял. Я использовал приведенный ниже код для подсчета строк, и это сработало

3. При этом учитывается только количество строк в первом непрерывном диапазоне. Я собираюсь обновить ответ, чтобы он был более точным.

4. Решение «ячейки» — это то, что я искал. Спасибо 🙂

5. Спасибо за дополнительную информацию о свойстве «Ячейки против строк», я использую их годами, и это объясняет некоторые повторяющиеся проблемы.

Ответ №2:

Просто поместите это в свой код:

 Application.WorksheetFunction.Subtotal(3, Range("A2:A500000"))
  

Убедитесь, что вы применяете правильный диапазон, но только для ОДНОГО столбца

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

1. Идеальный. Решения, упомянутые выше, могут давать неправильные результаты в случае пустых строк в таблице и т. Д. Это работает как шарм 🙂

2. Для тех, кому потребуется его просмотреть, первый параметр указывает используемую агрегатную функцию; 3 — это «CountA», представляющее собой количество ячеек в столбце, которые не являются пустыми.

Ответ №3:

Хотя я согласен с приведенными результатами, они не сработали для меня. Если у вашей таблицы есть имя, это сработает:

 Public Sub GetCountOfResults(WorkSheetName As String, TableName As String)
    Dim rnData As Range
    Dim rngArea As Range
    Dim lCount As Long
        Set rnData = ThisWorkbook.Worksheets(WorkSheetName).ListObjects(TableName).Range
    With rnData
        For Each rngArea In .SpecialCells(xlCellTypeVisible).Areas
            lCount = lCount   rngArea.Rows.Count
        Next
        MsgBox "Autofilter " amp; lCount - 1 amp; " records"
    End With
    Set rnData = Nothing
    lCount = Empty      
End Sub
  

Это изменено для работы с ListObjects из оригинальной версии, которую я нашел здесь:

http://www.ozgrid.com/forum/showthread.php?t=81858

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

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

Ответ №4:

Я знаю, что это старая тема, но я обнаружил, что использование метода промежуточных итогов в VBA также точно отображает количество строк. Формула, которую я нашел, приведена в этой статье и выглядит следующим образом:

 Application.WorksheetFunction.Subtotal(2, .Range("A2:A" amp; .Rows(.Rows.Count).End(xlUp).Row))
  

Я протестировал его, и каждый раз он получался точно, отображая правильное количество видимых строк в столбце A.

Надеюсь, это поможет какому-нибудь другому путнику Сети, такому как я.

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

1. Правильно. Вы должны считать в обратном направлении

2. метод промежуточного итога 2 — «COUNT», он просто подсчитывает количество ячеек, содержащих числа

Ответ №5:

Я нашел способ сделать это, для чего требуется 2 шага, но это работает

 ' to copy out a filtered selection into a different sheet


number_of_dinosaurs = WorksheetFunction.Count(Worksheets("Dinosaurs").Range("A2", "A3000"))

With Worksheets("Dinosaurs")
    .AutoFilterMode = False
    With .Range("$A$4:$E$" amp; number_of_dinosaurs)
        .AutoFilter Field:=2, Criteria1:="*teeth*" ' change your criteria to whatever you like
        .SpecialCells(xlCellTypeVisible).Copy Destination:=Worksheets("Bad_Dinosaurs").Range("A1")
    End With
End With


' then do a normal count on the secondary sheet  

number_of_dinosaurs_that_eat_humans = WorksheetFunction.Count(Worksheets("Bad_Dinosaurs").Range("A2", "A30000"))
  

Ответ №6:

 Rowz = Application.WorksheetFunction.Subtotal(2, Range("A2:A" amp; Rows(Rows.Count).End(xlUp).Row))
  

Ответ №7:

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

Ответ №8:

 Rowz = Application.WorksheetFunction.Subtotal(2, Range("A2:A" amp; Rows(Rows.Count).End(xlUp).Row))
  

Это сработало для меня довольно хорошо

Понравилась статья? Поделить с друзьями:
  • Vba excel макросы модули
  • Vba excel макрос формула
  • Vba excel макрос условное форматирование
  • Vba excel макрос примеры
  • Vba excel массивы коллекции