Галина Пользователь Сообщений: 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 |
Нет, фильтр по нескольким полям в рабочем файле. |
Юрий М Модератор Сообщений: 60575 Контакты см. в профиле |
Вариант: в нужном диапазоне перебираем строки: если видимая (не скрыта), увеличиваем переменную на единичку. |
yozhik Пользователь Сообщений: 957 |
#7 24.03.2017 14:19:54 вариант без проверок
Subtotal в подсчет включает и строку с фильтром, отнимает 1 |
||
Владимир Пользователь Сообщений: 8196 |
E1: «..Сладку ягоду рвали вместе, горьку ягоду я одна.» |
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
#9 24.03.2017 15:01:43 ну можно ж высчитать если использовать Range.SpecialCells xlCellTypeVisible Для примера: По вопросам из тем форума, личку не читаю. |
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
asked Jun 19, 2019 at 10:04
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 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 |
|||
Дело в том, что еще ничего нету… Мне нужно, чтобы по отфильтрованным строкам пробегалась процедура
т.е. на одном листе хранится перечень данных, а на основном листе (лист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))
Это сработало для меня довольно хорошо