Encontrar una cadena en una lista de cadenas con 3 opciones

Iniciado por Fran1946, 21 Marzo 2020, 18:33 PM

0 Miembros y 1 Visitante están viendo este tema.

Fran1946

Hola a todos:

Ya se que pensareis que es una pregunta muy documentada pero...
Tengo un montón de ejemplos de código para, en teoría, hacer esto, pero ninguno funciona.

Explico lo que se necesita.

Tengo por ejemplo, estos nombres de archivos en un ListBox:
Sonia
SoniA - Co(2)
sOnIa - copia
sonia
Dario_Sonia_1
PepeSoNia_2(a)
OscarMariSoniA
Imagen_1
JorjePepe_2

Y el nombre a buscar en el ListBox es "Sonia"

Y hay 3 posibilidades de coincidencias, dependiendo de el estado de 2 CheckBox

1 - nombre exacto en nº de caracteres y case sensitive en cada una de las letras
solo devolvería"Sonia"

2 - nombre que contiene mismo nº de caracteres y case sensitive en cada una de las letras
devolvería "Sonia"
devolvería "Dario_Sonia_1"

3 - nombre que contiene mismo nº de caracteres y No case sensitive en cada una de las letras
devolvería "Sonia"
devolvería "SoniA - Co(2)"
devolvería "sOnIa - copia"
devolvería "sonia"
devolvería "Dario_Sonia_1"
devolvería "PepeSoNia_2(a)"
devolvería "OscarMariSoniA"

Yo he escrito un código que funciona al 100%, pero lo publico aquí por si alguien me sugiere si hay una forma mas fácil, o más "profesional" de hacerlo.
Y no comprendo como no he sido capaz de encontrar un código que haga esto en ningún sitio, supongo que no seré el único que necesita este tipo de código.

Esto es lo que tengo:


Código (vb) [Seleccionar]


Private sub Buscar(s1 as string,busca as string)
        If Form1.CheckExacto.Value = 1 Then  'Exacto
            If s1 = busca Then
                'lo ha conseguido
                Exit Sub
            Else
                Exit Sub
            End If
        End If
        If Form1.CheckCase.Value = 0 Then   'No Case sensitive
                Test = Igual(s1, busca, False)
                If Test Then
                    'lo ha conseguido
                Else:
                    Exit Sub
                End If
                Exit Sub
        Else    'Case sensitive
                Test = Igual(s1, busca, True)
                If Test Then
                    'lo ha conseguido
                Else:
                    Exit Sub
                End If
                Exit Sub
        End If

Public Function Igual(st As String, buscar As String, Sen As Boolean) As Boolean
    Dim i As Integer, s As String, L As Integer, s1 As String, c As Byte, letra As Byte
    s = Trim(st)
    L = Len(buscar)
    letra = Asc(Left(buscar, 1))
    Igual = False
    For i = 1 To Len(s)
        c = Asc(Mid(s, i, 1))
        s1 = Mid(s, i, L)
        If Compara(s1, buscar, Sen) Then
            Igual = True
            Exit For
        End If
    Next
End Function

Public Function Compara(dato As String, Busca As String, Sen As Boolean) As Boolean
    Dim i As Integer, c As Byte, n As Integer, b As Byte
    n = 0
    For i = 1 To Len(Busca)
        c = Asc(Mid(dato, i, 1))
        b = Asc(Mid(Busca, i, 1))
        If Sen Then
            If c = b Then
                n = n + 1
            End If
        Else
            If (c Or &H20) = b Or c = b Or (c Xor &H20) = b Then
                n = n + 1
            End If
        End If
    Next
    If n = Len(Busca) Then
        Compara = True
    End If
End Function



Un saludo.