Isso funcionará no Excel 2010 ou posterior, embora eu tenha medo de não saber se ele também funcionará no Mac.
Existem soluções mais genéricas disponíveis, que funcionarão para dados em qualquer número de tabelas, não apenas em duas. No entanto, eles são necessariamente bastante complexos. Além do mais, como você tem apenas duas tabelas, provavelmente é melhor apresentar uma solução alternativa (embora menos flexível) para esse fim.
=IF(ROWS($1:1)>SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))+SUMPRODUCT(0+(LEN(ProductList2[ITEM DESCRIPTION])>0)),"",IF(ROWS($1:1)>SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0)),INDEX(ProductList2,AGGREGATE(15,6,(ROW(ProductList2)-MIN(ROW(ProductList2))+1)/(LEN(ProductList2[ITEM DESCRIPTION])>0),ROWS($1:1)-SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))),COLUMNS($A:A)),INDEX(ProductList,AGGREGATE(15,6,(ROW(ProductList)-MIN(ROW(ProductList))+1)/(LEN(ProductList[ITEM DESCRIPTION])>0),ROWS($1:1)),COLUMNS($A:A))))
Copie para baixo e para a direita, conforme necessário.
Isso pode ser abreviado, embora, novamente, as técnicas envolvidas sejam um complexo de toque. Eu não pretendo patrocinar; Eu simplesmente pensei que você poderia encontrar uma solução um pouco mais longa, embora talvez mais facilmente compreensível de mais uso.
Quanto a uma explicação:
A parte:
SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))
conta quantas entradas na coluna ITEM DESCRIPTION da tabela ProductList estão em branco. COUNTIF
é a escolha usual para esse fim, embora as duas configurações possíveis usando essa função exijam que os espaços em branco em seu intervalo sejam espaços em branco "genuínos" (e não a seqüência nula "", por exemplo, como resultado de fórmulas nessas células ) ou que as entradas sejam de um tipo de dados consistente. Como não posso ter certeza de que nenhum desses fatos inspecione sua amostra, um teste de vazio SUMPRODUCT
- que certamente funcionará independentemente das respostas acima - é a escolha mais rigorosa.
Similarmente:
SUMPRODUCT(0+(LEN(ProductList2[ITEM DESCRIPTION])>0))
conta quantas entradas na coluna ITEM DESCRIPTION da tabela ProductList2 estão em branco.
Como tal, a cláusula inicial:
IF(ROWS($1:1)>SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))+SUMPRODUCT(0+(LEN(ProductList2[ITEM DESCRIPTION])>0)),""
significa que, nas linhas além do número total de entradas não em branco na coluna ITEM DESCRIPTION de ambas as tabelas, um em branco será retornado.
Melhor ainda é inserir essas duas construções em algumas células da planilha em algum lugar e fazer referência às que estão nas fórmulas. Como tal, eles precisarão ser avaliados apenas uma vez, em vez de serem calculados por cada iteração da fórmula. Por exemplo, se você colocar G1:
=SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))
e em H1:
=SUMPRODUCT(0+(LEN(ProductList2[ITEM DESCRIPTION])>0))
então a fórmula principal se torna:
=IF(ROWS($1:1)>$G$1+$H$1,"",IF(ROWS($1:1)>$G$1,INDEX(ProductList2,AGGREGATE(15,6,(ROW(ProductList2)-MIN(ROW(ProductList2))+1)/(LEN(ProductList2[ITEM DESCRIPTION])>0),ROWS($1:1)-$G$1),COLUMNS($A:A)),INDEX(ProductList,AGGREGATE(15,6,(ROW(ProductList)-MIN(ROW(ProductList))+1)/(LEN(ProductList[ITEM DESCRIPTION])>0),ROWS($1:1)),COLUMNS($A:A))))
e será muito mais eficiente.
Observe que essa configuração que envolve a referência a uma contagem é preferível a uma contagem potencialmente pesada IFERROR
, uma explicação do motivo pelo qual você pode encontrar aqui:
Procure um valor em uma lista e retorne TODOS os vários valores correspondentes
De qualquer forma, se essa cláusula inicial for FALSE
, passamos à segunda declaração condicional, ou seja:
IF(ROWS($1:1)>SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))
que, de maneira semelhante ao acima, nos diz que, em linhas além do número total de entradas não em branco na coluna ITEM DESCRIPTION da tabela ProductList , saberemos concentrar-nos na outra tabela, ou seja, ProductList2 . Caso contrário, se o exposto acima FALSE
, direcionaremos nossa atenção para a primeira tabela, ProductList .
Examinarei dois exemplos, pois, embora as construções de cada uma sejam praticamente idênticas, há uma diferença pequena, mas necessária, em uma.
Usando os dados que você postou e usando a fórmula na primeira linha como exemplo, ou seja:
IF(ROWS($1:1)>SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0)),INDEX(ProductList2,AGGREGATE(15,6,(ROW(ProductList2)-MIN(ROW(ProductList2))+1)/(LEN(ProductList2[ITEM DESCRIPTION])>0),ROWS($1:1)-SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))),COLUMNS($A:A)),INDEX(ProductList,AGGREGATE(15,6,(ROW(ProductList)-MIN(ROW(ProductList))+1)/(LEN(ProductList[ITEM DESCRIPTION])>0),ROWS($1:1)),COLUMNS($A:A)))
vemos que a cláusula inicial, ou seja:
IF(ROWS($1:1)>SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))
qual é:
IF(1>3
é claramente FALSE
, e assim passamos à construção que compreende a cláusula value_if_false nesta IF
declaração, ou seja:
INDEX(ProductList,AGGREGATE(15,6,(ROW(ProductList)-MIN(ROW(ProductList))+1)/(LEN(ProductList[ITEM DESCRIPTION])>0),ROWS($1:1)),COLUMNS($A:A))
AGGREGATE
(Apenas 2010 ou posterior) oferece uma construção alternativa agradável e não CSE às configurações padrão de CSE com LARGE
ou SMALL
.
A parte:
ROW(ProductList)-MIN(ROW(ProductList))+1
é uma construção padrão usada para gerar uma matriz de números inteiros de 1 até o número de linhas na tabela ProductList . Funciona desde que, assumindo, por exemplo, que esta tabela ocupasse as linhas 4 a 7 (ou seja, 4 linhas no total), teríamos:
{4;5;6;7}-MIN({4;5;6;7})+1
ou seja:
{4;5;6;7}-4+1
ou seja:
{4;5;6;7}-3
ou seja:
{1;2;3;4}
como requerido.
A parte:
LEN(ProductList[ITEM DESCRIPTION])>0
verifica se cada uma das entradas nessa coluna tem um comprimento diferente de zero (ou seja, não está em branco) e resolve:
LEN({"Item1";"Item2";"";"Item3"})>0
ou seja:
{5;5;0;5}>0
ou seja:
{TRUE;TRUE;FALSE;TRUE}
Em seguida, calculamos a fração:
(ROW(ProductList)-MIN(ROW(ProductList))+1)/(LEN(ProductList[ITEM DESCRIPTION])>0)
qual é:
({1;2;3;4})/({TRUE;TRUE;FALSE;TRUE})
obter:
{1;2;#DIV/0!;4}
em virtude do fato de que, quando coagidos por qualquer operação matemática adequada (aqui divisão), valores booleanos TRUE
/ FALSE
são coagidos em seus equivalentes numéricos ( TRUE
= 1, FALSE
= 0).
Efetivamente, então, quaisquer entradas que não atendam à nossa condição de ter um comprimento maior que zero (ou seja, as células em branco) agora foram processadas como erros.
E, como, ao definir AGGREGATE
o segundo parâmetro para 6, instruímos essa função a ignorar qualquer valor de erro dentro do intervalo, obtivemos um meio de eliminar as células em branco da consideração.
Assim sendo:
AGGREGATE(15,6,(ROW(ProductList)-MIN(ROW(ProductList))+1)/(LEN(ProductList[ITEM DESCRIPTION])>0),ROWS($1:1))
qual é:
AGGREGATE(15,6,{1;2;#DIV/0!;4},1)
retorna 1 (o menor valor dentro dessa matriz, 15 sendo o parâmetro equivalente a SMALL
para AGGREGATE
).
Agora passamos esse valor como o parâmetro row_num para INDEX
, de modo que:
INDEX(ProductList,AGGREGATE(15,6,{1;2;#DIV/0!;4},1),COLUMNS($A:A)
qual é:
INDEX(ProductList,1,1)
retorna "Item1", conforme desejado.
Observe o uso de:
COLUMNS($A:A)
para o col_num de INDEX
, que, como esta fórmula é copiada à direita, se tornará sucessivamente:
COLUMNS($A:B)
ie 2,
COLUMNS($A:C)
ie 3,
etc., etc., fornecendo assim um meio de retornar valores das colunas subseqüentes na tabela sem precisar inserir manualmente a coluna que está sendo referenciada para cada iteração.
Para dar outro exemplo, a fórmula após ter copiado a fórmula cinco linhas abaixo, ou seja:
IF(ROWS($1:5)>SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0)),INDEX(ProductList2,AGGREGATE(15,6,(ROW(ProductList2)-MIN(ROW(ProductList2))+1)/(LEN(ProductList2[ITEM DESCRIPTION])>0),ROWS($1:5)-SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))),COLUMNS($A:A)),INDEX(ProductList,AGGREGATE(15,6,(ROW(ProductList)-MIN(ROW(ProductList))+1)/(LEN(ProductList[ITEM DESCRIPTION])>0),ROWS($1:5)),COLUMNS($A:A)))
vontade, desde então a cláusula inicial resolve:
IF(5>3
ou seja TRUE
, significa que consideramos a outra construção, ou seja:
INDEX(ProductList2,AGGREGATE(15,6,(ROW(ProductList2)-MIN(ROW(ProductList2))+1)/(LEN(ProductList2[ITEM DESCRIPTION])>0),ROWS($1:5)-SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))),COLUMNS($A:A))
Isso é praticamente idêntico, embora aqui tenhamos de ter um pouco de cuidado com o parâmetro k sendo passado para AGGREGATE
. Se fôssemos usar, como antes, simplesmente:
AGGREGATE(15,6,(ROW(ProductList2)-MIN(ROW(ProductList2))+1)/(LEN(ProductList2[ITEM DESCRIPTION])>0),ROWS($1:5))
Nós teríamos:
AGGREGATE(15,6,({1;2;3;4;5})/({TRUE;TRUE;FALSE;TRUE;FALSE}),ROWS($1:5))
qual é:
AGGREGATE(15,6,{1;2;#DIV/0!;4;#DIV/0!},ROWS($1:5))
no entanto, uma vez que:
ROWS($1:5)
é 5 e, como a matriz:
{1;2;#DIV/0!;4;#DIV/0!}
não contém um quinto menor valor, o acima retornará um erro.
Subtraindo primeiro o número de entradas não em branco na outra tabela desse valor de 5, garantimos que obtemos o parâmetro correto. Portanto, usamos:
ROWS($1:5)-SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))
qual é:
5-3
ie 2.
E agora temos:
AGGREGATE(15,6,{1;2;#DIV/0!;4;#DIV/0!},2)
que é 2.
E, finalmente, nossa construção:
INDEX(ProductList2,AGGREGATE(15,6,(ROW(ProductList2)-MIN(ROW(ProductList2))+1)/(LEN(ProductList2[ITEM DESCRIPTION])>0),ROWS($1:5)-SUMPRODUCT(0+(LEN(ProductList[ITEM DESCRIPTION])>0))),COLUMNS($A:A))
qual é:
INDEX(ProductList2,2,1)
retorna "Item5", conforme necessário.
Um ponto final é otimizar a velocidade de cálculo. Assim como é mais eficiente inserir as duas fórmulas de contagem nas células da planilha real, também é mais eficiente torná-lo de tal forma que as partes:
ROW(ProductList)-MIN(ROW(ProductList))+1
e:
ROW(ProductList2)-MIN(ROW(ProductList2))+1
são calculados apenas uma vez cada.
Embora essas diferenças, ao contrário das duas SUMPRODUCT
construções, não possam, por motivos técnicos, possam ser inseridas nas células reais da planilha, elas podem ser armazenadas no Gerenciador de Nomes ( guia Fórmulas ).
Portanto, se você os definiu como, por exemplo, Arry1 e Arry2 , com Arry1 sendo:
=ROW(ProductList)-MIN(ROW(ProductList))+1
e Arry2 sendo:
=ROW(ProductList2)-MIN(ROW(ProductList2))+1
a fórmula principal se tornaria mais legível, mais eficiente:
=IF(ROWS($1:1)>$G$1+$H$1,"",IF(ROWS($1:1)>$G$1,INDEX(ProductList2,AGGREGATE(15,6,Arry2/(LEN(ProductList2[ITEM DESCRIPTION])>0),ROWS($1:1)-$G$1),COLUMNS($A:A)),INDEX(ProductList,AGGREGATE(15,6,Arry1/(LEN(ProductList[ITEM DESCRIPTION])>0),ROWS($1:1)),COLUMNS($A:A))))
Saudações