Visual Basic 6

Características del lenguaje:
Funciones de manejo de cadenas y arrays

 

Iniciado: el 1/Sep/98
Actualizado: el 4/Sep/98


Las nuevas funciones del Visual Basic 6:

  1. InStrRev Devuelve la posición de una cadena dentro de otra, buscando desde el final
  2. StrReverse Invierte el contenido de una cadena
  3. WeekDayName Devuelve el nombre del día de la semana
  4. MonthName Devuelve el nombre del mes del año
  5. Join Devuelve en una cadena los elementos de un array
  6. Split Devuelve un array con el contenido de una cadena
  7. Replace Devuelve una cadena en la que se han sustituido ciertas subcadenas con otras...
  8. Filter Devuelve un array con los elementos de otro array que contenga o no la cadena indicada

1.- InStrRev (1/Sep/98)

Esta función se usa casi igual que la clásica InStr, pero sirve para buscar desde el final de la cadena.
Como sabrás InStr devuelve la posición de una cadena dentro de otra:
InStr("Hola Mundo", "Mundo") daría un valor 6, lo que quiere decir que la posición de Mundo ocupa los caracteres desde la posición 6 dentro de Hola Mundo.
En este ejemplo, InStrRev daría también 6, pero si se hace esto otro:
InStrRev("Hola Mundo", "o"), es decir saber cual es la posición de la última letra o, daría como resultado: 10;
sin embargo: InStr("Hola Mundo", "o") daría 2, es decir la posición de la primera o.

Si quieres ver código de cómo implementar esta función en VB5, pasate por las soluciones de la entrega 17 del curso básico.
El problema de esta implementación, es que es compatible en parámetros con InStr, cosa que no ocurre con la nueva función del Visual Basic 6.
Veamos los parámetros de InStr y los de InStrRev:


InStr([start, ]string1, string2[, compare])


InStrRev(string1, string2[, start[, compare]])

Si te fijas, verás que el parámetro opcional START ha cambiado de sitio, desde mi punto de vista es más lógico en la nueva función, pero como ya estamos acostumbrados...

Como cambio, ahora en todas las funciones que usan el parámetro compare, el cual es opcional y si no se especifica se usa lo que se haya indicado en Option Compare xxx; pues lo que cambia es que antes no existía un valor para indicar que se usaba ese valor por defecto, simplemente no se indicaba, y ahora si se indica -1 (vbUseCompareOption) se usa el tipo de comparación a realizar en las cadenas.
Ya sabes que por defecto es como si estuviese Option Compare Binary, es decir que se diferencian las mayúsculas de las minúsculas. Si se especifica, (siempre a nivel de módulo y en cada módulo), Option Compare Text, no se diferencian las mayúsculas de las minúsculas. Pero esas definiciones se pueden pasar por alto, indicando el parámetro compare.


2.- StrReverse (1/Sep/98)

Esta función sirve para invertir el contenido de una cadena... es decir, darle la vuelta.
Si se le pasa como parámetro "Hola", devolverá una cadena tal como esta: "aloH", es decir que casi aprende a hablar en francés... o al menos por teléfono...

Para usarla:
anedaCs= StrReverse("Hola Mundo") ' También valen variables de cadenas como argumento
En la variable se asignará: "odnuM aloH"


3.- WeekDayName (1/Sep/98)

Devuelve el nombre del día de la semana.

La forma de usarla es:
WeekdayName(weekday[, abbreviate][, firstdayofweek])
dónde:
weekday: es un valor que indica el día de la semana, el valor dependerá del parámetro FirstDayOfWeek.
abbreviate: Opcional, si se devuelve el nombre completo o abreviado
firstdayofweek: Opcional, para indicar cual es el primer día de la semana, por defecto en 1 (vbSunday), osea Domingo

En este ejemplo se usa una función que devuelve un array y acepta como párametro si se devuelven los valores abreviados o no, por defecto es NO; el valor devuelto se puede asignar directamente a un array dinámico.

Nota: Los nombres de los días de la semana, los devuelve en el idioma en que esté configurado Windows

'
Private Function NombresDias(Optional ByVal Abbreviate As Boolean = False) As String()
    'Devuelve un array con los nombres de los días de la semana
    Dim tArray() As String
    Dim i As Long
    
    'Redimensionamos el array
    ReDim tArray(1 To 7)
    
    'Bucle para cada día de la semana
    For i = 1 To 7
        'Se inicia la semana en el Lunes
        tArray(i) = WeekdayName(i, Abbreviate, vbMonday)
    Next
    
    'Devolver el array reción creado
    NombresDias = tArray()
End Function

4.- MonthName (1/Sep/98)

Devuelve el nombre del mes.

La forma de usarla es:
MonthName(month[, abbreviate])
dónde:
month: es el número del mes, Enero es 1, Febrero 2, etc.
abbreviate: Opcional, si se devuelve el nombre completo o abreviado

En este ejemplo se usa una función que devuelve un array y acepta como párametro si se devuelven los valores abreviados o no, por defecto es NO; el valor devuelto se puede asignar directamente a un array dinámico.

Nota: Los nombres de los meses, los devuelve en el idioma en que esté configurado Windows

'
Private Function NombresMeses(Optional ByVal Abbreviate As Boolean = False) As String()
    'Devuelve un array con los nombres de los meses
    Dim tArray() As String
    Dim i As Long
    
    'Dimensionar un array para los doce meses
    ReDim tArray(1 To 12)
    
    'Asignar los nombres de los meses
    For i = 1 To 12
        tArray(i) = MonthName(i, Abbreviate)
    Next
    
    'Devolver el array
    NombresMeses = tArray()
End Function

5.- Join (2/Sep/98)

Esta función devuelve en una cadena el contenido de un array, cada elemento del array se incluye en esa cadena y se separa cada elemento con el separador indicado. El separador no se añade al final de la cadena, sólo entre cada elemento.

La forma de usar esta función es:
Join(list[, delimiter])
dónde:
list: es un array con los elementos que queremos "juntar" en una cadena.
delimiter: (opcional), es el separador que queremos usar para separar cada uno de esos elementos, por defecto es un espacio. Si no queremos usar ningún delimitador, es decir para que todos los elementos estén juntos, hay que indicar una cadena vacía; si, por el contrario queremos usar cualquier otro carácter, lo indicaremos en este parámetro de la función.

Veamos un ejemplo:

'
Private Sub cmdJoin_Click()
    'Ejemplo de uso de Join, esta función devolverá en una cadena
    'cada elemento de un array separados por el delimitador que
    'se le indique.
    Dim tArray() As String
    Dim i As Long
    
    'Dimensionamos el array con cuatro elementos (de 0 a 3)
    ReDim tArray(3)
    'Asignamos valores al array
    For i = 0 To 3
        tArray(i) = "Elemento_" & i
    Next
    
    '=== Para hacer otras pruebas ===
    'Separa cada palabra con el caracter indicado
    'Text1 = Join(tArray, "/")
    
    'Todas las palabras juntas, sin usar separador
    'Text1 = Join(tArray, "")
    
    'Las palabras se separan por un espacio, (valor por defecto)
    Text1 = Join(tArray)
End Sub

Si no se indica delimitador: Text1 = Join(tArray), el contenido de Text1 será:
Elemento_0 Elemento_1 Elemento_2 Elemento_3
Cada elemento se separa con un espacio.

Si se especifica un caracter como delimitador: Text1 = Join(tArray, "/"), el contenido de Text1 será:
Elemento_0/Elemento_1/Elemento_2/Elemento_3
Fíjate que el delimitador no se añade al final.

Si se especifica una cadena vacía: Text1 = Join(tArray, ""), el contenido de Text1 será:
Elemento_0Elemento_1Elemento_2Elemento_3
Es decir todos juntos, sin separación.


6.- Split (2/Sep/98)

Esta función es la inversa de Join, es decir, toma el contenido de una cadena y forma un array con cada una de las palabras, (o serie de palabras separadas por un delimitador dado, subcadena que la llaman).

La forma de usar esta función es:
Split(expression[, delimiter[, count[, compare]]])
dónde:
expresion: es una cadena, o expresión que de como resultado una cadena, de la que queremos sacar los elementos.
delimiter: (opcional), es el separador que le indicará a la función como están separados los elementos; por defecto es un espacio. Si el delimitador es una cadena vacía, se devolverá un array con sólo un elemento conteniendo toda la cadena.
count: (opcional), el número de elementos que se devolverá en el array, si no se indica o se usa -1, se devolverá cada subcadena en un elemento del array. Si este valor es menor que el número de subcadenas, en el último elemento del array se asignará el resto de la cadena.
compare: (opcional), el tipo de comparación que se realizará para evaluar el delimitador dentro de la expresión.
Mira
la explicación de este parámetro dada en la función InStrRev

Veamos un ejemplo de cómo usarla:
(esta función puede servir, entre otras cosas, para asignar a un array los parámetros de la línea de comandos, si quieres ver lo que me hubiese ahorrado de existir antes esta función,
pulsa en este link, aunque la verdad sea dicha, una función específica siempre funcionará mejor... no es por nada...)

'
Private Sub cmdSplit_Click()
    'Devolver una cadena con una serie de palabras de un array
    Dim tArray() As String
    Dim sTmp As String
    Dim i As Long
    
    'Asignamos valores de prueba a una cadena
    sTmp = "Hola Mundo, esto es una prueba de Split en VB6"
    
    'Creamos un array, cada "substring" se asignará
    'a un elemento del array
    tArray = Split(sTmp)
    
    'Ahora sólo crearemos un array de tres elementos
    'tArray = Split(sTmp, , 3)
    
    'También se puede usar para desglosar los parámetros
    'de la línea de comandos
    'fichero.txt /B /S/I
    tArray = Split(Command$, "/")
    
    'Mostramos la información
    List2.Clear
    'Si no conocemos los índices del array,
    'usamos LBound y UBound para que nos lo indique
    For i = LBound(tArray) To UBound(tArray)
        List2.AddItem tArray(i)
    Next
End Sub

7.- Replace (3/Sep/98)

Esta función devolverá una cadena en la que se han sustituido las "palabras" (subcadenas) indicadas por otras. (Se entenderá mejor al ver los parámetros y con el ejemplo)

La forma de usar esta función es:
Replace(expression, find, replacewith[, start[, count[, compare]]])
dónde:
expression: Es la cadena original
find: las subcadenas que queremos reemplazar
replacewith: lo que se pondrá cuando se halle la cadena a reemplazar
start: (opcional), posición dentro de expression a partir de la cual empezaremos a procesar la cadena
count: (opcional), número de sustituciones que queremos realizar, el valor por defecto es -1, lo que indica que se harán todas las sustituciones posibles.
compare: (opcional),
lo dicho en las otras funciones, el tipo de comparación a realizar: binaria, de cadena o según el Option Compare xxx

Pulsa este link para ver cómo "fabricarte" una función para hacer esto mismo... (más o menos)
He publicado una nueva versión de las que ya estaban anteriormente publicadas.

Vamos a ver un ejemplo de cómo usar esta función.

'En este ejemplo se sustituirán las "r" por "g"
'aunque también se podrían sustituir palabras completas o más de una letra, etc.
Private Sub cmdReplace_Click()
    Dim sOriginal As String
    Dim sBuscar As String
    Dim sPoner As String
    
    'Perdón a los que tenéis problemas con la ERRE, pero...
    sOriginal = "El perro de San Roque no tiene rabo porque Ramón Ramirez..."
    sBuscar = "r"
    sPoner = "g"
    
    Label1(2) = Replace(sOriginal, sBuscar, sPoner, , , vbTextCompare)
End Sub

El resultado de esta prueba sería:
El peggo de San goque no tiene gabo pogque gamón gamigez...
Se sustituyen todas las "r", incluso las mayúsculas, ya que se ha especificado vbTextCompare, es decir no tener en cuenta las mayúsculas de las minúsculas.
Si se hubiese distinguido las mayúsculas de las minúsculas, cosa que ocurriría si no se hubiese indicado ese parámetro y en el módulo no se hubiese especificado Option Compare Text o bien si se hubiese indicado explícitamente vbBinaryCompare, la frasesita quedaría de esta forma:
El peggo de San Roque no tiene gabo pogque Ramón Ramigez...


8.- Filter (3/Sep/98)

Esta función devuelve un array que contiene los elementos de otro array, siempre que coincida con el criterio de búsqueda especificado. Ambos arrays deben ser del tipo String (cadena)

La forma de usar esta función es:
Filter(InputStrings, Value[, Include[, Compare]])
dónde:
InputStrings: es un array unidimensional del tipo cadena
Value: la cadena a buscar en InputStrings
Include: (opcional) Si se quiere que los elementos devueltos sean los que incluyen la cadena indicada en Value o no, el valor por defecto es True, es decir, que se devuelvan las que incluyan esa cadena a buscar.
Compare: (opcional),
el tipo de comparación a realizar.

Vamos a ver un ejemplo de cómo usar esta función.

'
Private Sub cmdFilter_Click()
    'Filtra un array con la cadena indicada y devuelve un array
    Dim tArray1() As String
    Dim tArray2() As String
    Dim i As Long
    Dim sFilter As String
    Dim bExclude As Boolean
    
    'Llenar un list con datos de ejemplo y asignarlos a un array.
    'En el form de prueba estos valores están asignados en
    'el Form_Load, pero lo pongo para que se sepa lo que hay.
    With List3(0)
        '.Clear
        '.AddItem "Guillermo" & vbTab & "Nerja"
        '.AddItem "Pepito" & vbTab & "Nerja"
        '.AddItem "Juanito" & vbTab & "Málaga"
        '.AddItem "Jordi" & vbTab & "Barcelona"
        '.AddItem "Guillermo" & vbTab & "Barcelona"
        '.AddItem "Pilar" & vbTab & "Zaragoza"
        ReDim tArray1(.ListCount - 1)
        For i = 0 To .ListCount - 1
            tArray1(i) = .List(i)
        Next
    End With
    
    'sFilter = "Guille"
    sFilter = Text5
    
    'Incluir en tArray2 los elementos de tArray1 que tengan
    'lo especificado en sFilter, sin distinguir mayúsculas de minúsculas
    'If Check1.Value = vbChecked Then
    '    tArray2 = Filter(tArray1, sFilter, True, vbTextCompare)
    'Else
    '    'En esete caso se devuelven los elementos que no lo tengan
    '    tArray2 = Filter(tArray1, sFilter, False, vbTextCompare)
    'End If
    
    'También se puede hacer así:
    tArray2 = Filter(tArray1, sFilter, Check1.Value, vbTextCompare)
    
    'Mostrar los elementos obtenidos
    With List3(1)
        .Clear
        For i = LBound(tArray2) To UBound(tArray2)
            .AddItem tArray2(i)
        Next
    End With
End Sub

En este ejemplo, usando "Guille" como cadena a buscar e indicando que se incluya esta palabra, devolvería los siguientes elementos:

Guillermo Nerja
Guillermo Barcelona

Si se indicara que devuelva los que no contengan la palabra "Guille", sería esto lo que devolvería:

Pepito Nerja
Juanito Málaga
Jordi Barcelona
Pilar Zaragoza


Características del lenguaje Visual Basic 6: Nuevas características

ir al índice