У меня есть книга Excel с многочисленными таблицами, некоторые из которых содержат числовое значение в ячейке A1
:
'DATA_1' 'DATA_2' 'DATA_3'
A A A
1 1.6 1 -0.8 1
Я хочу определить количество ячеек A1
по одной формуле во всей книге, содержащей данные, поэтому в приведенном выше примере должно быть 2
потому что ячейка на последнем листе пуста.
Поскольку число рабочих листов может различаться, я использую пользовательскую функцию (UDF), которая возвращает массив, содержащий имена всех листов:
Function SHEET_NAMES() As Variant
' returns names of all sheets as an array
Dim idx As Long, retArray() As String
Application.Volatile True
With ThisWorkbook.Sheets
ReDim retArray(.Count)
For idx = 1& To .Count
retArray(idx) = .Item(idx).Name
Next idx
SHEET_NAMES() = retArray
End With
End Function
Этот UDF работает нормально, формула {=SHEET_NAMES()}
возвращает ожидаемый массив ({"DATA_1","DATA_2","DATA_3"}
). (Обратите внимание, что UDF необходимо рассматривать как недоступные для редактирования.)
Моя идея теперь использовать UDF вместе с функциями ADDRESS()
и INDIRECT()
для ссылки на ячейки A1
всех доступных рабочих листов динамически использовать ISNUMBER()
для проверки того, присутствует ли действительное число, преобразование логическое значение FALSE
/TRUE
, чтобы 0
по N()
и , наконец, использовать SUM()
, чтобы суммировать все 0
как это:
{=SUM(N(ISNUMBER(INDIRECT(ADDRESS(ROW(A1);COLUMN(A1);;;SHEET_NAMES())))))}
Однако результат всегда равен 0
, даже если ни один лист не содержит пустую ячейку A1
.
Я обнаружил, что функция ADDRESS()
возвращает правильный массив строк, представляющих ссылки на все ячейки A1
, который является {"DATA_1!$A$1","DATA_2!$A$1","DATA_3!$A$1"}
.
INDIRECT()
возвращает {#VALUE!,#VALUE!,#VALUE!}
поскольку он, очевидно, не поддерживает массивы, однако контейнерная функция ISNUMBER()
поддерживает массивы, так что, похоже, это правильно выполняет итерацию по элементам массива, и в результате получается {TRUE,TRUE,FALSE}
.
Функция N()
выполняет преобразование намеченным способом, следовательно, это приводит к {1,1,0}
.
Но окончательный SUM()
всегда приводит к 0
, независимо от того, сколько листов существует и содержат ли некоторые или все из них действительные числа в ячейке A1
. (Точно так же, как sidenote: если я введу формулу как функцию, не являющуюся массивом, результат зависит только от первого рабочего листа.)
Я попытался использовать NOT(ISBLANK())
и NOT(ISERROR())
вместо ISNUMBER()
, и я попытался изменить SUM(N(ISNUMBER()))
на SUM(COUNT())
, но без успеха (все результат 0
, кроме NOT(ISBLANK())
который дает 3
).
(Также я даже пытался заменить ROW(A1)
и COLUMN(A1)
на ROWS($A$1:A1)
и COLUMNS($A$1:A1)
соответственно, так как это должно решить проблему INDIRECT()
связанную с массивами. согласно некоторым веб-страницам, но без изменений.)
Не могли бы вы сказать мне, что я делаю не так, и как преодолеть ошибку, не теряя гибкости?
(Если это возможно, я бы предпочел решение без использования COUNTIF()
или SUMIF()
, ни каких - либо других функций , которые требуют определенного условия , чтобы дать в виде строки, чтобы сохранить портативность.)