Conditional concatena o conteúdo da célula nas linhas

7

Eu tenho uma planilha com milhares de linhas que contêm uma ID exclusiva A e um código de erro 3% diferente M . Cada ID individual pode ter 1, 2 ou 3 erros. Eles sempre estarão na mesma ordem.

Eu digitei manualmente e em N qual é a saída desejada. Eu escrevi uma fórmula como esta em cols O, P, Q com o texto do erro:

=IF(IFERROR(SEARCH("Brand is not valid", M42), "") <> "", "Brand", "")

Eu tentei algo assim em R , mas não está funcionando corretamente por razões óbvias. Existe uma maneira de fazer isso para que R pareça com N ?

=CONCATENATE(O42,"/", P42,"/",Q42)

Se não for possível fazer com a fórmula do Excel, talvez exista uma maneira VBA?

    
por Phrancis 02.06.2015 / 19:26

2 respostas

4

OK, peguei um pouco de cabeça, mas entendi:

Colunas O , P & Q como você os tem, intitulado Brand , Product & %código%. Transforme tudo em uma tabela com Ctrl - T (não é necessário, mas prático, e minha coluna OEM confia nela, mas você pode usar referências de coluna se quer)

Coluna R :

=IF(LEN([Brand])>0,[Brand],IF(LEN([Product])>0,[Product],IF(LEN([OEM])>0,[OEM],"")))

Coluna R :

=IF(A2=A4,F2&"/"&F3&"/"&F4,IF(A2=A1,"",IF(A2=A3,F2&"/"&F3,F2)))

Infelizmente, parece que a única maneira de usar referências de tabela para uma linha diferente é usar S , então, para simplificar, voltei às referências de célula. Isso meio que nega o fator legal / prático de transformar a coisa toda em uma mesa em primeiro lugar, mas, o que seja ...

E ... Aqui está uma foto do que parece:

    
por 02.06.2015 / 20:38
4

Eu começaria otimizando suas fórmulas O , P e Q . Você atualmente tem

=IF(IFERROR(SEARCH("Brand is not valid", M42), "") <> "", "Brand", "")

IFERROR é uma ótima função para exibir uma versão higienizada de um valor computado que pode ser um código de erro; Eu uso e recomendo em respostas no Super User, freqüentemente. Como você provavelmente sabe,

  • IFERROR(calculated_value, default_value)

é curto para

  • IF(ISERROR(calculated_value), default_value, calculated_value)

Mas usando IFERROR para criar uma versão higienizada de algum valor e testando esse valor para fazer algo condicionalmente é uma maneira desnecessariamente estranha de usar IFERROR . A fórmula acima pode ser simplificada para

=IF(ISERROR(SEARCH("Brand is not valid", M42)), "", "Brand")

E, como você sabe, SEARCH("Brand is not valid", M42) testa para ver se M42 contém Brand is not valid . Mas, desde que a coluna M possa conter apenas as três cadeias de erro, isso pode ser encurtado para

=IF(ISERROR(SEARCH("Brand", M42)), "", "Brand")

ou simplificado para

=IF(M42 = "Brand is not valid", "Brand", "")

OK, agora tornarei as fórmulas O , P e Q um pouco mais complicadas:

  • O42=IF($A42=$A41, O41, "") & IF(ISERROR(SEARCH("Brand", $M42)), "", "Brand")
  • P42=IF($A42=$A41, P41, "") & IF(ISERROR(SEARCH("Product", $M42)), "", "Product")
  • Q42=IF($A42=$A41, Q41, "") & IF(ISERROR(SEARCH("OEM", $M42)), "", "OEM")

A fórmula para O42 diz

If this is the second or third row for this ID (Column A), look at the cell above this one (i.e., the Column O cell for the previous row) to see whether we’ve already established that this thing has an invalid brand.  Also, look at Column M for this row to see whether it is Brand is not valid.  Then concatenate the results.

Como um ID único nunca será listado duas vezes com o mesmo erro (certo?), estes dois sub-resultados nunca serão ambos vazios, então isso é essencialmente fazer um "OR":

Show a value of Brand if this row, OR one of the previous row(s) for this ID, contains the invalid brand error.

Isso tem o efeito ou arrasta os valores O , P e Q até a última linha de cada ID:

Observequeaslinhas41,44,47e49mostram,cadauma,asformasabreviadasdetodososerrosqueseaplicamaseusrespectivosIDsnascolunasO,PeQ.

EudefiniColunaRdamesmaformaquevocêfez.Consulte Gerar uma lista separada por vírgula do conteúdo da célula, excluindo espaços em branco para técnicas para eliminar as barras indesejadas disso.

Se tiver a concatenação desejada somente nas linhas 41, 44, 47 e 49 já está bom o suficiente. Caso contrário, defina N42 como

=IF($A22=$A23, N23, R22)

ou

=IF($A22<>$A23, R22, N23)

Isso é quase exatamente o mesmo truque que usei nas colunas O , P e Q . mas indo na direção oposta:

If this is the last row for this ID (i.e., if this is row 41, 44, 47, or 49), use the concatenation of the values from this row (which is the complete collection of error codes for this ID).  Otherwise, look at the cell below this one (i.e., the Column N cell for the next row), which will have the correct answer.

Em outras palavras, os valores desejados percolam até a primeira linha para cada ID.

    
por 03.06.2015 / 06:47