Resumen Dar la vuelta a un string   (2 mensajes )

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



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com