Funções da matriz do Excel - como contar células não-brancas em várias planilhas?


0

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           

Eu quero determinar o número de A1 células por uma única fórmula em toda a pasta de trabalho que contém dados, portanto, o resultado para o 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 o array esperado ( {"DATA_1","DATA_2","DATA_3"} ). (Observe que a UDF precisa ser considerada não editável).

Minha ideia 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 existe um número válido, convertendo o valor booleano FALSE / TRUE para 0 / 1 por N() e finalmente, usar SUM() para resumir todo o 0 / 1, como isso:

{=SUM(N(ISNUMBER(INDIRECT(ADDRESS(ROW(A1);COLUMN(A1);;;SHEET_NAMES())))))}

No entanto, o resultado é sempre 0, mesmo se nenhuma planilha contiver uma célula vazia A1.

Eu descobri que o ADDRESS() function retorna o array correto de strings, representando as referências a todas as células A1, qual é {"DATA_1!$A$1","DATA_2!$A$1","DATA_3!$A$1"}.
INDIRECT() devolve {#VALUE!,#VALUE!,#VALUE!} como ele não suporta arrays aparentemente, no entanto, a função de contêiner ISNUMBER() suporta arrays, então isso parece fazer a iteração sobre os elementos da matriz corretamente, e isso resulta em {TRUE,TRUE,FALSE}.
o N() função faz a conversão da maneira pretendida, daí resulta em {1,1,0}.
Mas a final SUM() sempre resulta em 0, não importa quantas folhas existem e se algumas ou todas elas contêm números válidos em células 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()) ao invés de ISNUMBER()e eu tentei mudar SUM(N(ISNUMBER())) para SUM(COUNT()), mas sem sucesso (todos resultam em 0, exceto NOT(ISBLANK()) que dá 3 ).
(Também até tentei substituir ROW(A1) e COLUMN(A1) por ROWS($A$1:A1) e COLUMNS($A$1:A1), respectivamente, pois isso deve superar uma questão relacionada à matriz de INDIRECT(), de acordo com algumas páginas da Web, mas sem alterações também.

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 quaisquer outras funções que requeiram uma determinada condição para ser dada como uma string, para manter a portabilidade.)


1
Eu acredito que isso funciona se não houver zeros: =SUM(--(N(INDIRECT(ADDRESS(ROW(A1),COLUMN(A1),,,SHEET_NAMES())))<>0))
Kyle

Sim, funciona - obrigado, @Kyle; esta não é uma solução perfeita, embora como 0 pode aparecer nas células também; a -- converte booleanos em números (semelhante a N() ), certo?
aschipfl

1
Está certo. O primeiro - converte False para 0 e True para -1, e o segundo - converte -1 para 1.
Kyle

Respostas:


1

Você não precisa de todos os nomes das planilhas, apenas o primeiro e o último:

=COUNT(Sheet1:Sheet3!A1)

1
Isso não responde à pergunta, o número e os nomes das folhas são dinâmicos.
Kyle

1

Você pode tentar com este código:

=SUMPRODUCT(SUBTOTAL(2;INDIRECT(ADDRESS(ROW();COLUMN();;;SHEET_NAMES))))


Obrigado por responder, mas receio que isso não funcione como N() obriga o resultado de INDIRECT() para ser convertido em um valor numérico, então o ISNUMBER() retornará TRUE para cada célula, de modo aplicado no exemplo da pergunta, isso resulta em 3, embora eu espere 2 (uma vez que uma das três células de interesse está em branco) ...
aschipfl

Desculpas Bom ponto. Sua preferência por não permitir o COUNTIF torna as coisas um pouco complexas! Posso perguntar se zeros são uma possibilidade nas células que estão sendo referenciadas?
XOR LX

Sim, os zeros são considerados números válidos.
aschipfl

Ok, postou uma segunda tentativa. SUMPRODUCT nega a necessidade de CSE, mas se você realmente insistir, é claro que você pode substituir essa função por SUM e se comprometer de maneira apropriada.
XOR LX

@XORLX, obrigado, funciona como esperado! você poderia, por favor, adicionar suas informações de comentários sobre o CSE à resposta e fornecer duas explicações sobre o que acontece aqui e por que isso está funcionando, e por que minha fórmula original não funcionou?
aschipfl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.