Curso B�sico de Programaci�n
en Visual Basic

Soluciones de la entrega Diecisiete.
Fecha: 16/Abr/98

 

Empezaremos viendo la parte f�cil del ejercicio, es decir la que nos muestra la posici�n cuando la funci�n espera s�lo dos par�metros, el primero ser� la cadena en la que hay que encontrar lo que haya en la segunda cadena.

Private Function RInstr1(ByVal s1 As String, ByVal s2 As String) As Long
    Dim i As Long
    Dim sTmp As String

    RInstr1 = 0
    For i = Len(s1) To 1 Step -1
        sTmp = Mid$(s1, i, Len(s2))
        If sTmp = s2 Then
            RInstr1 = i
            Exit For
        End If
    Next
End Function

Este tiene poco que explicar.
Se hace un bucle desde la �ltima posici�n de la primera cadena Len(s1) hasta el principio, ya que lo que necesitamos es encontrar la posici�n de s2 empezando a "mirar" desde el final.
A continuaci�n guardamos en sTmp un trozo de cadena que va desde la posici�n actual y que contiene tantos caracteres como tenga la segunda cadena, si te fijas, el bucle se podr�a hacer tambi�n de esta forma:
For i = Len(s1) - Len(s2) + 1 To 1 Step -1
Ya que no nos sirve comparar el �ltimo caracter con la cadena s2 cuando esta �ltima tiene m�s de un caracter, por ejemplo.
Esto es inapreciable en cadenas cortas, pero en otras m�s largas, acortar� el tiempo del bucle.

Para el segundo caso, hay que saber que los procedimientos (sub y function) permiten par�metros opcionales, estos se indican con la palabra Optional delante de los par�metros que vayan a ser opcionales.
La �nica pega es que cuando un par�metro es opcional los que le siguen tambi�n tienen que ser opcionales.
Entonces �c�mo indicar que el par�metro opcional sea el primero?
Pues... m�s o menos f�cil... aunque con truco.
Cuando un par�metro es opcional, se puede usar la funci�n IsMissing para comprobar si se ha especificado o no ese par�metro.
Esto es cierto siempre que el par�metro opcional sea de tipo Variant sin un valor por defecto. En el VB4 todos los par�metros opcinales deben ser Variant y sin valores por defecto, pero en VB5 (y posteriores) los par�metros opcionales pueden ser del tipo que queramos, adem�s de poder tener un valor por defecto, es decir, si no se especifica, se le da un valor "predeterminado".
Ahora vamos a usar s�lo los par�metros sin valores predeterminados, pero m�s adelante seguramente lo usaremos.

Sabiendo que con IsMissing podemos averiguar si se ha especificado o no el par�metro en opcional, haremos lo siguiente:
Si se especifican los tres par�metros, el primero ser� la posici�n por la que se empezar� a comprobar.
Si no se especifica el �ltimo par�metro, enga�aremos al Visual Basic, dici�ndole que los dos par�metros introducidos son la primera y la segunda cadena...
Ya ves que s�lo es echarle un poco de "cabeza" al asunto...

Vamos a ver la declaraci�n de esta funci�n:

Private Function RInstr(ByVal v1 As Variant, ByVal v2 As Variant, Optional ByVal v3 As Variant) As Long
    Dim i As Long
    Dim sTmp As String
    Dim s1 As String
    Dim s2 As String
    Dim posIni As Long

    If IsMissing(v3) Then
        'Si no se especifican los tres par�metros
        s1 = CStr(v1)       'La primera cadena
        s2 = CStr(v2)       'la segunda cadena
        posIni = Len(s1)    'el �ltimo caracter de la cadena
    Else
        posIni = CLng(v1)   'la posici�n por la que empezar
        s1 = CStr(v2)       'la primera cadena (segundo par�metro)
        s2 = CStr(v3)       'la segunda cadena (tercer par�metro)
    End If

    'Valor inicial de la b�squeda, si no se encuentra, es cero
    RInstr = 0
    'Siempre se empieza a buscar por el final
    For i = posIni - Len(s2) + 1 To 1 Step -1
        'Tomar el n�mero de caracteres que tenga la segunda cadena
        sTmp = Mid$(s1, i, Len(s2))
        'Si son iguales...
        If sTmp = s2 Then
            'esa es la posici�n
            RInstr = i
            Exit For
        End If
    Next
End Function

Ahora quedar�a hacer una funci�n que comtemple las mismas opciones que tiene el InStr normal, es decir que se pueda especificar un cuarto par�metro que nos indique si la comparaci�n se hace de una forma u otra.

�Que te parece esto como un ejercicio nuevo?
Sab�a que contestar�a de forma afirmativa... je, je...

Pues int�ntalo... y si quieres ver la soluci�n, selecciona el contenido de la caja negra esa que hay al final y ver�s...

 

A ver si ya terminamos en la pr�xima entrega el acceso aleatorio a los ficheros.

Nos vemos.
Guillermo

 


Ir al índice principal del Guille


Para ver la soluci�n, selecciona todo el contenido del siguiente cuadro y ver�s...

Nota:
He quitado lo de la selecci�n porque no siempre funciona... al menos ahora no se ve el texto al seleccionarlo...

 

'
Private Function RInstr(ByVal v1 As Variant, ByVal v2 As Variant, _
                        Optional ByVal v3 As Variant, _
                        Optional ByVal v4 As Variant) As Long
    Dim i As Long
    Dim sTmp As String
    Dim s1 As String
    Dim s2 As String
    Dim posIni As Long

    If IsMissing(v3) Then
        'Si no se especifican los tres par�metros
        s1 = CStr(v1)       'La primera cadena
        s2 = CStr(v2)       'la segunda cadena
        posIni = Len(s1)    'el �ltimo caracter de la cadena
    Else
        posIni = CLng(v1)   'la posici�n por la que empezar
        s1 = CStr(v2)       'la primera cadena (segundo par�metro)
        s2 = CStr(v3)       'la segunda cadena (tercer par�metro)
    End If

    'Valor inicial de la b�squeda, si no se encuentra, es cero
    RInstr = 0
    'Siempre se empieza a buscar por el final
    For i = posIni - Len(s2) + 1 To 1 Step -1
        'Tomar el n�mero de caracteres que tenga la segunda cadena
        sTmp = Mid$(s1, i, Len(s2))
        'Si se especifica el tipo de comparaci�n
        If Not IsMissing(v4) Then
            'Se usa StrComp con ese par�metro
            If StrComp(sTmp, s2, v4) = 0 Then
                'esa es la posici�n
                RInstr = i
                Exit For
            End If
        Else
            'Aqu� tambi�n se podr�a usar
            'If StrComp(sTmp, s2) = 0 Then
            'Si son iguales...
            If sTmp = s2 Then
                'esa es la posici�n
                RInstr = i
                Exit For
            End If
        End If
    Next
End Function

A diferencia del Visual Basic, no dar� error si se especifica el cuarto par�metro y no se especifican los dem�s, por la sencilla raz�n de que si s�lo se especifican 3, el cuarto nunca llega a tener un valor... (elemental mi querido Guille).
De lo que tendr�s que tener "precauci�n", al menos si quieres que funcione todo bien, es de indicar los valores que se esperan... ya que sino es as�, no conseguir�s tu prop�sito... o al menos no el deseado.

 


 

Ir al índice principal del Guille