Gere uma lista separada por vírgula do conteúdo da célula, excluindo espaços em branco


5

Para concatenar algumas células, eu usaria:

=CONCATENATE(A2,",",C2",",D2,",",F2)

Isso faria com que ...

  • A2 = "Mateus"
  • C2 = "Marca"
  • D2 = "Lucas"
  • F2 = "João"

resultaria em Matthew,Mark,Luke,John.

Mas encontramos problemas com algo como ...

  • A2 = "Jesus"
  • C2 = ""
  • D2 = "Maria"
  • F2 = "José"

o que resultaria em Jesus,,Mary,Joseph.

Aqui, a vírgula extra é indesejada. Existe uma maneira de lidar com isso normalmente, para que todas as células não em branco sejam incluídas na lista separada por vírgulas, evitando a adição de vírgulas desnecessárias quando algumas células estiverem em branco?

Certamente, isso pode ser feito com um número razoável de IFs aninhados, mas eu realmente quero evitar isso, se possível. Isso pode ser feito com funções nativas do Excel ou talvez com uma fórmula de matriz? Ou seria preciso recorrer ao Script VB para algo assim?


11
Aqui está a solução VBA , mas também estou ansioso por uma solução que não seja VBA. A resposta aceita funcionar com o seu exemplo, como você pode ver aqui
nixda

Respostas:


8

No Excel 2016, você pode usar TEXTJOIN:

=TEXTJOIN(delimiter,ignore_blanks?,values_to_be_joined)

Portanto, no seu caso, você usaria esta fórmula:

=TEXTJOIN(",",TRUE,A2,C2,D2,F2)

Embora isso possa responder à pergunta, considere adicionar explicações para torná-la mais compreensível. Isso realmente responde à pergunta.
Vylix

11
Este é de longe o melhor e mais eficiente resposta
Vylix

5

Como você disse, os IFs aninhados não são sua xícara de chá, mas não vejo outra maneira de fazer isso, sem a solução VBA apontada pelo @nixda.

Para as soluções que apresento, presumo que seus dados sejam os seguintes:

 |    A    |
-+---------+
1| Matthew |
2| Mark    |
3| Luke    |
4| John    |

Eu tive uma solução que fez o que você queria, mas ficou "enterrada" . Entendi depois de ler os comentários que você deixou em uma resposta recente (especialmente o comentário sobre o fato de você sempre ter a primeira célula preenchida). Isso permite não existir um ninho, pois a primeira condição (no raciocínio abaixo) é sempre falsa.

=CONCATENATE(A1;IF(ISBLANK(A2);"";"," & A2);IF(ISBLANK(A3);"";"," & A3);IF(ISBLANK(A4);"";"," & A4))

Você sempre pode soltar CONCATENATEe substituir a fórmula por e comercial, conforme indicado na resposta por @Scott. Neste ponto, é simplesmente uma questão cosmética.

= A1 & IF (ISBLANK (A2); ""; ", & A2) & IF (ISBLANK (A3);" ";", "& A3) & IF (ISBLANK (A4);" ";", " & A4)

O primeiro valor é sempre escrito, portanto, a única coisa necessária é verificar se a célula ativa está em branco e adicionar uma vírgula por trás, se não estiver.

Dessa forma, você não precisa de nenhuma célula auxiliar, tudo em uma única função.

Também escrevi uma versão mais elaborada, porque assumi o termo geral (ou seja, pode haver uma situação em que você não preencheu sua primeira célula). Requer apenas um ninho de dois níveis, porque há no máximo três condições que precisam ser verificadas:

  • As células antes da célula ativa estão vazias?
  • A célula ativa está vazia?
  • Nenhuma das alternativas acima é verdadeira? (condição padrão)

A formatação necessária, supondo que você tenha iniciado o raciocínio desde o início, é a seguinte:

  • Se sim, não coloque vírgula antes dos dados da célula. Se não, prossiga.
  • Se sim, não coloque nada (uma solução alternativa seria colocar a célula).
  • Se nenhum for verdadeiro, coloque uma vírgula atrás dos dados da célula.

Como tal, aqui está a fórmula que eu usei. Eu assumi que todos os dados estavam em uma coluna, para usar em uma linha alterar algumas fórmulas e o intervalo.

=CONCATENATE(A1;IF(ROWS(A1:A1)=COUNTBLANK(A1:A1);A2; IF(ISBLANK(A2);"";"," & A2));IF(ROWS(A1:A2)=COUNTBLANK(A1:A2);A3; IF(ISBLANK(A3);"";"," & A3));IF(ROWS(A1:A3)=COUNTBLANK(A1:A3);A4; IF(ISBLANK(A4);"";"," & A4)))

ROWSconta o número de linhas em um determinado intervalo. Se igualar o número de células em branco atrás da célula ativa , significa que todas as células atrás da célula ativa estão em branco; portanto, nenhuma vírgula deve ser colocada antes.

O intervalo em ROWSe COUNTBLANKsão as células atrás da célula ativa .


A versão em português do Excel usa ponto e vírgula para separar argumentos de função? Geralmente é uma vírgula para o inglês.
Iszi

As preferências regionais (no Windows) nos países de língua portuguesa fazem com que o Excel use ponto e vírgula como separadores de argumentos (porque usamos vírgulas para o ponto decimal). Se isso te incomoda, posso editar minha resposta.
Doktoro Reichard

3

Se você estiver disposto a usar algumas células "auxiliares" para valores intermediários, pode ser o seguinte:

Defina a célula AA2(ou Sheet2!A2, ou onde você quiser) para

=IF(A2="", "", A2&",")

(onde é apenas uma maneira mais curta de dizer ), e as células definido , e de forma semelhante. Defina comox & yCONCATENATE(x, y)AC2AD2AF2AZ2

=AA2 & AC2 & AD2 & AF2

Então seu resultado final é

=IF(AZ2="", "", LEFT(AZ2, LEN(AZ2)-1))

Explicação:

As células AA- AFacrescentam vírgulas aos valores que não estão em branco. Então, usando seu exemplo,

Matthew         Mark            Luke            John

resultaria em

Matthew,        Mark,           Luke,           John,

enquanto

Jesus                           Mary            Joseph

resultaria em

Jesus,                          Mary,           Joseph,

(observe a falta de vírgula na coluna C). 

AZ2é uma concatenação simples do que foi dito acima: Jesus,Mary,Joseph,eliminamos a vírgula extra depois, Jesusmas adicionamos uma no final.  LEFT(AZ2, LEN(AZ2)-1)é tudo AZ2exceto o último caractere. E precisamos testar se AZ2é nulo para evitar um erro se todas as quatro células de entrada estiverem vazias.


2
O ponto positivo das soluções "usar algumas células 'auxiliares" é que geralmente as fórmulas para as' células auxiliares 'podem ser escritas diretamente na fórmula da célula de destino. Peguei sua ideia e integrei tudo em uma fórmula. =CONCATENATE(S2,IF(U2="","",", "&U2),IF(V2="","",", "&V2),IF(W2="","",", "&W2))Uma coisa que esqueci de mencionar é que a primeira célula da minha lista (S2 neste exemplo) será obrigatória . Portanto, aceitando que a primeira célula sempre seja preenchida, podemos mover as vírgulas para a frente de cada sequência subsequente e evitar um excesso de vírgula no final.
Iszi

Nota: Embora essa solução ainda exija instruções IF, observe que minha intenção original era evitar IFs aninhados . Aqui, os FIs não precisam ser aninhados e não há repetição real envolvida - há apenas uma instrução IF para cada célula que precisa ser concatenada. Portanto, a menos que haja uma solução melhor que envolva algum tipo de loop ou matriz, essa é definitivamente uma resposta aceitável.
Iszi

2

Presumo que você esteja procurando uma solução simples e não para melhorar suas habilidades.

Você pode usar um suplemento se isso for permitido (ou seja, você tem permissão para instalar suplementos). O mais rápido possível é aquele que eu recomendo, gratuito para uso não comercial.

Aqui está o que você pode fazer com uma de suas funções

Este utilitário mescla os dados das colunas em sua seleção. Para cada linha da sua seleção, os dados das colunas adjacentes serão concatenados na primeira célula da linha.

Você pode especificar o seguinte: Delimitador para colocar entre os valores da célula Ignorar células vazias Use o valor, a fórmula ou o valor formatado das células.

Captura de tela


1

Se você deseja uma solução geral, a melhor resposta envolve o VBA.

Se seus dados de exemplo estiverem próximos do problema completo que você está solucionando, basta fazer o seguinte para remover vírgulas duplas:

=SUBSTITUTE(CONCATENATE(A2,",",C2",",D2,",",F2),",,",",")

O exemplo acima só funcionará se você tiver apenas intervalos com um valor amplo. Você precisará de fórmulas substitute aninhadas () para lidar com intervalos maiores.

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(A2,",",C2,",",D2,",",F2),",,,,,,,,,,,,,,,,",","),",,,,,,,,",","),",,,,",","),",,,",","),",,",",")

O acima irá reduzir até 398 vírgulas seqüenciais para um. Também reduzirá muitos valores acima de 399, mas o próprio 399 e vários outros resultarão em mais de uma vírgula.


A última fórmula é um ninho bastante grande ... e se a seguir estiver correta, você substituirá 8 vírgulas por 1, depois 4 por 1, 3 a 1 e 2 a 1. Entendo o raciocínio por trás do 3 (é o próximo número ímpar depois de 1) Não chegue onde você reduzirá essas 398 vírgulas em potencial, a menos que SUBSTITUTEprocure por todas as correspondências separadas dentro da string.
Doktoro Reichard

SUBSTITUTEsubstitui todas as correspondências. 398 (24 * 16 + 14) vírgulas são reduzidas para 38 vírgulas, 38 (4 * 8 + 6) para 10, 10 (2 * 4 + 2) para 4, 4 (1 * 3 + 1) para 2 e 2 para 1.
Dane

Eww. SUBSTITUTOS aninhados realmente não são tão melhores que os IFs aninhados.
Iszi

11
A razão pela qual eu disse "evitar IFs aninhados" foi porque meu pensamento inicial era fazer alguma forma de =IF(AND(B2="",C2="",D2=""),A2,IF(AND(C2="",D2=""),CONCATENATE(A2,", ",B2) ...Mas, como você pode aninhar um IF dentro de CONCATENATE, acontece que eu realmente preciso apenas de uma instrução IF por célula para ser concatenada - ainda é uma pouco menos do que o ideal, pois eu preferiria alguma forma de loop FOR ou uma função de matriz, mas funciona muito bem. Veja meu comentário na resposta de @ Scott.
Iszi

11
@Iszi Na verdade, há este post no StackOverflow ( como fazer loop no Excel sem VBA ou macros? ), Mas você precisaria ter seus dados formatados com precisão (concluídos) e algumas células auxiliares.
Doktoro Reichard

1

Presumo que seus dados tenham cabeçalhos e iniciem em A2.

  1. Vá para qualquer coluna sobressalente, usarei B neste exemplo
  2. Na célula B2, digite simplesmente = A2
  3. Na célula B3, insira = SE (A3 = "", B2, CONCATENATE (B2, ",", A3)
  4. Copie a coluna B de B3 (não B2!) Para a última linha que contém dados na coluna A

Voila, sua lista separada por vírgulas está na última célula da coluna B :)

Eu vim aqui procurando uma solução, não encontrei nenhuma e, por isso, criei o que foi dito acima. Meus dados têm 1000 linhas, portanto, adicionar manualmente à concatenação não é uma opção.


0

Basta combinar Concatenate () com if () em uma função de matriz:

=arrayformula(concatenate(if(not(isempty(a2:f2)),a2:f2&", ","")))

Essa função deixará uma vírgula no final da sua lista; portanto, se você precisar evitar isso e souber exatamente onde está o final da lista (no seu exemplo, coluna f), apenas lide com essa separadamente:

=arrayformula(concatenate(if(not(isempty(a2:d2)),a2:d2&", ","")))&if(not(isempty(f2)),f2,"")

Felicidades!


11
a primeira fórmula fornece #NAME? erro
Prasanna

2
Parece ser uma fórmula de planilhas do Google. As fórmulas de matriz são especificadas pela entrada de teclas no Excel, não por uma função da planilha.
Excellll

11
ARRAYFORMULAé uma função de planilha do Google. No Excel, você deve usar Ctrl + Shift + Enter
phuclv

0

Não me lembro onde encontrei essa solução, mas funciona muito bem para obter uma lista de strings.

Para dados nas células A1 a A3

=CONCATENATE(TRANSPOSE(A1:A3)

Pressione Enter, volte para a barra de fórmulas e realce A1: A3 na fórmula e pressione F9. Isso transformará seu intervalo em uma lista delimitada por ponto-e-vírgula com aspas em torno de cada item.

=CONCATENATE(TRANSPOSE({"Matthew", "Mark", "John"}))

Depois de pressionar F9, realce e copie a lista e cole em outra célula. A partir daqui, você pode encontrar e substituir para usar vírgulas em vez de ponto-e-vírgula ou aspas simples em vez de duas vezes.


1. Bem-vindo ao superusuário. Resposta legal. No entanto: 2. Isso não é muito aplicável à pergunta. Por exemplo, os dados do consultante não estão em A1: A3. Seria mais útil se visasse especificamente a pergunta a ser respondida. 3. Sua primeira fórmula possui um erro de sintaxe. 4. Você não precisa fazer nada disso para aproveitar o 'truque' do F9. Basta digitar =A1:A3uma célula, F2 na barra de fórmulas, F9 para avaliar. Sua resposta tem a semente de uma dica útil, mas é ofuscada por muitos detalhes totalmente estranhos e confusos. 5. É também uma solução pontual que realmente não ajuda a avançar.
Alex M
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.