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

 

Галина

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

Сообщений: 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

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

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 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

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

 

БМВ

Модератор

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

Excel 2013, 2016

#9

24.03.2017 15:01:43

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

Range.SpecialCells

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

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

0 / 0 / 0

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

Сообщений: 11

1

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

20.12.2010, 14:49. Показов 17742. Ответов 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))
  

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

Понравилась статья? Поделить с друзьями:
  • Excel vba кодировка файла
  • Excel vba код символа кавычки
  • Excel vba изменить имя листа
  • Excel vba изменить высоту строки
  • Excel vba измененная ячейка