Procurando valores (texto) no array do Excel

0

Eu estava procurando na internet e brincando no Excel 2010, mas não consegui encontrar uma resposta.

Por uma questão de limpeza, fiz um resumo, mas o arquivo real é muito maior.

Emoutraplanilha,queropesquisarotextoAeobterasaídadotemporelativo(ColunaB).Noentanto,sealinha2seestenderatéacolunaZ(ouatémais),queroquetodosostemposdesaídaretornemomesmovalor,conformevisívelparaA,BeCnafiguraabaixo.

A coluna D provavelmente será perdida / ocultada quando eu corrigir a formatação condicional. Também é possível que 'K' venha antes de 'H', então os valores podem não estar em ordem (como é visível para F, G e H

Este é o primeiro problema. Eu tentei resolvê-lo com INDEX-MATCH, mas para um número desconhecido de linhas e colunas é muito tedioso. Há também muitos espaços em branco, então eu preciso construir cofres para isso também.

A fórmula para apenas 6 colunas seria assim:

=IFERROR(INDEX(T0.02!$B$1:$B$100;IF(ISNA(MATCH($A3;T0.02!$D$1:$D$100;0))=FALSE;MATCH($A3;T0.02!$D$1:$D$100;0);IF(ISNA(MATCH($A3;T0.02!$E$1:$E$100;0))=FALSE;MATCH($A3;T0.02!$E$1:$E$100;0);IF(ISNA(MATCH($A3;T0.02!$F$1:$F$100;0))=FALSE;MATCH($A3;T0.02!$F$1:$F$100;0);IF(ISNA(MATCH($A3;T0.02!$G$1:$G$100;0))=FALSE;MATCH($A3;T0.02!$G$1:$G$100;0);IF(ISNA(MATCH($A3;T0.02!$H$1:$H$100;0))=FALSE;MATCH($A3;T0.02!$H$1:$H$100;0);IF(ISNA(MATCH($A3;T0.02!$I$1:$I$100;0))=FALSE;MATCH($A3;T0.02!$I$1:$I$100;0);"")))))));"")

A questão principal para mim é: é possível fazer isso de uma maneira mais fácil no Excel, ou há uma maneira de fazer isso com o VBA. Eu não sou realmente "bom" com o VBA, então eu realmente preciso de ajuda com isso.

    
por Kees 11.02.2013 / 13:56

3 respostas

1

Aqui está uma abordagem que usa alguns VBA para simplificar a pesquisa sem células auxiliares.

A parte do VBA é essa função definida pelo usuário (comumente chamada de UDF) que serve ao mesmo propósito da função MATCH que você estava tentando usar para encontrar a linha na qual o texto foi encontrado:

Function FindRow(valueToFind, searchRange As Range, Optional IsCaseSensitive As Variant) As String
   Dim aCell As Range
   Dim lastCell As Range
   If IsMissing(IsCaseSensitive) Then
      IsCaseSensitive = False
   End If
   Set lastCell = searchRange.Cells(searchRange.Rows.Count, searchRange.Columns.Count)
   Set aCell = searchRange.Find(valueToFind, After:=lastCell, LookIn:=xlValues, MatchCase:=IsCaseSensitive, LookAt:=xlWhole)
   FindRow = aCell.Row - searchRange.Cells(1, 1).Row + 1
End Function

O que torna isso útil é que a função VBA FIND, ao contrário da função MATCH da planilha, pode pesquisar em um intervalo que abrange várias colunas e linhas. Como MATCH, essa função VBA retorna a linha dentro do intervalo de pesquisa que um valor especificado é encontrado e retorna um valor de erro #VALUE! erro se não puder encontrar o valor.

Os dois primeiros argumentos do FindRow são o valor a ser encontrado (ou a célula na qual o valor está localizado) e o intervalo a ser examinado. Há um terceiro argumento opcional: se definido como TRUE ou 1, o resultado será maiúsculas e Minúsculas; se omitido ou definido como FALSE ou 0, o achado não diferencia maiúsculas de minúsculas.

Na segunda folha, você usará o INDEX em combinação com o FindRow para procurar o horário, por exemplo,

=INDEX(Sheet1!$B$2:$B$8,FindRow(A3,Sheet1!$D$2:$Z$9))

com o segundo argumento para FindRow definido para o intervalo que contém os valores de comentário. Embora eu tenha mostrado o intervalo de pesquisa que se estende até a coluna Z e a linha 9, o FindRow pode manipular intervalos de qualquer tamanho.

Para instalar a função VBA, primeiro selecione "Visual Basic" na guia Desenvolvedor na faixa de opções. Selecione o nome da pasta de trabalho no painel Project na parte superior esquerda (a pasta de trabalho será designada como "VBAProject (YourSheetName)" e insira um módulo usando a barra de menus na parte superior. Finalmente, cole o código de função no painel de código grande exibido o direito.

    
por 11.02.2013 / 22:10
0

Eu usei a coluna C na sua primeira planilha como coluna temporária:

  1. Coluna C na planilha de entrada use:
    =","&D3&","&E3&","&F3&","&G3&","&H3&","&I3&","&J3&","&K3&","&L3&","&M3&","&N3&","&O3&","&P3&","&Q3&","&R3&","&S3&","&T3&","&U3&","&V3&","&W3&","&X3&","&Y3&","&Z3
    - para combinar todos os comentários possíveis em uma célula
  2. no C3 (e nas outras células) na planilha de agregação: pesquise todas as células combinadas na coluna auxiliar para o comentário e use-a em uma função de índice para retornar a hora:
    =IFERROR(INDEX(Sheet1!$B:$B,MATCH(FALSE,ISERROR(FIND(","&A3&",",Sheet1!$C:$C)),0)),"")
    Digite isto como uma fórmula de matriz, isto é, use Ctrl - Deslocamento - Enter .

HTH!

    
por 11.02.2013 / 15:17
0

Você pode fazer isso de forma relativamente simples com uma "fórmula de matriz" sem adicionar colunas, por exemplo, para um intervalo até a coluna Z

=MIN(IF(T0.02!$D$2:$Z$100=$A3;T0.02!$B$2:$B$100))

confirmado com CTRL+SHIFT+ENTER

Se não houver correspondência, você terá zero, se quiser um espaço em branco, para distinguir entre valores zero legítimos, você pode usar SMALL com IFERROR, ou seja,

=IFERROR(SMALL(IF(T0.02!$D$2:$Z$100=$A3;T0.02!$B$2:$B$100);1);"")

    
por 11.02.2013 / 19:58