Configurando uma ferramenta de pesquisa para corresponder a qualquer célula que contenha um 1 em determinados locais de dígitos

1

Eu tenho uma ferramenta de pesquisa que estou desenvolvendo no Excel. Na coluna "EU", tenho células, cada uma contendo uma sequência de 124 dígitos. Essas cadeias consistem em 0 e 1. Eu tenho 124 características que produzem o 1 ou 0 ..., e os usuários podem querer procurar por características 1,2,3,4,5 etc. Para simplificar, digamos, EU1 tem a cadeia 0100100011 ..... e eu quero encontrar qualquer célula que contenha 0100100000 ou possivelmente 0000100010 etc. Em outras palavras, eu quero encontrar qualquer string contendo um "1" em um local de dígito específico, possivelmente vários 1's em vários locais de dígitos .......... Exemplo Eu quero testar se qualquer uma dessas 3 combinações .....

0000010000000001000000000000010010000010000000100000010010010000000000101100100000100000000000000000000000000000000000000100 0000000000001010001000000010010010010010000000100000010010010000000000100100100000100100000100000000000000000000000001000100 0000000000000110000010000010001001010000010000100000010010010000000000100100100001000100000100000000000000000000000001000100

tem 1s nesses locais ......

1000000000000000000000000000000000000000000000000000000000000000000001000000000000000000001000100000000000000000000000000000

se houver 1s em outros locais, tudo bem, mas não se a condição de teste tiver 1 e os locais testados tiverem um zero nesse dígito.

Colocando de outra forma, e usando exemplos mais compreensíveis, fingir que minhas cordas têm apenas cinco caracteres, e que minhas primeiras cinco cordas são

EU1       10000
EU2       10001
EU3       11000 
EU4       11011
EU5       00001

Eu quero procurar por strings onde toda a lista designada de posições de caracteres contém 1 s, comparando cada um deles com uma string de pesquisa variável que contém 1 em todas as posições onde eu quero que haja um 1 . Zeros na variável são curingas. Outra maneira de dizer é que a string de pesquisa funciona como uma máscara.

Por exemplo, para encontrar sequências cujos primeiros dois dígitos são 1 s (não se importa com o resto) Eu gostaria de especificar 11000 e obter correspondências para as strings EU3 e EU4. (Isso pode representar uma pesquisa por objetos que são A ngular e B lue.) Uma pesquisa em 10000 (todos os objetos que são A ngular) deve combinar em todas as cordas cujo primeiro dígito é 1 , ou seja, EU1, EU2, EU3 e EU4. 11100 (todos os objetos que são A ngular AND B lue AND C ircular) não deve dar resultado, porque nenhuma string contém 1 no lugar do terceiro dígito. Por outro lado, 00000 deve corresponder a todas as strings, porque uma string de pesquisa de zeros é um caractere curinga.

Em forma de tabela:

Search string:   11000       10000       11100       00000
                 ↓↓          ↓           ↓↓↓
EU1              10000     → 10000       10000     → 10000
EU2              10001     → 10001       10001     → 10001
EU3            → 11000     → 11000       11000     → 11000
EU4            → 11011     → 11011       11011     → 11011
EU5              00001       00001       00001     → 00001
                                        (none)       (all)
    
por BearOnFire 22.10.2015 / 23:48

2 respostas

0

Para simplificar, eu coloco seus dados na coluna E , começando na linha 2. Eu coloquei a string de pesquisa na célula D2 . (É claro que D2 e Coluna E devem ser formatados como texto, ou você deve digitar uma aspa simples ( ' ) antes de cada número.)

Eu escolhi a abordagem de usar os recursos de pesquisa nativa do Excel. Uma string de pesquisa de 11000 significa que estamos procurando valores onde o primeiro dígito é um 1 , o segundo dígito é um 1 , e o terceiro até o quinto caractere é qualquer coisa. Como você disse, zeros na variável (string de pesquisa) são curingas.

A representação padrão desse curinga é 11??? - então eu defino cell D3 para

=SUBSTITUTE(D2, "0", "?")

A pergunta não especificou como o (s) resultado (s) deve (m) ser apresentado (s). Uma maneira seria, para cada valor na coluna E , para indicar se é uma correspondência. Podemos fazer isso pesquisando cada valor E da string curinga. Se for encontrado, SEARCH retornará 1, caso contrário, retornará um erro. Assim, podemos obter um valor TRUE ou FALSE apropriado colocando

=NOT(ISERROR(SEARCH($D$3, E2)))

em F2 e arrastando-o para baixo para cobrir todos os E dados. (Observe que FIND não permite caracteres curinga.)

Mas pode ser mais conveniente ter uma lista dos índices dos valores correspondentes. Podemos conseguir isso usando MATCH para pesquisar a coluna. Eu coloquei um 1 na célula G1 e

=MATCH($D$3, INDEX($E$2:$E$99, G1):$E$99, 0) + G1

na célula G2 (ajustando o 99 s para corresponder à última linha de dados) e arraste / preencha isso. Isso procura a sequência curinga (que está em D3 ) na coluna E , começando no ponto da partida anterior. Isso retorna o número linha das correspondências; Por exemplo, "String D" ( 11011 , que está na célula E5 ), é relatado como 5. Se você quiser que "String D" seja relatado como 4, é um ajuste fácil.

Aqui estão os resultados para os dados de amostra que você sugeriu:




É claro que as células D3 e G1 podem estar ocultas. E, se você realmente precisa iniciar seus dados na Linha 1, isso pode ser providenciado.

P.S. Eu testei isso com valores longos de 124 caracteres, e ambas as partes da resposta parecem funcionar.

    
por 27.10.2015 / 07:46
0

Digamos que temos dados na coluna UE de EU1 para EU100 . Para encontrar células com sua correspondência de padrões, use:

Sub Finderr()
   For i = 1 To 100
      v = Cells(i, "EU").Text
      If Mid(v, 1, 1) = "1" And Mid(v, 70, 1) = "1" And Mid(v, 91, 1) = "1" Then
         MsgBox i
      End If
   Next i
End Sub

mostrará quais linhas contêm correspondências.

    
por 23.10.2015 / 01:08