Как получить RowCount, когда все строки листа скрыты?

Я скрываю строки, используя следующие строки кода, исключая две верхние строки только потому, что они являются заголовками.

For i=3 To ThisWorkBook.Sheets("ALL").Range("A1",ThisWorkBook.Sheets("ALL").Range("A65536").End(xlUp)).Rows.Count
    ThisWorkBook.Sheets("ALL").Rows(i).EntireRow.Hidden=True
Next

Теперь, чтобы получить количество скрытых строк, я использую следующие строки кода

From i=3 To ThisWorkBook.Sheets("ALL").Range("A1",ThisWorkBook.Sheets("ALL").Range("A65536").End(xlUp)).Rows.Count
    ThisWorkbook.Sheets("ALL").EntireRow.Hidden=False
Next

Но я получаю rowcount как 2. На самом деле лист имеет 10 строк. Итак, как сделать скрытые строки видимыми?


person SaiKiran Mandhala    schedule 03.01.2013    source источник
comment
подожди секунду, что именно ты пытаешься здесь сделать? Получение общего количества всех строк, скрытых строк или видимых строк?   -  person Quannt    schedule 03.01.2013
comment
Сначала я скрываю все строки, после чего я показываю скрытые строки. Думаю теперь понятно, спасибо за ответ.   -  person SaiKiran Mandhala    schedule 03.01.2013
comment
Что вы подразумеваете под листом из 10 строк?   -  person shahkalpeshp    schedule 03.01.2013


Ответы (2)


Если я правильно понимаю ваш вопрос, вот альтернативный способ решения вашей проблемы, который даст вам код, который работает быстрее и довольно прост в управлении:

Option Explicit

Sub CountHiddenRows()

Dim wks As Worksheet
Set wks = ThisWorkbook.Sheets("ALL")

With wks

    Dim lngLastRow As Long
    lngLastRow = .Range("A" & .Rows.Count).End(xlUp).Row

    .Range("A3:A" * lngLastRow).EntireRow.Hidden = True

    Dim rngConsider As Range
    Dim lngHiddenRows As Long, lngRows As Long, lngVisibleRows As Long

    Set rngConsider = .Range("A1:A" & lngLastRow)

    lngRows = rngConsider.Rows.Count
    lngVisibleRows = rngConsider.SpecialCells(xlCellTypeVisible).Rows.Count
    lngHiddenRows = lngRows - lngVisibleRows

    MsgBox "There are " & lngHiddenRows & " hidden rows."

End With

End Sub
person Scott Holtzman    schedule 03.01.2013

Worksheet.Rows.Count всегда возвращает общее количество строк на листе.
Здесь я бы использовал Worksheet.UsedRange.Rows.Count.
Кроме того, ваш код может дать сбой, если первая ячейка последней строки пуста.
Вот небольшая функция который подсчитывает количество видимых строк между строкой 2 и последней использованной строкой.

Function CountVisibleRows() As Integer
  Dim R As Integer
  For R = 2 To UsedRange.Rows.Count
    If Not Rows(R).Hidden Then CountVisibleRows = CountVisibleRows + 1
  Next R
End Function

Я обычно использую цикл, когда количество строк невелико, потому что у меня лучше контроль и часто это происходит быстрее.
Когда я работаю с тысячами строк, быстрее запрашивать у Excel функцию SpecialCells или другие функции.

person stenci    schedule 04.01.2013
comment
Спасибо Стенчи за ответ. Это сработало для меня. Я новичок в VB, поэтому, пожалуйста, дайте мне небольшой пример на SpecialCells с различными типами аргументов. Спасибо еще раз. - person SaiKiran Mandhala; 04.01.2013
comment
Какой тип примера вы хотите? Еще одна причина, по которой я на самом деле не использую SpecialCells, заключается в том, что они имитируют то, что вы делаете в интерактивном режиме с Excel, например, нажатие Ctrl+End или End и стрелка вниз. - person stenci; 04.01.2013