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

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

Msgstr “Требуется объект”.

Может кто-нибудь, пожалуйста, дайте мне знать, какие изменения необходимы?

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 

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

 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 даст вам точное количество, даже если Range имеет несколько областей, в отличие от свойства Rows . Поэтому мы просто берем первый столбец диапазона автофильтра и подсчитываем количество видимых ячеек.

Проще говоря, это в вашем коде:

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

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

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

 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 " & lCount - 1 & " records" End With Set rnData = Nothing lCount = Empty End Sub 

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

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

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

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

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

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

Я нашел способ сделать это, чтобы он требовал 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$" & 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")) 

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

 =COUNTIF(H2:H5000,"Your value to be count") 

Например:

 =COUNTIF(H2:H5000,"FALSE") 

Это вычислит полное значение false в столбце H.

  • VBA потянув данные из SAP для манекенов
  • Вызов Sub в VBA
  • Снять защиту VBProject с кода VB
  • Основы того, как заставить процедуру VBA работать в excel при изменении ячейки
  • Код для прокрутки всех файлов excel в указанной папке и вытаскивание данных из определенных ячеек
  • В Excel 2013, где находятся инструменты Visual Basic (VBA), Макросы и AddIn?
  • MS-Access, VBA и обработка ошибок
  • Excel VBA - удаление пустых строк
  • Несколько фильтров Pivotfields
  • Excel - объединить несколько столбцов в один столбец
  • VBA проверяет, существует ли файл
  • Interesting Posts

    Вставить в анонимный тип

    JAXB: требуется префикс пространства имен для всех элементов

    Проверьте, существует ли файл с использованием VBA

    Каково влияние запуска процессора на 100% в течение длительного времени за раз?

    Вывод прокрутки оболочки с помощью мыши в tmux

    Как решить проблему 32-байтового выравнивания для операций загрузки / хранения AVX?

    Как обнаружить, блокируют ли интернет-провайдеры торрент-файлы

    Что означает «Предназначено для распространения с новым ПК» на компакт-диске OEM Windows 7 Home Premium?

    Символ ‘:’, шестнадцатеричное значение 0x3A, не может быть включен в имя

    Как я могу принудительно перезагрузить какой-то URL?

    Планшет (iPad / Android) – Протокол связи с сервером

    cc1plus: ошибка: непризнанная опция командной строки «-std = c ++ 11» с g ++

    Как make commandButton не полностью обновляет страницу? Как использовать f: ajax?

    Версия выпуска C # имеет файл .pdb

    Бесконечная петля с cin при наборе строки, в то время как число ожидается

    Давайте будем гением компьютера.