Comparando duas colunas com valores parciais e obtendo informações sobre o número da correspondência e da coluna

1

Usei o VLOOKUP, MATCH, INDEX e até o complemento Fuzzy. Tenho certeza de que uma delas ou uma combinação pode funcionar, eu simplesmente não tenho o know-how para fazê-la funcionar e obter "# N / A" o tempo todo ...

Problema: Eu tenho 2 colunas, com o número total diferente de itens, cheio de referências. Um tem parcialmente os mesmos números do outro, com algumas alterações, como:

Column A typical number (ex): 025983553-1 
Column B typical number (ex): 225983553

Mas tenho milhares de números e quero corresponder cada célula de A a todo o intervalo de B e, se houver uma correspondência, mesmo na célula B6544, quero saber e obter algo (na coluna C) como "True B6544".

Um (pequeno) exemplo do que estou lidando (e não as referências exatas, são dados confidenciais internos):

       B                J       H
  1 025983553-1     225983553   True, B1
  2 025973223-1     222222345   False
  3 025965463-2     233444667   False
  4 025911122-4     211198989   False
  5 025998764-1     212989238   False
  6 025925925-3     224397501   False
  7 025900000-2     225973223   True, B2
  8 025999999-5     223334445   False
  9 025965453-6     211100110   False
 10 025943536-2     225911122   True, B4
 ...

Como você pode ver, J1 é uma correspondência parcial para B1, então H1 retorna "Verdadeiro, B1".

Como dito acima, eu tentei o MATCH, VLOOKUP, INDEX e o complemento Fuzzy. Eu entendo que eu tenho que algo como:

 =VLOOKUP(B1, $J$1:$J$10, valueThat IwantIThink, FALSE)

Mas nada parece funcionar ... qualquer ajuda será apreciada!

Joaquim Santos
fonte
É garantido que os números tenham o mesmo número de dígitos / caracteres? Além disso, dê um exemplo do que você tentou que não funcionou.
Daniel
Oi Danzel. Não, não é garantido que os números tenham o mesmo número de dígitos ...: / Acho que não lembro exatamente tudo o que tentei, exceto os nomes das funções que usei e o fato de que, no final, estava bloqueando o intervalo de J e tentando forçar B a ser comparado a ele ... e usando a "natureza" do Excel de copiar e adicionar ao valor da célula para alterar o valor de B ao longo do tempo (quando eu arrastei B1 abaixo, seria B2, mas ainda passe de J1 a J10 ...) Obrigado pelo seu tempo!
Joaquim Santos
11
Esclareça o formato de J e qual parte de B deve corresponder. Se, digamos, B for "1234-5", "234" corresponderia? E quanto a "23" ou "34"? Os números em J são únicos? Nos seus exemplos, B sempre começa com um "0", então há um número que pode ocorrer em J (exceto o "2" que está sempre na frente de J) e "-" e um único dígito anexado. Atualize seus exemplos para incluir diferenças que possam ocorrer, por exemplo, número diferente de dígitos, B não começando com "0" (ou talvez mais de um dígito?). Você também deve dar exemplos de valores que não devem corresponder.
Daniel
Tentarei fazer isso quando eu receber o arquivo novamente (não estou no local de trabalho agora ...). Mas, para responder às suas perguntas: J é um número inteiro com dígitos X. É composto da totalidade de B, exceto o 0 (que todas as entradas B têm no início) e o que for depois (e incluindo) o "-". Os números em J são únicos e todos começam com um dígito (2 ou 8 ...) e, em seguida, usam os números de B, conforme indicado acima. Não tenho certeza sobre sua última pergunta, pois eu já coloquei alguns exemplos que não correspondem, ou seja, eles não existem na coluna B. Agradecemos novamente pelo seu tempo e interesse!
Joaquim Santos
Eu adicionei uma resposta, com base em mais informações você fornecer, posso orientá-lo para a solução real que você desejar
Prasanna

Respostas:

1

Experimente esta pequena função definida pelo usuário:

Public Function PartialMatch(r1 As Range, r2 As Range) As Variant
    Dim boo As Boolean, v As Variant, r As Range
    boo = False
    v = Mid(r2.Text, 2)
    For Each r In r1
        If InStr(1, r.Text, v) > 0 Then
            PartialMatch = "True, " & r.Address(0, 0)
            Exit Function
        End If
    Next r
    PartialMatch = boo
End Function

insira a descrição da imagem aqui

Como mostra a ilustração, em K1, digite:

=partialmatch($B$1:$B$10,J1)

e copie para baixo.

A rotina retira o dígito inicial da sub-string e tenta encontrá-lo na coluna.

Aluno de Gary
fonte
Obrigado estudante de Gary! Tentarei sua resposta o mais rápido possível e darei feedback!
Joaquim Santos
1

Como o Excel não suporta expressões regulares, não acho que exista uma fórmula que não precise de uma coluna auxiliar. No meu exemplo,

  • A contém os números com um "-"
  • B contém os números correspondentes
  • C contém os valores de B sem o primeiro dígito
  • D é "FALSE" se o valor de A não corresponder a nenhum da coluna B ou "TRUE", + referência à célula correspondente.

A fórmula em C1 é:

=RIGHT(B1,LEN(B1)-1)

Isso remove o primeiro dígito de B1.

A fórmula em D1 é:

=IFERROR("TRUE, "&ADDRESS(MATCH(MID(A1,2,SEARCH("-",A1)-2),C$1:C$10,0),COLUMN(B1)),FALSE())

Observe que, embora isso deva produzir a saída desejada, eu recomendaria dividir TRUE / FALSE e a referência de célula em duas colunas. Portanto, explicarei apenas a ADDRESSparte, que fornecerá a referência da célula se uma correspondência for encontrada ou um erro caso contrário.

VLOOKUPnão é útil aqui, porque retornará um valor na mesma linha que o valor correspondente. MATCH, por outro lado, retorna a linha do valor correspondente.

  • MID(A1,2,SEARCH("-",A1)-2)retorna a substring de A1, começando com o segundo caractere, até e excluindo a primeira ocorrência de "-". Este é o valor que estamos procurando ( lookup_value).
  • MATCH(lookup_value, C$1:C$10, 0)retornará a linha da primeira ocorrência de lookup_value. Como não podemos aplicar uma função ao intervalo e o Excel não suporta expressões regulares, precisamos da coluna auxiliar C. O último parâmetro ( 0) é necessário porque os valores não são classificados. Observe que o valor da linha retornado é relativo ao intervalo especificado; portanto, se o seu intervalo não começar na linha 1, você deverá contabilizar isso (por exemplo, adicionando ROW([first cell])-1ao resultado de MATCH).
  • ADDRESS(matched_row, COLUMN(B1))produz a referência de célula. Você pode usar o número absoluto da linha em vez de COLUMN(B1)se quiser, mas isso não seria tão legível por humanos.

Você precisa decidir por si mesmo quais referências devem ser absolutas ou relativas.

danzel
fonte
0

Estou tentando responder parcialmente à sua pergunta, pois ainda não temos a imagem completa.

Adicionei duas colunas auxiliares para processar os dados e compará-los - o que proporcionará uma melhor compreensão.

A C-helpercoluna retira 0o início e o final - number.
A I- helpercoluna remove o dígito inicial (ou o primeiro dígito) do J col.
Então eu fiz uma comparação vlookupdos dados e descobri se os dados foram encontrados ou não com base no resultado vlookup (). I-helperC - helper

A fórmula que eu tenho

  • C - helper : ==MID(B4,2,LEN(B4)-3)
  • I - helper : =MID(D4,2,LEN(D4)-1)
  • vlookup col : =IF(ISNA(VLOOKUP(E4,$C$4:$C$13,1,FALSE)),"not_found","found")

A próxima parte do problema é localizar onde essa entrada foi encontrada. Se a entrada for encontrada - seu endereço será retornado, mais a string Not_Available is returned. Os dados de amostra agora se parecem com isso

ABC - ajudante JI - ajudante vlookup col HI X-ajudante
1 025983553-1 25983553 225983553 25983553 encontrado Verdadeiro, B1 $ C $ 4
2 025973223-1 25973223 222222345 22222345 not_found FALSE Não_Disponível
3 025965463-2 25965463 233444667 33444667 not_found FALSE Não_Disponível
4 025911122-4 25911122 211198989 11198989 not_found FALSE Não_Disponível
5 025998764-1 25998764 212989238 12989238 not_found FALSE Não_Disponível
6 025925925-3 25925925 224397501 24397501 not_found FALSE Não_Disponível
7 025900000-2 25900000 225973223 25973223 encontrado Verdadeiro, B2 $ C $ 5
8 025999999-5 25999999 223334445 23334445 not_found FALSE Não_Disponível
9 025965453-6 25965453 211100110 11100110 not_found FALSE Não_Disponível
10 025943536-2 25943536 225911122 25911122 encontrado Verdadeiro, B4 $ C $ 7

Editar

A fórmula que eu tenho

  • X - helper : =IF(F4="found",CELL("address",INDEX($B$4:$C$13,MATCH(E4,$C$4:$C$13,0),2)),"Not_Available")
Prasanna
fonte
Obrigado pelo seu tempo Prasanna. Darei feedback o mais rápido possível. Como você chega à coluna H? Algo como - pseudo-code - se (encontrado): "True", B + celular número ...
Joaquim Santos
@Prasanna, o VLOOKUP é redundante e faz com que cada linha seja correspondida duas vezes. Uma partida é tudo que você precisa.
Danzel