Faixa de pesquisa de palavras na faixa de sentenças

1

Baseado no seguinte exemplo:

enter image description here

Eu quero procurar por palavras do $D$2:$D$6 variam em frases do $A$2:$A$8 alcance e use o valor da coluna lateral (aqui Tag ). Até agora estou fazendo isso:

B2 formula
------------------
=IF(NOT(ISERROR(SEARCH($D$2,A2))),$E$2,
IF(NOT(ISERROR(SEARCH($D$3,A2))),$E$3,
IF(NOT(ISERROR(SEARCH($D$4,A2))),$E$4,
IF(NOT(ISERROR(SEARCH($D$5,A2))),$E$5,
IF(NOT(ISERROR(SEARCH($D$6,A2))),$E$6,
"other"
)
)
)
)
)

Embora isso funcione, minha fórmula é tão longa quanto o número de palavras de pesquisa que tenho, ao passo que eu gostaria de usar um intervalo para torná-lo mais limpo e fácil de manter (por exemplo, se adicionar uma palavra de pesquisa, preciso adicionar uma IF declaração para essa palavra na minha fórmula).

Existe uma maneira de replicar a solução acima com uma fórmula baseada em intervalo?

Max
fonte

Respostas:

1

Você pode usar essa fórmula comum em B2 copiada

=LOOKUP(2^15,SEARCH(D$2:D$6,A2),E$2:E$6)

Veja a discussão e mais sobre essa fórmula Aqui

barry houdini
fonte
Eu prefiro este sobre a solução do @ bensheperd já que eu não tenho que usar uma fórmula de matriz. Para me livrar do alcance estático que tenho =LOOKUP(2^15,SEARCH(INDIRECT("D$2:D$"&COUNTA($D:$D)+1),A2),E$2:E$6). O que é interessante é que apesar de eu ter E$2:E$6 estática, funciona (ou seja, procura por valores nas células abaixo E$6 :)
Max
Eu converteria colunas D e E em uma tabela [Selecione o intervalo, Inserir & gt; Tabela e use "palavras" e "tags" na linha de cabeçalho], então sua fórmula pode ser esta: =LOOKUP(2^15,SEARCH(Table[words],A2),Table[tags]) - Se você adicionar linhas à tabela, elas serão incorporadas automaticamente
barry houdini
1

Você precisa usar a fórmula de matriz. Na célula B2, digite:

=IFERROR(OFFSET($E$1,MATCH(1E+37,SEARCH(D$2:D$6,A2),1),0),"other")

e pressione Ctrl + Shift + Enter para inseri-lo como uma fórmula de matriz.

Ele usa o SEARCH função para coincidir com cada palavra em sua lista, e encontra o último que é menor que um "grande número" (aqui 1E + 37). Se houver mais de uma correspondência, ela encontrará a que estiver mais abaixo na lista (por exemplo, "um carro vermelho e um gato preto" retornará "objeto"). Caso nenhum seja encontrado, o IFERROR bit lhe dá "outro".

Claro, você terá que estendê-lo à medida que sua lista ficar mais longa. (Lembre-se sempre de Ctrl + Shift + Enter quando você edita!

benshepherd
fonte
Eu acredito que você quis dizer "In B2, type:"
Max
Para me salvar de ter que atualizar a fórmula toda vez que eu modifico meu alcance, eu substituí D$2:D$6 com INDIRECT e COUNTA que está funcionando bem: =IFERROR(OFFSET($E$1,MATCH(1E+37,SEARCH(INDIRECT("D$2:D$"&COUNTA($D:$D)+1),A2),1),0),"other")
Max
Sim; Pensei em mencionar algo assim, mas não gostei de complicá-lo, já que você não especificou se ele não seria atualizado regularmente. OFFSET com um número de linhas pode ser mais "elegante" do que INDIRECT. Eu também gosto de usar intervalos nomeados dinâmicos. Muitas maneiras de esfolar um gato :)
benshepherd
0

Para resolver isso eu usei alguns VBA em um botão habilitado para macro na página chamada 'Atualizar' para que você pudesse acrescentar a folha como necessária;

Private Sub CommandButton1_Click()
Dim Target, cell As Range
Set Target = Range(Range("A1"), Range("A65536").End(xlUp))

    Dim term, tag As String

        term = "cat"
        tag = "animal"
        For Each cell In Target
            If InStr(1, cell, term, 1) Then cell.Offset(0, 1).Value = tag
        Next cell

        term = "dog"
        tag = "animal"
        For Each cell In Target
            If InStr(1, cell, term, 1) Then cell.Offset(0, 1).Value = tag
        Next cell

        i = "car"
        k = "object"
        For Each cell In Target
            If InStr(1, cell, term, 1) Then cell.Offset(0, 1).Value = tag
        Next cell

        term = "plane"
        tag = "object"
        For Each cell In Target
            If InStr(1, cell, term, 1) Then cell.Offset(0, 1).Value = tag
        Next cell

        term = "sister"
        tag = "person"
        For Each cell In Target
            If InStr(1, cell, term, 1) Then cell.Offset(0, 1).Value = tag
        Next cell

    End Sub

O formato básico de;

term= "cat"
tag = "animal"
For Each cell In Target
    If InStr(1, cell, i, 1) Then cell.Offset(0, 1).Value = k
Next cell

Pode ser copiado e os valores de variáveis ​​de termo e tag alterados para qualquer termo de pesquisa e tags que você desejar, sem precisar existir na planilha.

Também é importante notar que sua equação IF está usando um negativo duplo, você pode usar IF (SEARCH em vez de IF (NOT (ISERROR (SEARCH).

J_D
fonte
Obrigado, mas parece que o seu VBA vai exigir ainda mais manutenção do que minha fórmula. Além disso, eu discordo IF(SEARCH sendo o mesmo que IF(NOT(ISERROR( SEARCH, se a pesquisa falhar, o primeiro retorna #VALUE! enquanto o segundo retorna o IF valor de caso falso: veja por si mesmo =IF(SEARCH("a","b"),"found","not found") e =IF(NOT(ISERROR(SEARCH("a","b"))),"found","not found")
Max
Ah sim, esqueci que a pesquisa retorna um número. Eu discordo sobre a manutenção, o código é fácil de anexar e pode escalar facilmente para conjuntos de dados maiores, no entanto, a abordagem Houdini certamente é mais elegante.
J_D