Você não precisa de todos os nomes das planilhas, apenas o primeiro e o último:
=COUNT(Sheet1:Sheet3!A1)
Eu tenho uma pasta de trabalho do Excel com várias planilhas, algumas delas contendo um valor numérico na célula A1 :
'DATA_1' 'DATA_2' 'DATA_3'
A A A
1 1.6 1 -0.8 1
Desejo determinar o número de A1 células em uma única fórmula em toda a pasta de trabalho que contém dados, portanto, o resultado do exemplo acima deve ser 2 porque a célula na última planilha está em branco.
Como o número de planilhas pode variar, estou usando uma função definida pelo usuário (UDF) que retorna uma matriz contendo os nomes de todas as planilhas:
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
Esta UDF está funcionando bem, a fórmula {=SHEET_NAMES()} retorna a matriz esperada ( {"DATA_1","DATA_2","DATA_3"} ). (Observe que a UDF precisa ser considerada não editável).
Minha idéia agora é usar o UDF junto com as funções ADDRESS() e INDIRECT() para fazer referência às células A1 de todas as planilhas disponíveis dinamicamente, para usar ISNUMBER() para verificar se um número válido está presente, convertendo o booleano FALSE / TRUE a 0 / 1 por N() e, finalmente, usar SUM() para somar todos os 0 / 1 , assim:
{=SUM(N(ISNUMBER(INDIRECT(ADDRESS(ROW(A1);COLUMN(A1);;;SHEET_NAMES())))))}
No entanto, o resultado é sempre 0 , mesmo que nenhuma planilha contenha uma célula vazia A1 .
Descobri que a função ADDRESS() retorna a matriz de cadeias correta, representando as referências a todas as células A1 , que é {"DATA_1!$A$1","DATA_2!$A$1","DATA_3!$A$1"} .
INDIRECT() retorna {#VALUE!,#VALUE!,#VALUE!} , pois não suporte matrizes aparentemente, no entanto, a função de contêiner ISNUMBER() suporta matrizes, portanto, isso parece fazer a iteração sobre os elementos da matriz corretamente e resulta em {TRUE,TRUE,FALSE} .
A função N() faz a conversão da maneira pretendida, portanto resulta em {1,1,0} .
Mas o SUM() final sempre resulta em 0 , não importa quantas folhas existem e se algumas ou todas elas contêm números válidos na célula A1 . (Apenas como um sidenote: se eu inserir a fórmula como uma função não matriz, o resultado dependerá apenas da primeira planilha.)
Eu tentei usar NOT(ISBLANK()) e NOT(ISERROR()) em vez de ISNUMBER() , e tentei alterar SUM(N(ISNUMBER())) para SUM(COUNT()) , mas sem sucesso (todos resultam em 0 , exceto NOT(ISBLANK()) que fornece 3 ).
(Também tentei substituir ROW(A1) e COLUMN(A1) por ROWS($A$1:A1) e COLUMNS($A$1:A1) , respectivamente, pois isso deve superar um problema relacionado à matriz de INDIRECT() , de acordo com algumas páginas da Web, mas sem alterações bem.)
Então, você poderia me dizer o que estou fazendo de errado aqui e como superar o fracasso sem perder a flexibilidade?
(Se possível, eu preferiria uma solução sem usar COUNTIF() ou SUMIF() nem qualquer outra função que requeira que uma determinada condição seja fornecida como string, para manter a portabilidade.)
Você não precisa de todos os nomes das planilhas, apenas o primeiro e o último:
=COUNT(Sheet1:Sheet3!A1)
Você pode tentar com este código:
=SUMPRODUCT(SUBTOTAL(2;INDIRECT(ADDRESS(ROW();COLUMN();;;SHEET_NAMES))))