Подсчет ячеек, содержащих формулу - PullRequest
0 голосов
/ 05 мая 2020

Я использую следующий код для подсчета количества ячеек:

Range(Range("K2"), Range("K2").End(xlDown)).Count

Однако ячейки изначально содержат формулу «= ЕСЛИ», поэтому коды возвращают неправильное количество ячеек. (Он возвращает 4xxx вместо «60», которое я ищу.)

В качестве альтернативы я попытался использовать

Cells(Rows.Count, "K").End(xlUp).Row

Хотя он возвращает гораздо меньшее число (например, 75), он также включает некоторые пустые ячейки в строке (61-65). Как мне получить номер, который я ищу (т.е. 60 перед пустыми ячейками), спасибо.

1 Ответ

0 голосов
/ 05 мая 2020

xl Значения LookIn спасают положение

Однострочный (не рекомендуется)

NumberOfRows = Range(Cells(2, "K"), Columns("K").Find(What:="", _
  After:=Cells(1, "K"), LookIn:=xlValues).Offset(-1)).Rows.Count

или ссылка на код следующих двух подпрограмм:

NumberOfRows = Range(Cells(HeaderRow + 1, Col), Columns(Col).Find(What:="", _
  After:=Cells(HeaderRow, Col), LookIn:=xlValues).Offset(-1)).Rows.Count

Более подробное объяснение

Sub CountRows()

    Const Col As Variant = "K"    ' Source Column Number/Letter
    Const HeaderRow As Long = 1   ' Header Row
    Dim rng As Range              ' Last Cell, Target Range
    Dim NumberOfRows As Long      ' Number of Rows

    ' Define Last Cell.
    Set rng = Columns(Col).Find(What:="", After:=Cells(HeaderRow, Col), _
      LookIn:=xlValues).Offset(-1)
    ' Define Target Range and write its number of rows to Number of Rows.
    ' Display the result in the Immediate window.
    If Not rng Is Nothing Then
        Set rng = Range(Cells(HeaderRow + 1, Col), rng)
        NumberOfRows = rng.Rows.Count
        Debug.Print "Number of Rows = " & NumberOfRows
    Else
        MsgBox "No empty cells" ' Highly unlikely.
    End If

End Sub

Еще более подробное объяснение

Sub CountRowsStudy()

    Const Col As Variant = "K"    ' Source Column Number/Letter
    Const HeaderRow As Long = 1   ' Header Row
    Dim rng As Range              ' First Blank Cell Range, Target Range
    Dim NumberOfRows As Long      ' Number of Rows

Debug.Print Columns(Col).Address
Debug.Print Cells(HeaderRow, Col).Address

    ' 'Columns(Col)' means the whole column whatever Col is. In this case
    ' Col is declared as Variant so either "K" or 11 can be used.
    ' 'Cells(HeaderRow, Col)' means at the intersection of Header Row
    ' and Source Column, i.e. range "K1". The 'After' argument when used
    ' with the omitted default parameter ('xlNext') of the 'SearchDirection'
    ' argument, starts the search one cell after the cell used in the
    ' 'After' argument, i.e. after "K1" which will then first 'look' into "K2"
    ' which also might be empty. The xlValues parameter of the LookIn argument
    ' will ensure to stop at the first empty cell whether it is blank
    ' or has a formula evaluating to "" in it.

    ' Define Last Cell i.e. Last Non-Empty Cell Range before
    ' the First Empty Cell Range i.e. find the first blank cell or
    ' the cell containing a formula evaluating to "" and use offset to go
    ' up one cell because you don't want the found empty cell to be counted.
    Set rng = Columns(Col).Find(What:="", After:=Cells(HeaderRow, Col), _
      LookIn:=xlValues).Offset(-1)
Debug.Print rng.Address
    ' Check if the column is not empty (full).
    If Not rng Is Nothing Then
        ' Define Target Range. It's starting from the same cell as the "After"
        ' argument, only one row down (we don't want the headers included),
        ' and it ends with the previously defined Last Non-Empty Cell Range.
        Set rng = Range(Cells(HeaderRow + 1, Col), rng)
Debug.Print rng.Address
        ' Count the Number of Rows in Target Range.
        NumberOfRows = rng.Rows.Count
Debug.Print "Number of Rows = " & NumberOfRows
    Else
        ' Inform user.
        MsgBox "No empty cells" ' Highly unlikely.
    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...