Configurar 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 seqüências 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. Por simplicidade, digamos que 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 1's nesses locais ......

Dados a base de dados iguais.Valão de dados iguais.Valão de

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 seqüências de caracteres 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 Isso 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 cadeias cujos primeiros dois dígitos 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 UMA angular E B lue.) Uma pesquisa sobre 10000 (todos os objetos que são UMA angular) deve corresponder em todas as cordas cujo primeiro dígito é 1, nomeadamente EU1, EU2, EU3 e EU4. 11100 (todos os objetos que são UMA angular E B lue AND C circular) não deveria ter correspondido, porque nenhuma string contém 1 no lugar do terceiro dígito. Por outro lado, 00000 deve combinar todas as cordas, porque uma string de pesquisa de todos os zeros é um curinga.

Na forma de tabela:

Search string:   11000       10000       11100       00000
                 ↓↓          ↓           ↓↓↓
EU1              10000     →  1  0000 10000 → 10000
EU2 10001 →  1  0001 10001 → 10001
EU3 →  11  000 →  1  1000 11000 → 11000
EU4 →  11  011 →  1  1011 11011 → 11011
EU5 00001 00001 00001 → 00001
                                        (nenhum) (todos) 
BearOnFire
fonte
Sinto muito que seus dados tenham 128 caracteres. Uma solução para o seu problema de 128 caracteres provavelmente funcionará para 8 ou 18 caracteres, e vice-versa. Sugiro que, "por simplicidade", você reduza o seu problema para que suas strings caibam em uma linha - seus dados reais prejudicam meus olhos.
Scott
Eu tenho 5 cordas. String A) = 10000, String B) = 10001, String C) = 11000 String, D) = 11011, String E) = 00001. Eu gostaria de comparar cada uma dessas seqüências de caracteres para uma variável. Portanto, se a variável A) = 11000, eu obteria uma correspondência para a string C e D. Se Var A) = 10000, combine com as strings A, B, C e D. Se Var A) = 11100, nenhuma correspondência, porque nenhuma string contém "1" no lugar do terceiro dígito. Portanto, sempre que um "1" aparecer na variável, é crítico que a string contenha o 1 também. Se a variável A) = 00000, as sequências A, B, C, D e E são todas iguais, pois os zeros na variável são curingas.
BearOnFire

Respostas:

0

Para simplificar, eu coloco seus dados na coluna E, começando na linha 2. Eu coloquei a string de pesquisa no celular D2. (Claro D2 e coluna E deve ser formatado 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 deste curinga é 11??? - então eu coloco celular 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. Nós podemos fazer isso procurar cada um E valor para a cadeia curinga. Se for encontrado, SEARCH retorna 1, caso contrário, retorna um erro. Para que possamos obter um TRUE ou FALSE valor colocando

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

para dentro F2, e arrastando-o para baixo para cobrir todo o 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 no celular 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 ) dentro do E coluna, começando no ponto da partida anterior. Isso retorna o linha número dos jogos; por exemplo, "String D" ( 11011que está na célula E5 ), é relatado como 5. Se você quiser que "String D" seja relatado como 4, esse é um ajuste fácil.

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

11000
10000
11100
00000

Claro que as células D3 e G1 pode ser escondido. 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.

Scott
fonte
Scott, é maravilhoso que você tenha passado tanto tempo nisso para ajudar um estranho aleatório. Estou sentada na minha mesa esta manhã - todos os sorrisos, porque eu não tinha certeza se encontraria resolução aqui. Eu realmente aprecio a sua ajuda.
BearOnFire
Bem, você esclareceu a pergunta quando eu lhe pedi; é justo que eu reconheça seu esforço. Fico feliz que tenha ajudado você. Apenas por curiosidade, qual parte da resposta você está usando? F ou G )
Scott
Eu estou usando a coluna f para ocultar todas as linhas que não dão um resultado de true. Acabei com strings de 154 dígitos, então isso teria sido um pesadelo de outra maneira. Bom trabalho!
BearOnFire
0

Digamos que temos dados na coluna eu de EU1 para EU100 . Para encontrar células com seu padrão de correspondência 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

irá mostrar quais linhas contêm correspondências.

Gary's Student
fonte
Então, cada pesquisa exigiria que o usuário programasse uma string personalizada? Parece mais prático se o usuário posta uma lista de posições (como 1, 70, 91), e a pesquisa é derivada disso. (Talvez essa seja a versão 2.0 nova e melhorada disponível na versão paga do aplicativo.)
fixer1234
@ fixer1234 Meu código já é compatível com seus comentários.
Gary's Student
Sim, eu estava me referindo ao front-end de "custo extra" para que a string de teste fosse construída conforme necessário em vez de codificada (freeware versus versões comerciais de sua aplicação).
fixer1234