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)),""),"")
Inserido 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ê pode usar um iferror em torno dele.
Provavelmente demoraria um pouco para calcular (ou meu comp é lento apenas por 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 um widget, ele ativará uma bandeira. Se o sinalizador estiver ativado e encontrar um tipo, ele retornará a célula ao lado dele.
* Editou a macro para trabalhar com o tipo ou widget encontrado na string e não apenas com 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 possuem um widget. Células listadas na ordem inversa devido à direção do loop.