Рядок залежить від фільтрованих даних

Я використовую код нижче, щоб отримати кількість відфільтрованих рядків даних у 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
11

7 Відповіді

Якщо ви спробуєте підрахувати кількість рядків у вже автофілографічному діапазоні, як це:

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 . Отже, ми просто займаємо перший стовпчик діапазону автофільтрів та підраховуємо кількість видимих ​​комірок.

32
додано
Рішення "cell" - це те, що я шукав. Дякую :-)
додано Автор Enissay, джерело
Це лише підраховує кількість рядків у першому сусідньому діапазоні. Я буду оновлювати відповідь, щоб бути більш точною.
додано Автор Tmdean, джерело
Добре ловити, @ Tmdean. Дякуємо за очищення цього.
додано Автор Jon Crowell, джерело
Любіть 2-й ... "Чому ти не можеш розібратися в самих діапазонах, якщо ми можемо просто посилатися на діапазон, який AutoFilter створив для себе?" Спасибі.
додано Автор ashleedawg, джерело
Дуже дякую, це просто вирішило для мене головоломку. Я дуже ціную пояснення.
додано Автор ghangas, джерело
Дякуємо за додаткову інформацію про властивості Cells vs Rows та використовували їх протягом багатьох років, і це пояснює деякі періодичні проблеми.
додано Автор whistler, джерело
Спасибі за вашу відповідь. Я використовую Excel 2007. з наведеним вище кодом, в якому відображається повідомлення про помилку: "Об'єкт не підтримує цю властивість або метод".
додано Автор user2300403, джерело
Я думаю, що я просто отримав це. Я використовував код нижче для підрахунку рядків, і він працював
додано Автор user2300403, джерело

Просто покладіть це у ваш код:

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

Переконайтеся, що ви застосовуєте правильний діапазон, але просто збережіть його в стовпчику ONE

15
додано
Ідеально. Рішення, згадані вище, можуть надати неправильні результати у випадку порожніх рядків у таблиці і т. Д. Це працює як шарм :)
додано Автор kurp, джерело
Для тих, кому потрібно було це подивитися, перший параметр визначає загальну функцію для використання; 3 - "CountA", тобто кількість стовпців у стовпчику, що не є порожніми.
додано Автор AjV Jsy, джерело

Хоча я згоден з даними результатами, вони не працювали для мене. Якщо у таблиці є ім'я, це буде працювати:

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

2
додано
ЦЕ !!! Дякую, я провів останні кілька годин, намагаючись знайти, як отримати кількість рядків з фільтрується ListObject.
додано Автор spences10, джерело
=COUNTIF(H2:H5000,"Your value to be count")

Наприклад:

=COUNTIF(H2:H5000,"FALSE")

Це дозволить обчислити загальну помилку в стовпці H.

1
додано

Я знайшов спосіб зробити це, оскільки він вимагає 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"))
1
додано

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

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

Я тестував це і виходив точно кожного разу, видавши правильну кількість видимих ​​рядків у колонці А.

Сподіваюсь, це допоможе іншому шляховому ланцюгу "Мережі, як я".

1
додано

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

0
додано