Галина Пользователь Сообщений: 54 |
Добрый день! Есть автофильтр примененный к таблице. Макросом фильтрую данные. |
yozhik Пользователь Сообщений: 957 |
#2 24.03.2017 12:53:35 добавьте в код
|
||
Галина Пользователь Сообщений: 54 |
А у меня на ноль записей и на одну запись ставит единицу. Вот пример прикрепила. Если будет ноль записей у меня другая обработка должна пойти, т.е. важно отличать. |
yozhik Пользователь Сообщений: 957 |
#4 24.03.2017 13:27:40 может кто проще предложит, но можно добавить проверку, существует ли критерий фильтра. Если нет, то и не фильтровать и присваивать переменной ноль а и вообще если фильтр по одному полю — посчитать без фильтра количество «Чуркиных-Ивановых» и все
Изменено: yozhik — 24.03.2017 13:30:25 |
||
Галина Пользователь Сообщений: 54 |
Нет, фильтр по нескольким полям в рабочем файле. |
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Вариант: в нужном диапазоне перебираем строки: если видимая (не скрыта), увеличиваем переменную на единичку. |
yozhik Пользователь Сообщений: 957 |
#7 24.03.2017 14:19:54 вариант без проверок
Subtotal в подсчет включает и строку с фильтром, отнимает 1 |
||
Владимир Пользователь Сообщений: 8196 |
E1: «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
БМВ Модератор Сообщений: 21376 Excel 2013, 2016 |
#9 24.03.2017 15:01:43 ну можно ж высчитать если использовать Range.SpecialCells xlCellTypeVisible Для примера: По вопросам из тем форума, личку не читаю. |
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 |
|||
Дело в том, что еще ничего нету… Мне нужно, чтобы по отфильтрованным строкам пробегалась процедура
т.е. на одном листе хранится перечень данных, а на основном листе (лист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 |
|||
2 |
Заблокирован |
||||
21.02.2012, 21:19 |
8 |
|||
Как-то так, наверно —
2 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
21.02.2012, 22:30 |
9 |
|||
Диапазон, в котором работает автофильтр на активном листе, включая заголовок — это
0 |
Подсчет строк отфильтрованных данных |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
#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))
Это сработало для меня довольно хорошо