Поэтому использование объединенных ячеек делает работу с большим количеством формул действительно раздражающей, поэтому я написал решение 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
функция обновляется автоматически, но только при обновлении листа числами, но не напрямую при слиянии или удалении ячеек.