Как определить, пуста ли ячейка с формулой? - PullRequest
0 голосов
/ 31 января 2019

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

Проблема заключается во всех ячейках встолбец ссылается на другую ячейку на отдельном листе.Следовательно, все клетки технически имеют что-то в них (например, что-то вроде =Detail!E5).

Ячейки для подсчета имеют число от 0 до 100. В то время как «пустые» ячейки имеют формулу, ссылающуюся на исходную ячейку, и эта формула возвращает " " (пробел).

Кто-нибудь знает, как этого можно достичь?

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

Set myRange = Range("J13")


For iCol = 0 To 18
        If myRange.Offset(0, iCol).Value > result Then
            For iRow = 17 To 31
                If myRange.Offset(iRow, iCol).Value <> " " Then
                    counter = counter + 1
                    Debug.Print (counter)
                End If
            Next iRow
        End If
Next iCol

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Подсчет и сумма значений (цикл)

Неясно, что такое result.Настройте в разделе констант.

Код

Sub CountVals()

    Const cSheet As String = "Sheet1"
    Const cRange As String = "J13"
    Const cCols As Long = 19
    Const cFirstR As Long = 30
    Const cLastR As Long = 44
    Const result As Long = 21 ' Long, Single, Double ?

    Dim myRange As Range
    Dim FirstC As Long
    Dim LastC As Long
    Dim counter As Long
    Dim colCounter As Long
    Dim summer As Long
    Dim colSummer As Long
    Dim i As Long
    Dim j As Long


    With ThisWorkbook.Worksheets(cSheet)
        Set myRange = .Range(cRange)
        FirstC = myRange.Column
        LastC = FirstC + cCols - 1
        For j = FirstC To LastC
            Set myRange = .Cells(myRange.Row, j)
            If myRange.Value > result Then
                For i = cFirstR To cLastR
                    If IsNumeric(.Cells(i, j).Value) Then
                        summer = summer + .Cells(i, j).Value
                        colSummer = colSummer + .Cells(i, j).Value
                        counter = counter + 1
                        colCounter = colCounter + 1
                    End If
                Next
                Debug.Print "Column" & j & " = " & colSummer & "(" _
                        & summer & ") - " & colCounter & "(" _
                        & counter & ")" ' for each column
                colCounter = 0
                colSummer = 0
            End If
        Next
    End With

End Sub
0 голосов
/ 31 января 2019

SpecialCells может определить, был ли текст или число возвращено из формулы, но вам может быть лучше с простыми функциями рабочего листа.

dim n as long, t as long
Set myRange = Range("J13")

For iCol = 0 To 18
    If myRange.Offset(0, iCol).Value > result Then
        with myRange.Offset(17, iCol).resize(15, 1)

            'count numbers returned from formulas
            n = application.count(.cells)
            'count text returned from formulas
            t = application.counta(.cells) - application.count(.cells)

            debug.print n & "numbers"
            debug.print t & "texts"

            on error resume next
            'count numbers returned from formulas
            n = 0
            n = .specialcells(xlCellTypeFormulas, xlNumbers).count
            'count text returned from formulas
            t = 0
            t = .specialcells(xlCellTypeFormulas, xlTextValues).count
            on error goto 0

            debug.print n & "numbers"
            debug.print t & "texts"

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