Excel 2010: Как формально подсчитать общее количество ячеек в диапазоне, который содержит объединенные ячейки? - PullRequest
0 голосов
/ 12 октября 2018

Я использовал =ROWS(my_range)*COLUMNS(my_range) для подсчета общего количества ячеек в одном столбце.

Сейчас я пытаюсь подсчитать общее количество ячеек в диапазоне, который содержит (неизбежно) объединенныеячеек, и я получаю ошибку #REF, используя приведенную выше формулу.

Я также пытался: =COUNTA(my_range) & "/" & COUNTA(my_range) + COUNTBLANK(my_range), что приводит к ошибке #VALUE!.

В моей последней попытке я надеялся, что =ROWS(my_range) может работать, поскольку меня только слилистолбцы, а не объединенные строки.Однако это дает мне ошибку #REF.`

Все, что мне нужно, это общее количество ячеек, которое существует в my_range

Спасибо

1 Ответ

0 голосов
/ 17 октября 2018

Поэтому использование объединенных ячеек делает работу с большим количеством формул действительно раздражающей, поэтому я написал решение VBA с использованием массивов:

Сначала эта функция проходит через диапазон, и каждый раз, когда она распознает объединенную ячейку, код добавит ячейки в массив.

Позже, когда цикл попадает в ячейку, помеченную как «объединенная» (= находится в массиве), счетчик пропустит его (благодаря этому разделу: Проверьте, находится ли значение в массиве илине с Excel VBA ).

Option Explicit

Function CountCells(RA As Range) As Long

Application.Volatile

    Dim i As Long
    Dim a As Long
    Dim i2 As Long
    Dim a2 As Long
    Dim RowCount As Long
    Dim ColCount As Long
    Dim k As Long
    Dim R1 As Long
    Dim R2 As Long
    Dim C1 As Long
    Dim C2 As Long
    ReDim iArray(1 To 1) As Variant

R1 = RA.Row
R2 = R1 + RA.Rows.Count - 1
C1 = RA.Column
C2 = C1 + RA.Columns.Count - 1

k = 0

    For i = R1 To R2
        For a = C1 To C2

                If IsInArray(Cells(i, a).Address, iArray) Then
                    GoTo next_a
                End If

            ColCount = Cells(i, a).MergeArea.Columns.Count
            RowCount = Cells(i, a).MergeArea.Rows.Count

                If RowCount > 1 Or ColCount > 1 Then
                    k = k + RowCount * ColCount - 1

                    For i2 = i To i + RowCount - 1
                        For a2 = a To a + ColCount - 1
                            iArray(UBound(iArray)) = Cells(i2, a2).Address
                            ReDim Preserve iArray(1 To UBound(iArray) + 1) As Variant
                       Next a2
                    Next i2

                End If
next_a:
        Next a
    Next i

    CountCells = (R2 + 1 - R1) * (C2 + 1 - C1) - k

End Function


Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
Application.Volatile
    Dim i
    For i = LBound(arr) To UBound(arr)
        If arr(i) = stringToBeFound Then
            IsInArray = True
            Exit Function
        End If
    Next i
    IsInArray = False

End Function

Тогда вам просто нужно использовать эту функцию, как эта на вашем листе:

=countcells(my_range) 

или любой другой диапазон вместо вашего названного диапазонаmy_range

Примечание: При Application.Volatile функция обновляется автоматически, но только при обновлении листа числами, но не напрямую при слиянии или удалении ячеек.

...