필터링된 데이터의 행 수
다음 코드를 사용하여 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
이미 자동 필터링된 범위의 행 수를 다음과 같이 세려고 하면 다음과 같이 됩니다.
Rowz = rnData.SpecialCells(xlCellTypeVisible).Rows.Count
자동 필터링 범위의 첫 번째 연속 표시 영역 행 수만 카운트됩니다.예를 들어 자동 필터 범위가 1~10행이고 3, 5, 6, 7, 9행이 필터링되면 4행(2, 4, 8, 10행)이 표시되지만 첫 번째 연속된 가시 범위가 1행(헤더 행)과 2행이기 때문에 2가 반환됩니다.
보다 정확한 대안은 이것이다(전제가ws
에는 필터링된 데이터가 포함된 워크시트가 포함되어 있습니다.
Rowz = ws.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
헤더 행을 제거하려면 1을 빼야 합니다.셀이 발견되지 않으면 SpecialCells가 오류를 발생시키기 때문에 헤더 행을 카운트 범위에 포함해야 합니다.
그Cells
속성은 범위 내에 여러 영역이 있는 경우에도 정확한 카운트를 제공합니다.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
오래된 스레드이지만 VBA에서 Subtotal 메서드를 사용하면 행의 수가 정확하게 렌더링된다는 것을 알게 되었습니다.이 기사에 기재되어 있는 공식은 다음과 같습니다.
Application.WorksheetFunction.Subtotal(2, .Range("A2:A" & .Rows(.Rows.Count).End(xlUp).Row))
테스트해보니 매번 정확하게 나와서 A열에 표시되는 행의 수가 정확합니다.
이게 나 같은 인터넷 여행자에게 도움이 되길 바라.
두 단계를 거쳐야 하는 방법을 찾아냈지만 효과가 있습니다.
' 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"))
Rowz = Application.WorksheetFunction.Subtotal(2, Range("A2:A" & Rows(Rows.Count).End(xlUp).Row))
각 행의 범위가 확보되어 있기 때문에 오프셋(행, 열) 액션으로 그 범위를 쉽게 조작할 수 있다고 생각합니다.필터링된 레코드를 카운트하는 이유는 무엇입니까(변수로 카운트가 필요하지 않은 경우)?따라서 코드 액션을 작성하여 각 행을 빈 숨김 시트로 이동하고 모든 작업이 완료되면 전송된 범위 데이터에서 원하는 작업을 수행할 수 있습니다.
Rowz = Application.WorksheetFunction.Subtotal(2, Range("A2:A" & Rows(Rows.Count).End(xlUp).Row))
이것은 나에게 꽤 효과가 있었다.
언급URL : https://stackoverflow.com/questions/17285897/row-count-on-the-filtered-data
'programing' 카테고리의 다른 글
ORM 또는 플레인 SQL 사용 (0) | 2023.04.22 |
---|---|
목록 안으로 항목을 이동하시겠습니까? (0) | 2023.04.22 |
함수 내에서 발신자의 명령줄 인수에 액세스하려면 어떻게 해야 합니까? (0) | 2023.04.22 |
bash에서 현재 파티션의 사용 가능한 디스크 공간을 확인하십시오. (0) | 2023.04.17 |
Windows에서 실행되는 Emacs용 .emacs 파일은 어디서 찾을 수 있습니까? (0) | 2023.04.17 |