Cria uma lista de células que possuem valor na célula adjacente

0

Eu tenho várias (10 para ser exato) planilhas em um documento formatado como este que cada um corresponde a uma classe:

| Name | Time 1 | Time 2 | Time 3 | Time 4 |
--------------------------------------------
| Jack | Place1 | Place2 | Place3 | Place4 |
| John | Place4 | Place6 | Place2 | Place9 |
| Dave | Place8 | Place2 | Place5 | Place1 |

que contém informações para as pessoas, onde elas pertencem no momento determinado (como um horário). Há cerca de 25 pessoas em cada turma e 9 lugares diferentes. O que eu preciso fazer é criar tabelas 4x9 (para cada lugar e hora), que listará todas as pessoas que estão naquele momento no lugar determinado. Então será assim:

On one sheet:
Place 1 - Time 1
| Name | Signature |
--------------------
| Jack |           |
| Some |           | <--- this guy is from a different class (sheet)


On another sheet:
Place 2 - Time 2
| Name |           |
--------------------
| Jack |           |
| Dave |           |
| Mark |           | <--- again, another class

Pode ser qualquer coisa, uma macro, VBS, funções, qualquer coisa que realmente não importe. Se de alguma maneira ajudar, eu não sei, dimensionar corretamente as novas tabelas, eu já tenho uma tabela contendo o número de pessoas em cada lugar e hora. Infelizmente, não posso fazer isso manualmente, são muitos dados ...

Obrigado por toda ajuda!

    
por Michal Krejčí 15.02.2017 / 15:59

1 resposta

0

Então eu descobri que isso foi feito por essa fórmula. Eu substituirei as variáveis com sua explicação. É pfooo longo, mas na verdade é bem fácil. Por favor, ignore as versões checas das funções, KDYŽ = IF , ŘÁDEK = ROW e ŘÁDKY = ROWS .

IFERROR(INDEX(Prima;SMALL(KDYŽ(A$1=Prima[Blok 1];ŘÁDEK(Prima[Blok 1])-3);ŘÁDKY(A$3:A3));1);
IFERROR(INDEX(Sekunda;SMALL(KDYŽ(A$1=Sekunda[Blok 1];ŘÁDEK(Sekunda[Blok 1])-3);ŘÁDKY(A$3:A3)-COUNTIF(Prima[Blok 1];A$1));1);
IFERROR(INDEX(TercieA;SMALL(KDYŽ(A$1=TercieA[Blok 1];ŘÁDEK(TercieA[Blok 1])-3);ŘÁDKY(A$3:A3)-COUNTIF(Prima[Blok 1];A$1)-COUNTIF(Sekunda[Blok 1];A$1));1);
IFERROR(INDEX(TercieB;SMALL(KDYŽ(A$1=TercieB[Blok 1];ŘÁDEK(TercieB[Blok 1])-3);ŘÁDKY(A$3:A3)-COUNTIF(Prima[Blok 1];A$1)-COUNTIF(Sekunda[Blok 1];A$1)-COUNTIF(TercieA[Blok 1];A$1));1);
IFERROR(INDEX(Kvarta;SMALL(KDYŽ(A$1=Kvarta[Blok 1];ŘÁDEK(Kvarta[Blok 1])-3);ŘÁDKY(A$3:A3)-COUNTIF(Prima[Blok 1];A$1)-COUNTIF(Sekunda[Blok 1];A$1)-COUNTIF(TercieA[Blok 1];A$1)-COUNTIF(TercieB[Blok 1];A$1));1);
IFERROR(INDEX(KvintaA;SMALL(KDYŽ(A$1=KvintaA[Blok 1];ŘÁDEK(KvintaA[Blok 1])-3);ŘÁDKY(A$3:A3)-COUNTIF(Prima[Blok 1];A$1)-COUNTIF(Sekunda[Blok 1];A$1)-COUNTIF(TercieA[Blok 1];A$1)-COUNTIF(TercieB[Blok 1];A$1)-COUNTIF(Kvarta[Blok 1];A$1));1);
IFERROR(INDEX(KvintaB;SMALL(KDYŽ(A$1=KvintaB[Blok 1];ŘÁDEK(KvintaB[Blok 1])-3);ŘÁDKY(A$3:A3)-COUNTIF(Prima[Blok 1];A$1)-COUNTIF(Sekunda[Blok 1];A$1)-COUNTIF(TercieA[Blok 1];A$1)-COUNTIF(TercieB[Blok 1];A$1)-COUNTIF(Kvarta[Blok 1];A$1)-COUNTIF(KvintaA[Blok 1];A$1));1);
IFERROR(INDEX(Sexta;SMALL(KDYŽ(A$1=Sexta[Blok 1];ŘÁDEK(Sexta[Blok 1])-3);ŘÁDKY(A$3:A3)-COUNTIF(Prima[Blok 1];A$1)-COUNTIF(Sekunda[Blok 1];A$1)-COUNTIF(TercieA[Blok 1];A$1)-COUNTIF(TercieB[Blok 1];A$1)-COUNTIF(Kvarta[Blok 1];A$1)-COUNTIF(KvintaA[Blok 1];A$1)-COUNTIF(KvintaB[Blok 1];A$1));1);
IFERROR(INDEX(Septima;SMALL(KDYŽ(A$1=Septima[Blok 1];ŘÁDEK(Septima[Blok 1])-3);ŘÁDKY(A$3:A3)-COUNTIF(Prima[Blok 1];A$1)-COUNTIF(Sekunda[Blok 1];A$1)-COUNTIF(TercieA[Blok 1];A$1)-COUNTIF(TercieB[Blok 1];A$1)-COUNTIF(Kvarta[Blok 1];A$1)-COUNTIF(KvintaA[Blok 1];A$1)-COUNTIF(KvintaB[Blok 1];A$1)-COUNTIF(Sexta[Blok 1];A$1));1);
IFERROR(INDEX(Oktáva;SMALL(KDYŽ(A$1=Oktáva[Blok 1];ŘÁDEK(Oktáva[Blok 1])-3);ŘÁDKY(A$3:A3)-COUNTIF(Prima[Blok 1];A$1)-COUNTIF(Sekunda[Blok 1];A$1)-COUNTIF(TercieA[Blok 1];A$1)-COUNTIF(TercieB[Blok 1];A$1)-COUNTIF(Kvarta[Blok 1];A$1)-COUNTIF(KvintaA[Blok 1];A$1)-COUNTIF(KvintaB[Blok 1];A$1)-COUNTIF(Sexta[Blok 1];A$1)-COUNTIF(Septima[Blok 1];A$1));1);""

))))))))))

A parte principal é repetida várias vezes como um texto alternativo para a função IFERROR() :

IFERROR(
    INDEX(
        <table range>;
        SMALL(
            IF(
                <value to find>=<range in table to look in>;
                ROW(<range in table to look in>)-<number of rows above the first row of the table>
            );
            ROWS(<first-cell-in-results-column-to-this-cell range>) <note here>
        );
        <column number (starting from 1) with the return value>
    );
    <alternative for IFERROR>
)

A fórmula acima, se os valores estiverem definidos corretamente, retornará todos os valores da coluna de retorno se o valor correto for encontrado no intervalo de pesquisa. Agora, se você precisar realizar o que eu precisava, ou seja, obter valores de várias tabelas em uma única lista, será necessário definir essa fórmula como a alternativa para o IFERROR , uma vez para cada tabela de origem.

Isso é bom, mas não é a única coisa que precisamos fazer. Essa fórmula funciona internamente criando uma matriz de valores de retorno dentro de cada célula da lista e, em seguida, selecionando o Nth menor índice (a função INDEX ) a partir do qual N é definido pela função ROWS dentro de INDEX . Portanto, se não fizermos o seguinte, ao tentar continuar para a próxima tabela, tente novamente selecionar o índice N, mas já existem alguns valores das tabelas anteriores. Precisamos subtrair a quantidade de itens já presentes na tabela usando a função COUNTIF . Então, depois de adicionarmos a segunda iteração da nossa fórmula, a coisa toda ficará assim:

IFERROR(
    INDEX(
        <table range>;
        SMALL(
            IF(
                <value to find>=<range in table to look in>;
                ROW(<range in table to look in>)-<number of rows above the first row of the table>
            );
            ROWS(<first-cell-in-results-column-to-this-cell range>)
        );
        <column number (starting from 1) with the return value>
    );
    IFERROR(
        INDEX(
            <table 2 range>;
            SMALL(
                IF(
                    <value to find>=<range in table 2 to look in>;
                    ROW(<range in table 2 to look in>)-<number of rows above the first row of the table 2>
                );
                ROWS(<first-cell-in-results-column-to-this-cell range>)
                -COUNTIF(<range in table 2 to look in>; <value to find>)
            );
            <column number (starting from 1) with the return value>
        );
        <another iteration or something else>
    )
)

E a cada nova iteração dentro do próximo IFERROR , temos que adicionar outra função -COUNTIF e MANTER os anteriores. Então, quando tudo estiver configurado, você pode simplesmente arrastar sua fórmula pelo painel e criar listas o quanto quiser!

Eu realmente espero que isso ajude alguém, se ele se sentir livre para deixar um comentário :) Eu coloquei algum tempo nesta fórmula e descobrir como as coisas funcionam, então se eu te economizei algum tempo, eu fiquei feliz em ajudar! :)

    
por 16.02.2017 / 15:49