Verificando se existe um rótulo entre dois outros rótulos em uma coluna

1

Eu tenho uma coluna (chamá-lo de A) no Excel lista off diferentes itens e suas propriedades. Cada item tem a palavra "Tipo" associada a ele e, portanto, há uma célula com esse rótulo na coluna A, de modo que, na coluna ao lado dele (B), o tipo possa ser listado. Alguns (não todos) itens também têm um rótulo "Widget" associado a eles.

Como cada item tem apenas um rótulo "Tipo", eu gostaria de poder fazer uma pesquisa no Excel pelo rótulo "Tipo" e, em seguida, verificar se há um rótulo "Widget" ANTES do próximo rótulo "Tipo" e se há é colar o valor na coluna B adjacente ao rótulo "Tipo" em outra planilha. Ele continuaria fazendo isso até que não mais ocorrências da palavra "Tipo" fossem encontradas. Isso é algo viável para implementar? Para tornar o layout mais claro, uma coluna de amostra está abaixo. Observe que o número de espaços entre cada entrada, infelizmente, não é consistente e, portanto, não pode ser usado como uma maneira de rastrear onde está. Da mesma forma, a palavra Widget não precisa estar diretamente acima de Tipo, ela pode aparecer em qualquer lugar entre as duas instâncias de "Tipo" que a sustentam.

**Type**  01
Width     .5
Length    .4
Height    .3
Weight    15
Widget    Blue
**Type**  072
Width      .1 
Length     .1
Height     .1
Weight     50
**Type**   025
Width      .4
Length     .4
Widget     Red
Weight     11
Height     .4

A saída desejada na folha separada seria então simplesmente:

01
025

já que esses são os tipos que possuem um widget associado.

Max Power
fonte
Estou preocupado que seus dados de amostra tenham sido reduzidos demais. É **Type** literalmente repetido várias vezes como um delimitador de categoria ou tem esse rótulo foi homogeneizado a partir de diferentes tipos nos dados reais? Se este último, o que distingue unicamente cada tipo das outras entradas?
Jeeped
Então o objetivo é que a tabela de saída mostre Tipo 01 Azul em três colunas contíguas? (Aparentemente, os asteriscos em torno do Tipo fazem com que ele apareça em negrito nos comentários.)
fixer1234
@ fixer1234: Você sabe disso **text** é Markdown para textnão é? Você pode ter **Type** com backticks, ou ** Tipo **, digitando uma barra invertida antes de cada *.
G-Man
@ G-Man - Obrigado. Eu sabia sobre a remarcação. Não estava ciente de que você pode derrotá-lo com backticks ou backslashes.
fixer1234
Tentando novamente: Então o objetivo é que a tabela de saída mostre **Type** 01 Azul em três colunas contíguas?
fixer1234

Respostas:

1

Fórmula atualizada. Encontra a célula com o primeiro tipo e segundo tipo e procura o widget de palavras entre elas. Se existir, retorne o valor ao lado do tipo, se não retornar em branco.

=IFERROR(IF(MATCH("widget",INDIRECT("A" & SMALL(IF(A:A="type",ROW(A:A),1000000),E1) & ":A" &                
SMALL(IF(A:A="type",ROW(A:A),1000000),E1+1)),0)>0,INDIRECT("B" & 
SMALL(IF(A:A="type",ROW(A:A),1000000),E1)),""),"")

Entrado com ctrl + shift + enter

A célula E1 teria o número 1, E2 teria o número 2. Copie a fórmula para baixo para retornar cada instância do WIDGET. Será erro se não houver mais, então você poderia usar um iferror em torno dele.

Provavelmente levaria um tempo para calcular (ou meu comp só é lento devido a fazer outras coisas agora). e você pode estar melhor usando uma macro.

Abaixo está uma tentativa muito rápida. Ele os lista de baixo para cima. Basicamente, ele passa da última linha para a primeira. Se encontrar widget, ele ativará uma bandeira. Se o sinalizador estiver aceso e encontrar um tipo, ele retornará a célula ao lado dele.

* Editei a macro para trabalhar com a localização do tipo ou widget na string e não apenas uma correspondência exata

Sub get_types()

Dim lRow As Long, cRow As Long, nRow As Long
Dim FindType As Boolean

FindType = False
nRow = 2

With Sheets("sheet1")
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row

    For cRow = lRow To 1 Step -1
        If InStr(UCase(.Range("A" & cRow).Value), "WIDGET") > 0 Then FindType = True
        If FindType And InStr(UCase(.Range("A" & cRow).Value), "TYPE") > 0 Then
            .Range("E" & nRow).Value = .Range("B" & cRow).Value
            FindType = False
            nRow = nRow + 1
        End If
    Next
End With

End Sub

Saída, células azuis devem ser listadas, células vermelhas são ignoradas porque não tem um widget. Células listadas na ordem inversa devido à direção do loop.

enter image description here

gtwebb
fonte
Se bem entendi isso retornará cada entrada na coluna B associada a "widget" e não a entrada na coluna B associada ao "Tipo" associado a "widget".
Max Power
Desculpe eu li a pergunta errada. Vou postar uma resposta, mas levará uma eternidade se o conjunto de dados for razoavelmente grande. Ele também deixará linhas em branco se houver tipos que não possuem widgets
gtwebb
Ambas as coisas são definitivamente gerenciáveis, muito obrigada. Vou dar uma olhada na macro agora. EDIT: A única coisa que eu estou querendo saber é como posso escrever a função $ ISNUMBER (SEARCH ("WIDGET", A1,0))) $ em VBA? Às vezes, pode haver caracteres ocultos, pois os dados são bastante confusos.
Max Power
adicionou uma linha comentada, mas você está procurando por instr ("Encontrar texto aqui", "texto") que retornará 0 se não for encontrado.
gtwebb
Muito obrigado. Uma última pergunta: Um erro em "Então" no seu código comentado resulta em um erro "Compile Error, expected list separator." Qualquer ideia do que pode estar causando isso. Eu estou olhando para isso enquanto escrevo isso.
Max Power
0

Você pode fazer isso com uma instrução IF AND como:

=IF(AND(A1="Widget",A2="**Type**"),B2,"")

Isso basicamente diz ao Excel se o texto "Widget" estiver em uma célula acima de uma célula com o texto "** Tipo **", insira os dados da célula na coluna B ao lado de "** Tipo **", caso contrário, deixe em branco.

Você acaba com isso:

enter image description here

Se você deseja que os dados (072 neste exemplo) apareçam em outra planilha, sua fórmula precisa se referir às células em sua planilha específica. Supondo que você tenha os dados em uma planilha chamada "Folha 1", use esta fórmula na planilha onde deseja que os dados apareçam:

=IF(AND(Sheet1!A2="Widget",Sheet1!A3="**Type**"),Sheet1!B3,"")

fonte
Infelizmente, os dados com os quais estou lidando são um pouco mais confusos do que isso. Por exemplo, o Widget pode não estar diretamente acima Tipo , é apenas algo entre as duas instâncias de Tipo . Por causa disso, não é possível rastrear usando A1, A2 como você fez. Eu deveria ter deixado isso mais claro, desculpe.
Max Power
Talvez você possa ajudar a esclarecer, mostrando o que você espera que a saída seja semelhante.
O problema com a sua fórmula não é realmente a saída, o que é ótimo, é mais que ela se baseia em "Widget" e "Tipo" sendo uma largura fixa afastada uma da outra. Esta suposição não pode ser feita com os dados que tenho, infelizmente.
Max Power
@MaxPower - é o valor em C6 acima, supostamente 072 ou 01 ?
Jeeped
@MaxPower Deve ser 01, mas isso é secundário para a questão de poder verificar acima ou abaixo para o "Tipo" associado ao "Widget" em primeiro lugar, eu acho. Eu deveria ter sido mais claro sobre isso.
Max Power
0

Aqui está minha opinião sobre seus dados e requisitos de amostra. Observe que eu expandi seus dados de amostra para demonstrar como vários cenários são tratados.

Widget Types

As fórmulas padrão em D2: G2 são,

D2 é = IF (COUNTIF (A: A, "Widget") & gt; COUNTIF (D $ 1: D1, "Widget"), "Widget", "") `

E2 é =IF(LEN($D2),INDEX($B$1:$B$9999,SMALL(INDEX(ROW($1:$9999)+($A$1:$A$9999<>"widget")*1E+99,,),ROW(1:1))),"")

F2 é =IF(LEN($D2),INDEX($B$1:$B$9999,SMALL(INDEX(ROW($1:$9999)+($A$1:$A$9999<>"**Type**")*1E+99,,),COUNTIF(INDIRECT("A1:A"&SMALL(INDEX(ROW($1:$9999)+($A$1:$A$9999<>"widget")*1E+99,,),ROW(1:1))),"**Type**"))),"")

G2 é =IF(LEN($D2),VLOOKUP("**Type**", INDIRECT("A"&SMALL(INDEX(ROW($1:$9999)+($A$1:$A$9999<>"widget")*1E+99,,),ROW(1:1))&":B9999"), 2, FALSE),"")

Reduzi os intervalos de células referenciados das referências de colunas completas para minimizar o atraso de cálculo. Ambos INDIRECT e INDEX (em sua forma de array aqui) são considerados volátil funções que recalculam sempre que ocorre um ciclo de cálculo; não apenas quando um valor muda que os afeta diretamente. Preencha conforme necessário.

Eu disponibilizei essa pasta de trabalho de amostra para você no meu OneDrive Aqui para referência e download.

Widget_types.xlsx

Isso provavelmente vai mantê-lo ocupado por um pouco durante a transcrição das fórmulas para seus próprios propósitos. Poste de volta com qualquer específico perguntas que você tem se você tiver um problema.

Jeeped
fonte