Nuevamente, el Visual Basic 6 cuenta con una función InStrRev que hace lo mismo que Instr, pero al revés, con lo que encontrarías en espacio en blanco mucho más rápido.
No obstante, déjame hacerte una solución en una función InStrAlR que puedas utilizar sin problemas en VB5 y anteriores, así como en futuras versiones de VB.
El código es el siguiente:
****************************************************************
Option Explicit
Public Function InStrAlR(ByVal Cadena1 As String, _
ByVal Cadena2 As String, _
Optional Inicio As Variant, _
Optional Comparacion As Variant) As Long
' Tiene por objetivo llevar a cabo el mismo proceso
' que InStrRev de Visual Basic 6, pero para ejecutarse
' en versiones anteriores de VB (de VB4 en adelante).
' Var
Dim lngInicio As Long
Dim intCad2 As Integer
Dim intComparacion As Integer
Dim l As Long
' Verifique la longitud de la Cadena2
intCad2 = Len(Cadena2)
' Verifique el valor de Inicio
If IsMissing(Inicio) Then
Inicio = Len(Cadena1)
ElseIf Inicio > Len(Cadena1) Or Inicio < 1 Then
Inicio = Len(Cadena1)
End If
' Verifique el valor de la comparación.
' Nota: No acepte los valores vbUseCompareOption
' ni vbDatabaseCompare
If IsMissing(Comparacion) Then
Comparacion = 0
ElseIf Comparacion <> 0 And Comparacion <> 1 Then
Comparacion = 0
End If
' ¿Hay caracteres por buscar?
If intCad2 > 0 Then
' ¿La comparación es textual?
If Comparacion = 1 Then
Cadena1 = UCase(Cadena1)
Cadena2 = UCase(Cadena2)
End If
' Lleve a cabo la búsqueda
Do While Mid(Cadena1, lngInicio, intCad2) <> Cadena2 _
And lngInicio > 1
lngInicio = lngInicio - 1
Loop
' ¿Encontró la cadena?
If Mid(Cadena1, lngInicio, intCad2) <> Cadena2 Then
lngInicio = 0
End If
Else
lngInicio = 0
End If
InStrAlR = lngInicio
End Function
Public Function StrRev(Cadena As String) As String
' Tiene por objetivo llevar a cabo la misma funcionalidad
' de la función StrReverse de Visual Basic 6, pero para
' utilizarse en Visual Basic de versiones anteriores
' (1 y superiores).
' Var
Dim strCadena As String
Dim i As Integer
Dim intCadena As Integer
' Obtenga la longitud de la cadena
intCadena = Len(Cadena)
' ¿Hay caracteres en la cadena indicada?
If intCadena > 0 Then
' Cree una cadena de tantos espacios como caracteres
' haya en Cadena. Esto acelerará el proceso en un
' 20% aproximadamente.
strCadena = Space(intCadena)
' Lleve a cabo el proceso reversivo de caracteres
For i = intCadena To 1 Step -1
Mid(strCadena, (intCadena - i) + 1, 1) = Mid(Cadena, i, 1)
Next i
End If
StrRev = strCadena
End Function
****************************************************************************
*
Ambas funciones han sido probadas en su desempeño con una repetición de 1000 en una cadena de ochenta caracteres y se ejecutaron en menos de la mitad de un segundo en Visual Basic 4 de 16 bits (lo más lento que encontré, aunque aún puedo hacer la prueba en VisualAge For Basic.
Es decir, el código es rapidísimo y te deja muy buenos resultados.
Las funciones InstrAlR y StrRev no tienen los mismos nombres que en Visual Basic 6 para evitar incompatibilidades futuras. Lo que sí es igual (o al menos similar, en el caso de InstrAlR, dado que el parámetro Comparacion no acepta los valores vbUseCompareOption ni vbDatabaseCompare) es el conjunto de parámetros, de modo que cuando obtengas Visual Basic 6 lo único que harías sería cambiar todo lo que diga InstrAlR por InstrRev y todo lo que diga StrRev por StrReverse. Previamente, tendrás que eliminar las funciones
para evitar ambigüedades.
Ahora bien, InstrAlR la puedes usar como sigue para encontrar el último blanco:
intPosB = InstrAlR(Texto, " ")
Si quieres buscar un blanco o un carácter a partir de cierta posición, tan sólo indicas:
intPosC = InstrAlR(Texto, " ", 15)
La función es lo suficientemente inteligente para verificar si el número indicado supera la cantidad de caracteres que se encuentren en Texto o es menor a 1. En cualquiera de los dos casos, la búsqueda del (o los) caracteres indicados iniciará a partir del último de la cadena.
Ahora bien, en la búsqueda no sólo puedes buscar un carácter, sino también una serie de caracteres. Por ejemplo, en el siguiente:
intPosP = InstrAlR(Texto, "Marcelo")
Se buscará la palabra Marcelo dentro del Texto indicado. Ahora bien, si deseas buscar un texto sin importar si está en altas y bajas, puedes ponerlo así:
intPosP = InstrAlr(Texto, "Marcelo",,vbTextCompare)
(No recuerdo si la constante vbTextCompare existe en Visual Basic 5, pero si no, puedes poner un uno.)
Con esto, no importa si en Texto aparece la palabra como "MaRcElO", "MarcelO", "marcelo", "MARCELO" o como sea, la encontrará.
Ahora bien, StrRev te invertirá una cadena en un tiempo bastante asequible. No es tan eficiente como StrReverse, pero hace un buen trabajo.
Ambas funciones deberán estar en un módulo BAS. Espero que te sirvan.
+---¡Saludos desde México!--+
| .+'~~'+. |
| * Tron * David.BAS |
| `+,__,+' |
+---------------------------+
http://www.spin.com.mx/~adgarza
adgarza@spin.com.mx
>1- Existe alguna llamada al sistema, o función de VB que me permita dar
>vuelta un string (Ej. "Hola" --> "aloH") ?
No, pero es fácil de hacer :
Function DaLaVuelta(palabra As String) As String
Dim i As Long, j As Long
Dim aux As String
j = Len(palabra)
aux = Space$(j)
For i = j To 1 Step -1
Mid$(aux, j - i + 1, 1) = Mid$(palabra, i, 1)
Next i
DaLaVuelta = aux
End Function
Un saludo.
_________________________________________________
José Rubí de la Vega
E-mail : jrubi@arrakis.es
WWW : http://www.arrakis.es/~jrubi
Podrás encontrar información sobre VB, la lista
VB-ESP y un resumen de los mensajes de la misma