Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Fecha:
Programa de formación: Técnico en Sistemas Versión 1 Febrero 28 de 2011
Nivel: Técnico Versión 1.0
Sistema de Gestión
de la Calidad GUIA DE ACTIVIDADES DE PROGRAMACIÓN ORIENTADA A EVENTOS Página 1 de 20
CONCEPTUALIZACIÓN
Funciones de cadena
Se denomina CADENA a una sucesión de caracteres. Una cadena puede tener uno o varios
caracteres alfanuméricos. Una cadena es también una sucesión de números.
Ejemplo de cadenas:
Hagamos una distinción entre una cadena que contenga números y un número. Un número
tiene un valor, pero también tiene una presentación escrita. El valor es algo que estará en el
computador como una sucesión de bits. Dependiendo de como lo hayamos declarado, tendrá
mas o menos bits. Pero esa información no es un número legible por el usuario. Lo que sí es
legible por el usuario es la representación en numeración decimal (u octal, o hexadecimal, o
incluso en binario) de ese número. Esa representación del número en un determinado sistema
de numeración es una cadena.
9 En numeración decimal
9 En numeración hexadecimal
11 En numeración octal
1001 En numeración binaria
Esas formas de presentarnos el número son CADENAS de caracteres. El valor del número
dentro del computador es un NUMERO.
Cuando introducimos un valor numérico por teclado o pantalla, el computador para hacer
operaciones con él, debe transformarlo a un número.
Estas consideraciones nos llevan a las dos primeras funciones con cadenas:
Ejemplos
Este ejemplo pondría en la etiqueta Label1 los caracteres correspondientes al valor que
tuviese la variable Variablenumerica .
Nota para recordar: Siempre habrá que convertir un número a una cadena cuando queramos
presentarlo en la pantalla. Siempre habrá que convertir a número la cadena de caracteres
numéricos que hayamos introducido por teclado o por pantalla, cuando queramos operar con
ese número. Un Label, cuando tiene que presentar un único número, no le pedirá que se lo
convierta a cadena, pues VB hace automáticamente esa conversión. Sin embargo, cuando
tiene que presentar un número, y además un texto en el mismo Label, VB no realizará
automáticamente ese cambio, por lo que le dará un error. Le recomiendo que convierta los
números a variables de cadena siempre que los quiera presentar en un Label o TextBox.
Cuando tenga mas experiencia en VB verá que esta observación estará un poco de más. Pero
de momento, convierta cada dato según lo vaya a necesitar.
Existe una función mas amplia que Str. Se trata de Cstr. Esta función no solamente
transforma un número a una cadena, como hace Str, sino que convierte cualquier tipo de
variable a una variable tipo String (cadena).
Si se aplica Cstr a una variable tipo Fecha/Hora devuelve la fecha / Hora en formato corto.
Left (cadena, n)
Extrae los n primeros caracteres de una cadena, comenzando por la izquierda.
LCase (cadena) Devuelve otra cadena igual, pero con todos los
caracteres en minúsculas. (LCase = Lower Case)
UCase (cadena) Devuelve otra cadena igual, pero con todos los
caracteres en mayúsculas. (UCase = Upper Case)
LTrim Elimina los posibles espacios que tenga una cadena por
Su izquierda.
Rtrim Elimina los posibles espacios que tenga una cadena por
Su derecha.
Trim Elimina los espacios que tenga una cadena, tanto por su
izquierda como por su derecha. (No elimina los espacios
centrales de la cadena)
Estas tres funciones se emplean para quitar los posibles espacios que pueden resultar
de una entrada de datos. Tienen especial importancia cuando se toman los datos de un
archivo o base de datos, donde fueron introducidos por otro programa.
La función Trim hay que usarla cada vez que convertimos un número a cadena de caracteres.
Cuando usamos Str(Número), la función Str introduce un espacio al comienzo de la cadena
que, en la mayor parte de los casos, produce un error cuando lo vamos a comparar, a
introducir en una base de datos, etc.
No se pone ningún ejemplo de estas funciones, pues sería difícil verlo impreso.
Mid puede usarse también para cambiar el contenido de una cadena. Observe la sutileza entre
Mid como Función de cadena y Mid como Instrucción.
Si la cadena que vamos a introducir tuviera más caracteres, tomará solamente los primeros
Función Asc
Nota Hay otra función (AscB) que puede usarse con bytes contenidos en una cadena. En
lugar de devolver el código del carácter para el primer carácter, AscB devuelve el primer byte.
Función Chr
Otros caracteres importantes son, el Backspace (carácter 8), y el espacio (carácter 32)
Nota Se proporciona otra función (ChrB) para su uso con datos de byte incluidos en una
cadena. En lugar de devolver un carácter, que puede ser de uno o de dos bytes, ChrB siempre
devuelve un solo byte.
Visual Basic puede operar con números tal como lo haría cualquier persona. Conoce las 4
reglas, y puede utilizar paréntesis de la misma forma que los escribimos sobre el papel.
+ Suma
- Resta
* Multiplicación
/ División
\ División sin decimales
Mod Resto de una división
^ Eleva a un exponente
Ejemplos
Existen otras operaciones que se pueden realizar con números: comparaciones. Los
operadores que realizan comparaciones se denominan Operadores relacionales. El
resultado de las operaciones realizadas con estos operadores solamente admiten dos
resultados: True (Cierto) o False (Falso) Estos operadores son:
= Igual que
<> No igual que
< Menor que
<= Menor o igual que
> Mayor que
>= Igual o mayor que
Operadores Lógicos
Estos operadores podemos usarlos con variables Booleanas, es decir, aquellas que solamente
pueden tomar los valores cero y uno, y con caracteres (un carácter = 1 Byte = 8 bits)
realizando la operación correspondiente bit a bit con los 8 bits de cada carácter. Pero en este
caso, los parámetros deben introducirse en decimal. Por ejemplo, si quiere realizar la función
And entre el carácter 15 (00001111) y el 131 (10000011) , debe ponerlo de la forma
Resultado = 15 And 132. El resultado de esta operación será el byte 00000011, pero como Ud.
ya se habrá dado cuenta, le devolverá el valor 3. En el ejercicio Cap11 puede ver un ejemplo
muy explicativo
Int y Fix eliminan la fracción de un número y devuelven el valor entero resultante. La diferencia
entre Int y Fix es que si el número es negativo, Int devuelve el primer entero negativo menor o
igual a número, mientras que Fix devuelve el primer entero negativo mayor o igual a número.
Por ejemplo, Int convierte -8,4 en -9, y Fix convierte -8,4 en -8.
Si número no es un número entero, se redondea al número entero más cercano antes de ser
evaluado.
Mediante esta función se puede convertir un número de hasta ocho caracteres hexadecimales.
Si número no es entero, se redondea al número entero más cercano antes de ser evaluado.
Recuerde que estas dos funciones devuelven una Cadena de caracteres, no un número.
El resultado deberá tratarlo como una cadena de caracteres.
CLng se diferencia de las funciones Fix e Int en que trunca, en vez de redondear, la parte
fraccionaria de un número. Cuando la parte fraccionaria es exactamente 0,5, la función CLng
siempre la redondea al número par más cercano. Por ejemplo, 0,5 se redondea a 0 y 1,5 a 2.
CInt se diferencia de las funciones Fix y Int en que trunca, en vez de redondear, la parte
fraccionaria de un número. Cuando la parte fraccionaria es exactamente 0,5, la función CInt
siempre la redondea al número par más cercano. Por ejemplo, 0,5 se redondea a 0 y 1,5 a 2.
Debe usar las función CByte, CCur, CLng, CInt en lugar de Val para proporcionar
conversiones que reconozcan las variantes internacionales, cuando se convierte de cualquier
otro tipo de datos. Por ejemplo, los diferentes separadores decimales se reconocen
adecuadamente, dependiendo de la configuración de la información local de su PC.
Si la expresión a convertir queda fuera del intervalo aceptable para el tipo de datos a obtener,
ocurrirá un error.
Debe usar la función CStr en lugar de Str para proporcionar conversiones que reconozcan las
variantes internacionales, cuando se convierte de cualquier otro tipo de datos a String. Por
ejemplo, los diferentes separadores decimales se reconocen adecuadamente, dependiendo de
la configuración de la información local de su sistema.
Función Cdate Convierte una expresión al tipo de datos Date. (Fecha / Hora)
En algunas ocasiones (no siempre, misterios del VB) cuando hacemos una operación entre
números, cuyas variables que los contienen se han declarado de distinto tipo, puede ocurrir
que dé un error. Por ejemplo, queremos obtener una suma que debe ser un Long, a partir de
varios números tipo Byte. Declaramos las variables de la siguiente forma:
Suma = I1 + I2 + I3 + I4 + i5
El resultado de esta operación es que da un error, pues no entiende que sumando varios Byte
(números comprendidos entre 0 y 255) puedan dar un número de otro tipo. Dará seguramente
el error 6, Overflow. Para que esto no suceda, haremos el truco de convertir el primero de los
números que forman parte en la operación matemática a un Long, y de esta forma, VB ya se
da cuenta que el resultado de esa operación es un Long:
Suma = CLng(I1) + I2 + I3 + I4 + I5
Tenga en cuenta esa observación inicial que NO ocurre en todas las ocasiones. (Y me parece
que era un fallo de los muchos que tenía VB5)
Otras Funciones
Una función curiosa
NOTA MUY IMPORTANTE para versiones de VB anteriores a la 6.- Los números aleatorios
generados de esta forma son siempre iguales, eso sí, dependiendo del número que se le
introduzca como parámetro. Esta generación de números no produce números aleatorios pues
como se dijo, dependen del numero que se meta como parámetro, y si este se repite, se repite
la sucesión de números que nos crea el generador aleatorio. (Afortunadamente lo han
corregido en la versión 6)
Randomize Timer
La función Randomize devuelve una variable Rnd con un número comprendido entre
0 y 1 (Nunca será 0 ni 1) Leyendo el valor de la variable sucesivas veces, se puede obtener
una sucesión de números aleatorios. No es necesario ejecutar la instrucción Randomize
Timer cada vez que se quiera obtener un dato de la variable Rnd.
Randomize Timer
A = Rnd * 100
A = CInt(A)
Do While A > 49
A = A - 49
Loop
Do While A < 1
A = A + 49
Loop
Label1.caption = A
End Sub
Realice este pequeño programa, con la instrucción Randomize Timer y sin ella.
Date Devuelve la fecha de hoy. Esta fecha la toma del reloj del computador.
Mediante estas instrucciones podemos obtener el dato necesario de una fecha u hora. Por
ejemplo, para obtener el día de hoy solamente:
La función DatePart merece estudio aparte. Con esta función podemos averiguar el mes,
trimestre, semana, día del año, etc.
Por ejemplo, y tomando como referencia para todos los ejemplos el día 22 de Septiembre de
1998, fecha en la que se ha escrito este texto, (Now = 22/09/1998), tenemos :
Cuidado con como se escriben las fechas. Una posibilidad es la usada en los ejemplos, pero
solamente vale para el día de hoy. Puede expresar la fecha metiéndola entre dos signos #,
pero en ese caso debe estar expresada en el formato mm/dd/yy (mes/día/año). Ejemplo :
Pero lo mas fácil para el formato de fecha usado en España es meter la fecha entre comillas
dobles, y usar el formato especificado para el país :
Con las comillas dobles puede incluso no poner el año. En este caso le pone por defecto, el
año en curso.
Estas tres formas de expresar la fecha funcionan perfectamente, al igual que cuando lo
hacíamos con Now, y el resultado sigue siendo 39.
(No se extrañe que esta explicación la encuentre solamente en esta Guía del Estudiante)
Visual Basic trata las fechas como números. Y precisamente como un número Double.
Emplea por lo tanto 8 bytes para representar una fecha. Por ejemplo, al día 12 de Julio de
1999, (Fecha en la que el autor de este libro alcanzó la respetable edad de #9 años) le
corresponde el valor de 36563. Ese es el número de días transcurridos desde el origen de
tiempos tomado por VB (Y por muchas otras aplicaciones de Microsoft y de otras marcas)
hasta ese fatídico día. ¿ Cual es ese origen del tiempo? El 30 diciembre 1899. ¿Que porqué
ese día?. No lo sé. Pero es fácil intuir que motivos prácticos para que cualquier fecha del siglo
XX tuviese un número positivo. Porque las anteriores a ese día las trata como números
Una hora también es una variable tipo Date. Y una composición Día / Hora también. ¿Que
como trata los minutos dentro de una variable Date? Pues como decimales de ese número
Double. Por ejemplo, la hora 12:00:00 del día 12 de julio de 1999 es para VB
36.563,5
Es decir, la parte decimal representa la fracción de día transcurrido desde el comienzo del día
(medianoche) hasta la hora en cuestión. No debemos confundir esta fracción del día (0,5 para
las 12:00:00) con el valor de la función Timer para ese instante (45.000)) que representa el
número de segundos transcurridos desde la 12 de la noche de ese día.
Cuando se tratan variables tipo Date, VB que es un lenguaje inteligente, interpreta como tipo
de datos Date determinados datos que no lo son. Por ejemplo, 12 Julio 1999 es tal y como
puede verse, una sucesión de caracteres. Si ejecutamos el código:
Al estar Pepe declarada como variable tipo Date, VB busca todas las posibilidades de extraer
una fecha (o una hora) del dato que le estamos metiendo. Otra cosa ocurriría si la
declarásemos como String o Variant. En cualquiera de estos casos, Pepe contendría el literal
introducido, es decir, “12 Julio 1999”
De lo anterior se desprende una cosa, dado que la fecha la guarda como un número, no
importa en que formato le introduzcamos una fecha. Si ponemos que Fecha1 = “12/7/99” es
idéntico a poner fecha1 = 12/07/1999 ó Fecha1 = 1999-07-12. Eso sí, debe reconocer el
formato, y luego, el dato, lo tratará como un número Double. Lo volveremos a ver cuando
estudiemos las bases de datos. Access trata las fechas de idéntica forma.
Función FORMAT
Esta función permite presentar cadenas numéricas o fechas de una determinada forma.
Permite establecer el Formato de esa cadena.
Si recurre a la ayuda de VB acerca de esta función se va a enterar muy poco de lo que puede
dar de sí. La sintaxis que presenta es :
Lo mejor que puede hacer con esta definición de la sintaxis de Format es olvidarla. No le
aclara mucho lo que se puede hacer con Format. La función Format se usa para poner una
fecha en un determinado formato. Con la expresión :
la variable FechadeHoy tendrá el valor 1998-05-21, que se refiere al día 21 de mayo de 1998,
según el formato recomendado por la norma ISO-8601 para la presentación de fechas. Si
Las posibilidades de Format llegan también al campo de las cadenas numéricas. Por ejemplo
la cifra 123456 se transformará en las siguientes expresiones, según como empleemos la
función Format
No se complique la vida con el tema del primer día de la semana ni la primera semana del
año. No lo usará con frecuencia. Centrémonos mas en el parámetro Formato. Puede tomar
muchos valores. Veamos los principales. Primero para números
Observe que usamos la expresión Variable = Format (1234567,”Formato”) para todos los
ejemplos de números.
(Cada carácter # indica que ahí va un número. El separador debe ser una coma, no un punto,
aunque esto depende del idioma que esté usando)
Puede poner una de estas expresiones, eso si, siempre entre comillas dobles :
Para fechas (Observe que usamos el ejemplo Format(Now, “Formato”) siendo Now la fecha
y hora actual (21/07/98 a las 22:16:00 )
Format dispone de mas opciones. Sería muy largo explicarlas aquí. Para mas información, en
la WEB de Microsoft (www.microsoft.com) puede encontrar mas formatos posibles.
Cuando realizamos el Format sobre una fecha, esta fecha puede ser un literal (un string), o
una variable tipo fecha
Si en Text1 tenemos la expresión 12 Julio 1999, y queremos convertir esa fecha al formato
ISO 8601, podemos hacerlo de cualquiera de estas dos formas:
La función Format es suficientemente inteligente para darse cuenta que con el formato yyyy-
mm-dd le estamos pidiendo una fecha. Si le metemos una fecha no hay problema (caso de
meterle Pepe, variable declarada como Date). Pero si le metemos una cadena de caracteres
(caso de Text1.Text) intenta obtener de esa cadena una fecha válida. Si lo consigue lo
presenta. Si no lo consigue, dará un error.
Cuando utilizamos varias variables que tienen un significado similar para nosotros, pero que
son distintas (Por ejemplo, el nombre de los alumnos de una clase) podemos utilizar una
matriz. Esta matriz está formada por tantos elementos como alumnos tenga la clase. El
nombre asociado a cada uno de los elementos de la matriz puede ser:
Las matrices normalmente comienzan a numerar por el número 0. Este comienzo puede no ser
el mas apropiado para la variable que estamos planteando, pues ningún alumno tiene el
número de orden 0. Para hacer que una matriz comience a numerar por el 1 se debe definir
mediante la instrucción:
Option Base 1
que debe colocarse al comienzo del módulo o formulario donde declaremos la matriz.
Para declarar la matriz se hace como con todas las variables, especificando entre paréntesis el
número de elementos que componen la matriz:
Hemos declarado que la variable alumno es una cadena, y que hay 25 elementos en esa
matriz.
Donde le decimos que la variable Alumno tiene 25 elementos, que el primero tiene el índice 1
y el último tiene el índice 25.
Pero imaginemos que queremos meter en la misma matriz el nombre, primer apellido y
segundo apellido del alumno. Necesitaremos declarar una matriz de 25 por 3. Como todos los
elementos serán cadenas de caracteres, podemos declararla de la siguiente forma:
De esta forma, el primer apellido del alumno que ocupa el puesto número 15 de la clase, será
el elemento:
Alumno (15, 2)
Dim Variable ( 1 To N, 1 To M, 1 To P, 1 To Q, 1 To R)
Una variable ya declarada como una matriz puede redimensionarse a lo largo del programa
mediante la instrucción ReDim
ReDim (25)
le estamos diciendo que tiene 25 elementos, pero que el primero sea el 0 ó el 1 depende de
haber puesto OPTION BASE 0 u OPTION BASE 1.
Una matriz puede redimensionarse cuantas veces se quiera a lo largo de la aplicación, pero
esa redimensión no puede afectar al número de dimensiones de la matriz. Si redimensionamos
la matriz perderá la información existente. Para evitar perder la información presente en la
matriz, debe utilizar la sentencia ReDim Preserve.
Dim MiMatriz()
Observe que no solamente la hemos cambiado dos veces de dimensiones (la primera a 2 y la
segunda a 3), sino que también hemos cambiado el número de elementos en cada dimensión.
Si hubiésemos utilizado ReDim Preserve solamente podríamos haber usado la primera de las
dos líneas anteriores :
pero ya no podríamos volver a cambiar el número de dimensiones con la segunda línea. Nos
daría un error.
Con ReDim podemos cambiar el número de elementos de cada dimensión cuantas veces
queramos. Por ejemplo, podemos redimensionar MiMatriz de las siguiente forma :
ReDim MiMatriz (1 To 5, 1 To 9)
ReDim MiMatriz (1 To 15, 1 To 20)
ReDim MiMatriz (1 To 25, 1 To 30)
...........................
Si hubiésemos empleado ReDim Preserve, podríamos cambiar los elementos de todas las
ReDim Preserve (1 To 5, 1 To 9)
Esto no causa ningún error en una matriz de una dimensión, ya que si la matriz tiene sólo una
dimensión, puede cambiar el tamaño de esa dimensión porque es la única y la última.
Para conocer el índice máximo y mínimo de una matriz se usan las funciones UBound y
LBound.
UBound devuelve el mayor subíndice disponible para la dimensión indicada de una matriz.
LBound devuelve el mayor subíndice disponible para la dimensión indicada de una matriz.
En otro momento queremos tener el control de los índices de esa matriz, y queremos averiguar
el índice menor y mayor de cada una de sus dimensiones :
(IID1= Indice Inferior Dimensión 1, ISD 1 = Indice Superior Dimensión 1, etc. )
Función Split
Una vez visto lo que es una matriz, vamos a ver una función interesante para el tratamiento de
cadenas de caracteres. La función Split
Descripción
Donde:
Ejemplo.
En el siguiente ejemplo veremos como separar distintos datos que están dentro de un TextBox
(Text1) separados entre ellos por una coma.