Capitulo 1 Visual Basic
Capitulo 1 Visual Basic
1
INTRODUCCION Antecedentes históricos.
El lenguaje de programación BASIC (Beginner's All purpose Symbolic Instruction Code ) nació
en el año 1964 como una herramienta destinado a principiantes, buscando una forma sencilla
de realizar programas, empleando un lenguaje casi igual al usado en la vida ordinaria ( en
inglés), y con instrucciones muy sencillas y escasas. Teniendo en cuenta el año de su
nacimiento, este lenguaje cubría casi todas las necesidades para la ejecución de programas.
Téngase en cuenta que las máquinas existentes en aquella época estaban estrenando los
transistores como elementos de conmutación, los ciclos de trabajo llegaban a la impensable
cifra de 10.000 por segundo y la memoria no pasaba de unos pocos k´s en toroides de ferrita.
Los autores fueron los científicos John G. Kemeny (Budapest, 1926 – USA 1992) y Thomas E.
Kurtz (Illinois 1928) Su trabajo original se llamó True BASIC.
La evolución del BASIC por los años 70 fue escasa, dado el auge que tomaron en aquella
época lenguajes de alto nivel como el FORTRAN y el COBOL. En 1978 se definió una norma
para unificar los Basics existentes creándose la normativa BASIC STANDARD
Con la popularización del PC, salieron varias versiones del BASIC que funcionaban en este
tipo de ordenadores (Versiones BASICA, GW-BASIC), pero todas estas versiones del BASIC
no hicieron otra cosa que terminar de rematar este lenguaje. Los programadores profesionales
no llegaron a utilizarlo, habida cuenta de las desventajas de este lenguaje respecto a otras
herramientas (PASCAL, C, CLIPPER). El BASIC con estas versiones para PC llegó incluso a
perder crédito entre los profesionales de la informática.
Tal fue ese abandono por parte de los usuarios, que la aparición del Quick-BASIC de Microsoft,
una versión ya potente del BASIC, que corregía casi todos los defectos de las versiones pasó
prácticamente inadvertida, a no ser porque las últimas versiones del sistema operativo MS-
DOS incluían una versión de Quick-BASIC algo recortada (Q-Basic) como un producto mas
dentro de la amplia gama de ficheros ejecutables que acompañan al sistema operativo, y
aprovecha de él el editor de textos (Cada vez que se llama al EDIT estamos corriendo el editor
del Q-Basic).
Esta versión del popular BASIC ya es un lenguaje estructurado, lo que permite crear
programas modularmente, mediante subrutinas y módulos, capaz de crear programas ya
competitivos con otros lenguajes de alto nivel. Sin embargo llegaba tarde, pues los entornos
MS-DOS estaban ya superados por el entorno gráfico Windows.
Sin embargo algo había en el BASIC que tentaba a superarse: su gran sencillez de manejo. Si
a esto se le añade el entorno gráfico Windows, el aprovechamiento al máximo de las
Actualmente (2001) se está comercializando la versión 6.0 de este producto. Desde su salida
al mercado, cada versión supera y mejora la anterior. Dados los buenos resultados a nivel
profesional de este producto, y el apoyo prestado por el fabricante para la formación de
programadores, Visual-Basic se ha convertido en la primera herramienta de desarrollo de
aplicaciones en entorno Windows.
Es obligado decir sin embargo, que sigue siendo BASIC. No se pueden comparar sus
prestaciones con otros lenguajes cuando deseamos llegar al fondo de la máquina y controlar
uno a uno sus registros. No es ese el fin perseguido con VB y si es necesario llegar a esas
precisiones será necesario utilizar otro lenguaje que permita bajar el nivel de programación.
(Visual-C). o realizar librerías (DLLs) que lo hagan. En la mayor parte de las aplicaciones, las
herramientas aportadas por VB son mas que suficiente para lograr un programa fácil de
realizar y de altas prestaciones.
Es por tanto un termino medio entre la programación tradicional, formada por una sucesión
lineal de código estructurado, y la programación orientada a objetos. Combina ambas
tendencias. Ya que no podemos decir que VB pertenezca por completo a uno de esos dos tipos
de programación, debemos inventar una palabra que la defina : PROGRAMACION VISUAL.
Análisis . Es el studio de las necesidades que han dado origen a la creación de ese
programa. Es lo que se se llama Análisis de la aplicación. Es la primera fase que debe
tener siempre un programa y es tambien la más olvidada entre los programadores
noveles. Una aplicación no se inicia con el teclado, sino sobre un papel.
- Generación del código asociado a los eventos que ocurran a estos controles. A
la respuesta a estos eventos (click, doble click, una tecla pulsada, etc.) le llamamos
Procedimiento, y deberá generarse de acuerdo a las necesidades del programa.
- Generación del código del programa. Un programa puede hacerse solamente con
la programación de los distintos procedimientos que acompañan a cada objeto. Sin
embargo, VB ofrece la posibilidad de establecer un código de programa separado de
Nombre
Apellido1
Apellido2
Dirección
Teléfono
Salario
La variable Nombre tomará valores distintos según vayamos introduciendo los datos de los
distintos alumnos. Es posible, que a lo largo de la ejecución del programa, esta variable
Nombre valga:
José
Pedro
María
Luis
Espero que su intuición o conocimiento anterior le lleve a conocer el concepto de variable. Mas
adelante lo verá mas claro.
Decíamos que Basic no exige la definición previa de las variables. Otras herramientas exigen
que se haga así. Por lo tanto es normal encontrar, en otros sistemas de programación, que un
programa comienza de la siguiente forma:
Mediante estas declaraciones, el programa sabe de que tipo de dato se trata y por tanto cómo
debe trabajar con él. En otros sistemas de programación distintos de Basic, es necesario
realizar esta declaración antes de introducir una variable.
Basic permite que no se declaren. Cuando a lo largo del programa le introducimos una variable
nueva, asume que es una variable y que el tipo es el adecuado para el valor que le estamos
introduciendo en ese momento.
Salario=50000000
Nombre ="Pedro"
Teléfono = "1234567"
entiende que Salario, Nombre y Teléfono son variables, que Salario es un número (No hemos
metido su valor entre comillas), y que Nombre y Teléfono son sucesiones de caracteres
alfanuméricos (su valor está entre comillas)
Print Salario
Print Nombre
Print Telwfono
Habrá observado en tercer lugar la palabra Telwfono, que por error ha introducido el
programador. Basic interpreta que Telwfono es una variable e irá a leer en memoria el valor
que tiene. No tendrá ningún valor. Por lo tanto no escribirá nada y encima no dará ningún
aviso de que se ha cometido un error. Nada es gratis en esta vida, y la facilidad para introducir
variables se paga con la posibilidad de un error.
Basic ha pensado en ese problema, y se puede solucionar con esta que será la primera
instrucción BASIC que vamos a estudiar:
OPTION EXPLICIT
Las variables pueden ser de los siguientes tipos: (El número indicado en segundo lugar indica
el número de Bytes que ocupa en memoria.)
(*) Una variable tipo String ocupa el mismo número de bytes que caracteres tenga la cadena.
(**) Una variable tipo Variant ocupa 16 bytes si se trata de un número y 22 bytes + longitud de
la cadena si se trata de un dato tipo cadena de caracteres.
Existen también variables definidas por el usuario (Ya verá la sentencia Type). En este tipo de
variables se pueden introducir muchos datos de distinto tipo. Los bytes necesarios para
almacenar esa variable dependerá de los datos que se hayan definido.
Dentro de las variables Objet (variables que se refieren a objetos) existe una gran variedad
que a estas alturas del curso no debemos complicarnos con ellas. Pero para adelantar algo,
veremos que una variable puede ser del tipo Form - Formulario - , tipo Recordset, etc. etc.
Cada tipo de variable ocupa unos determinados bytes. Si no se define una variable, VB toma
como tipo por defecto para la variable el tipo Variant, tal como citábamos anteriormente. Este
tipo ocupa mas bytes que, por ejemplo, un integer. Si el tipo de dato que vamos a introducir en
una variable es un integer, y no la hemos declarado como tal, VB asumirá para esa variable
que es del tipo Variant, lo que le llevará a gastar mas bytes de memoria (16) que los que
necesitaría (2) si la hubiésemos declarado previamente. Si esa variable va a estar en el rango
de 0 a 255, y no declaramos previamente que la variable va a ser del tipo Byte, o la
declaramos como integer, p. e., estamos desperdiciando memoria RAM y posiblemente,
retardando la ejecución del programa. Lo mismo podemos decir del resto de las variables, y lo
importante que es declararlas y declararlas bien.
NOTA. Observe en la lista anterior que un dato Booleano ocupa 2 Bytes, mientras que un dato
tipo Byte ocupa un byte. En muchas ocasiones declaramos variables tipo Boolean con la
intención de que ocupen menos espacio. Paradoja del VB. Si la declaramos como Byte
ocupamos menos espacio en memoria. Declarar una variable como Boolean tiene también sus
ventajas (escribirá menos código por lo general cuando necesite leer o escribir una variable
tipo Boolean), pero tenga presente esta observación respecto al tamaño de los datos Boolean.
Puede declarar el tipo de la variable mediante un carácter después del nombre de la variable.
Esta técnica, obligatoria en Quick-Basic, está en desuso en VB. No es recomendable definir el
tipo de esta forma, pues existe un serio peligro de error. De cualquier forma, eso es potestativo
del programador y de sus costumbres.
En Visual Basic, cuando declaramos una variable como String (Cadena de caracteres), no es
necesario declarar su longitud. VB aceptará cualquier número de caracteres. Si desea evitar
que se puedan introducir más de un determinado número de caracteres, debe declarar su
número. Por ejemplo :
En este segundo caso, si se introduce como Var2 una cadena de caracteres con mas de 15
caracteres, Var2 tomará solamente los 15 primeros. Visual basic no presenta ningún aviso de
que esa variable ha omitido los caracteres que han sobrepasado la cifra de 15. Si desea que el
usuario conozca esa circunstancia, debe introducir el código oportuno para producir el aviso.
La declaración de variables tipo String con número de caracteres predefinido presenta también
inconvenientes a la hora de tratar esa cadena de caracteres con sentencias tales como Mid,
Left y Right, o a la hora de añadir una cadena a otra. La experiencia nos indica que NO
merece la pena declarar variables tipo String con el número de caracteres prefijado,
excepto que sea necesario justamente para definir la longitud de la cadena.
En una gran parte de los casos una variable que se compone de números debe declararse
como una variable de cadena de caracteres (String), y no como numérica. Cuando pensamos
por ejemplo en un número de DNI, compuesto por 7 u 8 cifras, un código postal, el número de
una calle, el piso de un edificio, parecen invitar a que la variable que los contenga sea una
variable de tipo numérico (Byte, Integer, Long, ...). Estas variables, aunque su contenido sean
números, siempre se deben declarar como String, ya que se tratan en realidad de cadenas de
caracteres, aunque estos no sean letras sino números. Para aclarar mas estas ideas, piense en
el número del DNI con la letra del NIF incluido, o que el lugar del DNI se deba rellenar con el
número del permiso de residencia, (lleva letras). Piense en el código postal de una provincia
que comienza por 0 ( 08XXX = Barcelona ) . Si la variable que va a contener ese código postal
se declara como numérica, el cero de la izquierda lo desprecia, por lo que ese código postal
quedaría reducido al 8XXX, número de 4 cifras que el cartero nunca reconocería como un
código postal, que necesariamente ha de tener 5 cifras. Para terminar, piense la forma de
introducir en una variable numérica el número 32Bis de una calle o el piso S2 de un edificio. O
piense en una variable que va a contener un código de un producto. Ese código siempre va a
ser un número, por ejemplo de 9 cifras. ¿Ha pensado como trataría el ordenador una variable
numérica que contiene el código 000100123 ?. El resultado sería que convertiría ese código en
la cifra 100123, y Vd. deberá buscarse la vida para añadir los ceros iniciales a la hora de
sacarlo a una impresora, por ejemplo.
En todos los casos anteriores, el número no representa una cantidad numérica, sino un
nombre. Lo que ocurre es que ese nombre contiene solamente números.
¿Qué variables debemos declarar entonces como numéricas ? La respuesta es bien sencilla :
Aquellas que van a contener datos con lo que vamos a realizar operaciones
matemáticas.
Las variables booleanas (True/False) pueden en muchos casos sustituirse por una variable del
tipo Byte. Si ese datos True / False se va a introducir en una base de datos o en fichero en el
disco, puede ser mas prudente poner 0 en vez de False y 1 en vez de True.
Una variable byte ocupa muy poco, simplemente 1 byte como su nombre indica. Pero no
puede contener números mayores de 255 ni números negativos.
Cada vez que declare una variable numérica piense en los valores que puede tener, sobre
todo cuando esa variable va a ser el resultado de una operación matemática. Recuerde el
Otro tipo de variable es Date. Este tipo de variable representa una fecha o una hora. Pero
debe ser objeto de un estudio un poco mas extenso para tener claro que es una fecha para
Visual Basic, como las trata y como se pueden comparar. Lo verá mas adelante al estudiar las
funciones Format y DateDiff.
Denominamos ámbito de una variable a las partes del programa donde esa variable está
declarada. Para entenderlo mejor, veamos someramente la forma de un programa
desarrollado en VB.
Un programa VB tiene uno o varios formularios. Cada formulario tiene varios controles. Tanto
el formulario como cada uno de sus controles tienen una parte del programa, justamente la
parte relacionada con cada uno de los eventos que pueden suceder bien al formulario o a los
controles. A estas partes las habíamos llamado Procedimientos. Podemos tener
procedimientos que no estén relacionados con ningún evento ocurrido al formulario o a sus
controles. (Los Procedimientos que iremos insertando a lo largo de la aplicación)
Aparte de formularios y controles, un programa puede tener Módulos, y en cada uno de los
módulos podemos insertar cuantos Procedimientos y Funciones queramos. La estructura de
un programa VB puede ser de la siguiente forma:
Si se declara una variable dentro de un procedimiento o Función, esa variable "NO SALE" del
Procedimiento o Función donde se declaró. El procedimiento puede estar en un Formulario
(Cualquier procedimiento de un control o un procedimiento creado por nosotros) o en un
Módulo (En este caso, el procedimiento solo puede ser creado por nosotros)
En un Formulario, una variable puede declararse de dos formas : Privada o Pública. Para
declarar una variable a nivel de formulario debe hacerse en la sección de declaraciones, que
está la ventana de código Objeto = General, Proc. = Declaraciones. Si se declara Privada,
esa variable se puede ver en todo el formulario, (es decir, en todos los procedimientos de
todos los controles del formulario y en los Procedimientos que pudiésemos insertar en ese
formulario), pero no sale de dicho formulario. Si se declara como Pública, esa variable puede
verse por todo el formulario, de la misma forma que lo haría declarada como Privada, y
además puede ser usada desde otro Formulario o Módulo, citándola con el nombre del
Formulario, seguido del nombre de la variable (Formulario.Variable)
En un Módulo una variable puede declararse como Privada, con lo que no saldrá de ese
En VB es posible declarar varias veces las variables, es decir, pueden declararse a nivel de
formulario, en su apartado de declaraciones, y esa variable conservará su valor en todas las
partes de ese formulario. Sin embargo, si se declara una variable con el mismo nombre a un
nivel inferior, por ejemplo al principio de un procedimiento, esa variable será una variable
distinta a la anterior, aunque tenga el mismo nombre, al declararla en un Procedimiento,
solamente será válida en ese Procedimiento. Una vez que hayamos salido de ese
procedimiento, la variable con ese nombre volverá a ser la declarada en el Formulario. En
realidad, lo que tenemos son dos variables distintas, pero con el mismo nombre, una declarada
para todo el formulario excepto para el procedimiento donde se volvió a declarar, y otra para
ese procedimiento concreto.
NOTA.- No es recomendable declarar una variable a dos niveles. Es mucho mejor utilizar otro
nombre para esa variable dentro del procedimiento donde se le declararía por segunda vez. A
esta nota cabe exceptuar cuando declaramos variables para una operación tipo contador
For I = 1 To N
Esa variable I es práctico declararla con el mismo nombre en cada Procedimiento donde se
use.
NombreFormulario.Nombrevariable
Sentencia STATIC
El nombre de una variable puede ser tan largo como queramos. hasta un máximo de 40
caracteres. En la versión VB para España se pueden usar incluso la Ñ y vocales acentuadas.
Es indiferente usar mayúscula ó minúsculas. No se sorprenda, si por ejemplo, la ha declarado
con mayúsculas y luego la cita con minúsculas al escribir el código, que automáticamente se
cambie a mayúsculas. El nombre de una variable siempre debe comenzar por una letra.
No hay problema por utilizar variables largas. Al compilar el programa no se lleva el nombre,
es decir, no le va a ocupar mas espacio. Utilice siempre nombres que le definan la variable
con algún sentido. Es muy útil a la hora de acordarse como se llaman, y sobre todo, a la hora
de rehacer un programa que realizó hace seis meses.
Pese a que Visual Basic no obliga a declarar variables, es muy útil hacerlo. De esta forma se
tiene control sobre el programa. La experiencia se lo irá demostrando.
En un Módulo
Creo que esta costumbre viene del lenguaje C. Pero no vale en VB. Se trata de declarar varias
variables juntas en una misma línea :
Esta declaración está MAL hecha. Visual Basic interpretará que Variable1, Variable2 y
Variable3 son del tipo Variant, y solamente Variable4 la supone como tipo String
La forma correcta de hacerlo, si queremos declarar esas variables un una sola línea, es la
siguiente :
Podemos conocer el tipo con el que se ha declarado una variable. Esto se hace mediante la
Función TypeName, que devuelve una cadena con el tipo de una variable.
MiTipo = TypeName(NombreVariable)
NombreVariable puede ser cualquier variable con excepción de las de tipos definidos por el
usuario.
La cadena de caracteres devuelta por TypeName puede ser una de las siguientes:
Byte Un byte
Entero Un entero.
Si NombreVariable es una matriz, la cadena devuelta puede ser cualquiera de las cadenas
posibles con un paréntesis vacío adherido. Por ejemplo, si NombreVariable es una matriz de
enteros, TypeName devolverá "Integer()".
Option Explicit
Dim MiString As String ‘Hemos declarado que MiString es una variable tipo String
Dim MiEntero As Integer
Dim MiObjeto As Control ‘Hemos declarado que MiObjeto es una variable tipo Objeto
Haga doble click sobre el botón de comando. Le aparecerá la ventana anterior, pero referida
ahora al Command1. Teclee el siguiente código :
Label1 = TypeName(MiString)
label2 = TypeName(MiEntero)
Label3 = TypeName(MiObjeto)
End Sub
Esta función tiene mucha utilidad para determinar errores durante el diseño. Cuando aparece
el error “No coinciden los tipos” puede interrogarse al programa para ver qué tipo de variable
es el que hemos declarado. Esta idea es especialmente útil cuando el trabajo a realizar sea
retomar el trabajo comenzado por otro programador.
Sentencias condicionales.
Si no se cumple
Fin de la sentencia.
Así de fácil es programar en Basic. Lo que ocurre es que esta herramienta habla inglés, y lo
descrito anteriormente toma la forma:
If condición Then
Instrucciones
Else
Otras instrucciones
End If
If condición 1 Then
Instrucciones
ElseIf Condición 2
Otras instrucciones
ElseIf Condición 3
Otro juego de instrucciones
Else
Instrucciones que debe realizar caso de no cumplir las condiciones 1, 2 y 3.
End If
Su nombre casi nos define lo que es: Selecciona, dependiendo del caso, un determinado juego
de instrucciones:
Select Case variable ' variable es una variable que puede tomar los valores (p.e.)
Case 1
Instrucciones a ejecutar en caso de que variable = 1
Case 2
Instrucciones a ejecutar en caso de que variable = 2
Case 3
Instrucciones a ejecutar en caso de que variable = 3
Case 4
Instrucciones a ejecutar en caso de que variable = 4
Case Else
Instrucciones a ejecutar en caso de que variable sea distinta a los valores
anteriores
End Select
Este procedimiento resulta mucho mas sencillo y rápido que las sentencias If Then Else
vistas anteriormente, cuando el margen de elección es mayor que 2.
Puede agrupar varios valores en una misma línea. Por ejemplo, si tiene 100 valores posibles, y
el tratamiento es igual para varios de ellos, puede agruparlos así:
Switch toma una serie de parámetros, todos por parejas. El primer término de cada pareja es
la expresión a evaluar. El segundo es el valor que tiene que devolver. En realidad Switch es
una función (las funciones las veremos muy pronto)
Esta instrucción obtiene un valor para A que dependerá del valor que tome B entre los valores
posibles (1, 2 ó 3)
La sentencia Choose es casi igual, cambia solamente la forma. La misma intrucción anterior
puede realizarse con Choose de la siguiente forma:
A = Choose ( B, 5, 7, 11 )
Las sentencias Switch y Choose no se usan mucho en programación. Parece que los
programadores o no las conocen o se lían (y es comprensible) al utilizarlas. Le garantizo que
puede llegar a ser un gran programador sin necesidad de utilizarlas. Use preferentemente If
End If y Select Case.
Observaciones
IIf siempre evalúa SiEsCierto y SiEsFalso, aunque sólo vaya a devolver una de ellas. Por esta
razón, deberá vigilar que no se produzcan efectos no deseados. Por ejemplo, si al evaluar
SiEsFalso se produce un error de división entre cero, se generará un error aunque Expresión
dé como resultado True.
Al ejecutar el programa, debe introducir un valor numérico en Text1. Si ese valor numérico es
menor que 100, MiVariable tomará el valor “Es menor” (No se cumple la condición expresada
en el primer parámetro Text1.Text > 1000). Si introduce una cantidad mayor, se cumple esa
condición, por lo que MiVariable tomará el valor “Es mayor”. El valor que toma la variable
puede verlo en Label1.
Fíjese que hemos declarado MiVariable como String, ya que va a contener un dato tipo cadena
de caracteres.
Con estas sentencias condicionales es posible realizar bifurcaciones del programa, cambiar las
propiedades de un objeto, obtener resultados de operaciones, ....
Sentencias de bucle.
Es muy común utilizar bucles a lo largo de un programa. Un bucle es una sucesión repetitiva
de instrucciones, que se estarán realizando mientras se cumpla una condición o mientras no se
cumpla otra condición. Es tan sencillo como esto:
Mientras condición
Instrucciones
Existen dos formas de bucle: Una, que realiza un número determinado de recorridos por el
bucle. Es el denominado bucle por contador. Otra, realiza el bucle hasta que se cumpla (o deje
de cumplirse) una condición. Es el llamado bucle por condición.
Realiza el bucle tantas veces como le indiquemos. Por ejemplo, en este bucle nos va
a presentar las 26 letras mayúsculas del alfabeto inglés
For N=65 To 90
Label1.caption = Chr ( N )
Next N
Este "programa" nos presentará en una caja (Label) los caracteres cuyo número ASCII vaya
desde el 65 (A) al 90 (Z) Comenzará presentando el correspondiente al número 65, e irá
presentando sucesivamente el 66, el 67, etc., hasta llegar al 90, donde se parará.
X=0
Do While X < 1000
X=X+1
Loop
El programa toma una variable ( X ) que previamente tuvimos la curiosidad de ponerla a cero,
e incrementa su valor una unidad. Analiza si el valor de X es menor que 1000, y si es cierto,
vuelve a realizar el bucle. Así hasta que X ya no sea menor que 1000. Al dejar de cumplirse
que X sea menor que 1000, sale del bucle. Acabamos de realizar un temporizador, y también
de exponer las sentencias condicionales y los bucles, inicio de cualquier curso de Basic. Como
final de lección, se propone un problema. Con el primer bucle, donde visualizábamos los
caracteres A a la Z, posiblemente no nos diese tiempo de ver cada una de las letras que iban
apareciendo en la pantalla, en la etiqueta Label1, dado que cambiaría con mucha velocidad, y
solamente veríamos la Z, que es donde se detuvo el programa. Podemos poner un
temporizador cada vez que presente una letra, y así nos dará tiempo a verla. Con los dos
bucles vistos anteriormente ya podemos hacerlo.
X=0
Do Until X > 1000
X=X+1
Loop
Observe que la diferencia entre una y otra es la condición, While para indicar Mientras se
cumpla que ... y Until para indicar Mientras no se cumpla que ....
For N=65 To 90
Label1.caption = Chr ( N )
Label1.RefreshN ' Refresca la etiqueta
X=0
Do While X < 1000
X=X+1
Loop
Next N
Este es nuestro primer programa en BASIC. En VISUAL BASIC es idéntico, pero nos falta la
Hemos puesto nuestra primera piedra en Visual Basic. Este ejemplo es muy sencillo. Visual
Basic es tan sencillo como este ejemplo.
(*) Las temporizaciones no se hacen realmente así. El ejemplo anterior no deja de ser
una forma sencilla de detener el programa, para que en los comienzos de su carrera como
programador pueda ver el contenido de una etiqueta. Si lo hiciera de esta forma, su ordenador
estaría detenido realizando una función bastante triste, contar hasta 1000 para luego continuar
el programa. Y lo que es peor, en un ordenador a 300 MHz. Tardaría menos tiempo que en
uno a 66. Esta misma función puede hacerla con Sleep que la verá mas adelante, que es la
forma limpia y elegante de hacer una temporización
Para salir de un bucle, podemos esperar a que se complete, bien porque se ha cumplido la
condición (Bucles por condición) o a que se haya llegado al final de la cuenta (Bucles por
contador). Pero puede ocurrir que interese salir del bucle sin haber terminado la ejecución
total del mismo, por ejemplo, porque ya hemos encontrado lo que estabamos buscando, y
sería una pérdida de tiempo seguir ejecutando el bucle cuando ya hemos obtenido lo que
buscamos. Para ello, basta con ejecutar la sentencia Exit Do (Cuando hemos comenzado el
bucle con Do Until o Do While, o con Exit For cuando lo hemos comenzado con For ... To
Ejemplos
En el siguiente ejemplo pretendemos parar el programa cierto tiempo, a la espera que otro
equipo se conecte a través del puerto serie. (Cuando se conecte, el control MSComm1
detectará la señal DSR que le envía el otro equipo y deberemos salir inmediatamente del
bucle para, por ejemplo, atender a ese puerto serie)
Contador = 0
Do While Contador < 1000
Contador = Contador + 1
DoEvents
If MSComm1.DSRHolding = True Then Exit Do
Sleep (1000)
Loop
En el siguiente ejemplo, deseamos transmitir por el puerto serie una serie de números, del 1 al
For I = 1 To 1000
If MSComm1.DSRHolding = False Then Exit Do
MSComm1.Output = Str(I)
Next I
Función DoEvents
Observará que la variable Valor nunca podrá llegar a tener el valor 100, puesto que cada vez
que llega a 90 le ponemos de nuevo el valor 0. El programa no va a salir nunca del bucle, pero
además no podrá atender a otros eventos que se produzcan en el ordenador (por ejemplo la
pulsación de una tecla) ya que el microprocesador está atendiendo solamente a ese bucle. Si
lo está ejecutando desde el propio entorno de Visual Basic, deberá parar la ejecución mediante
las teclas Ctrl – Pausa. No podrá pararlo mediante el botón Terminar de la barra de
herramientas de VB. En un programa compilado posiblemente tenga que reiniciar el equipo
mediante Alt – Ctrl – Sup, llevándose por delante el resto de los programas que se estén
ejecutando en ese momento en su PC.
No es difícil cometer este error involuntariamente. Esto es lo que se llama un bucle infinito.
Para que no suceda, o al menos, que si nuestro programa entra en un bucle infinito se pueda
salir de una forma no tan agresiva, hay que introducir dentro del bucle la instrucción
DoEvents. Cuando VB encuentra esta función el control del microprocesador al sistema
operativo, y si hay alguna operación en espera (la pulsación de una tecla, por ejemplo) la
ejecuta y posteriormente vuelve a ejecutar el bucle. De esta forma, podemos salvar al menos
los datos de las otras aplicaciones que se están ejecutando al mismo tiempo.
Y ya que explicamos como se sale de un bucle por la vía rápida, veamos como salir de un
procedimiento usando también esa “vía rápida”.
Para salir de un procedimiento basta con ejecutar la sentencia Exit Sub. En el ejemplo
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 18
siguiente, usamos el botón BotonLeerNombre para introducir el dato Nombre en una base de
datos. Pero ese campo puede tener como máximo, 20 caracteres. Si el usuario ha introducido
mas de 20 caracteres, debemos salir del procedimiento donde se introduce ese dato sin
ejecutarlo de forma íntegra:
NOTA. Los ejemplos anteriores sirven solamente de ilustración para explicar el código que
estamos estudiando. No pretenda ver una forma mejor de realizar la misma función, que
seguro que existe.
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
ordenador 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.
Así, el número nueve, que en la memoria del ordenador será una sucesión de bits, nos lo
podrá presentar como:
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 ordenador es un NUMERO.
Cuando introducimos un valor numérico por teclado o pantalla, el ordenador para hacer
operaciones con él, debe transformarlo a un número.
Estas consideraciones nos llevan a las dos primeras funciones con cadenas:
Ejemplos
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).
Esta función transforma, por ejemplo, una variable tipo Booleana en una variable de cadena,
devolviendo la cadena “Verdadero” si el valor de la variable booleana es True, y “Falso” si es
False.
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.
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.
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
Estos operadores se suelen utilizar en estructuras de programa donde se tome una decisión.
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.
Trigonométricas
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:
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 27
Dim Suma as Long, I1 As Byte, I2 As Byte, I3 As Byte, I3 As Byte, I5 As Byte
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.
Supongamos que tenemos un formulario con una etiqueta de nombre Label1, un botón de
comando de nombre Command1. Cuando hagamos click sobre el botón de comando deberá
generar un número comprendido entre el 1 y el 49. En el procedimiento click de Command1
pondremos el siguiente código:
Randomize Timer
A = Rnd * 100
LSB Visual Basic – Guía del Estudiante Capítulo 1 Página 28
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 ordenador.
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
negativos. Por ejemplo, el día 12 de Octubre de 1492, VB lo trata como el día número -
148.732. Ese numero puede conocerlo utilizando la función CDbl sobre una variable tipo
Date. Puede verlo en el ejercicio Cap12 del disco.
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
hubiésemos puesto la expresión FechadeHoy = Format (Now, “dd/mm/yy”) , la variable
FechadeHoy contendría el valor 21/05/98 referido al día citado.
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 )
Va como cultura general. Esta recomendación dice que el formato de fecha debe ponerse de la
forma yyyy-mm-dd (p.e. 1998-10-05 para referirse al 5 de Octubre de 1998). Para este
formato, pondremos :
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
dimensiones de la matriz una vez :
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
Esta función toma una cadena de caracteres compuesta varias subcadenas, separadas entre
ellas mediante un separador, y devuelve una matriz de una dimensión, que contiene esas
subcadenas.
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.
Entre en el programa VB. Le aparecerá en pantalla algo similar a esto : (Para VB Vers. 6)
Este es el comienzo del VB . Observe que en esta pantalla existen varias cosas. En la parte
superior , la barra de título del programa Visual Basic, con el texto :
Por debajo de esta barra de Título del VB, encontramos la barra de menú de VB, con las
leyendas :
Por debajo de esta barra de menú tenemos la barra de herramientas, donde podrá ver varios
iconos, que cada uno representa un determinada operación que Vd. puede realizar. Estas
operaciones está todas en la línea de menú, y puede acceder a ellas abriendo los menús
desplegables que existen en cada una de las palabras Archivo Edición Ver ...... de esta línea
de menú. El hecho de colocar las operaciones mas usuales en un icono en la barra de
herramientas se hace para mayor comodidad del usuario.
A la izquierda o derecha de la pantalla tiene una caja rectangular con varias columnas de
iconos. Esa caja es la Caja de Herramientas (No la confunda con la barra de herramientas de
la parte superior)
Posiblemente esta caja de herramientas no le aparezca tal y como la ve en esta figura. Eso
depende de la versión y la personalización. Para añadir un nuevo control haga click en
Proyecto | Componentes y le aparecerá una caja con todos los controles existentes. Puede
seleccionar nuevos controles para añadir a la caja de herramientas, marcando la casilla que
está a la izquierda del nombre del control que quiere introducir. Una vez seleccionados todos
los nuevos controles, haga click en APLICAR . Salga haciendo Click en ACEPTAR, y podrá
observar que esos nuevos controles ya se le han añadido a la caja de herramientas. Esos
controles le aparecerán cada vez que cargue el proyecto actual. No es prudente meter muchos
controles en la caja. Ponga solamente los que necesite normalmente en sus aplicaciones.
Ocupará menos memoria y tardará menos tiempo en cargar el programa VB. Además, cuando
realice una aplicación y la distribuya una vez compilada, Visual Basic entregará en los
disquetes de distribución las DLL’s u OCX’s correspondientes a todos los controles
personalizados que Vd. tenga en la caja de herramientas, los necesite el programa o no los
necesite. Esto le va a suponer que está cargando subprogramas inútiles en el ordenador
destino de su aplicación. A la hora de compilar el programa (Crear archivo .EXE) quite todos
los controles personalizados que no necesite su aplicación. (Sólo los controles personalizados.
Los controles comunes - CommandButton, Label, TextBox, etc.-, no se pueden eliminar de la
caja de herramientas)
Para quitar controles de su caja de herramientas, debe proceder de forma análoga, a lo que
hizo para meterlos en la caja de herramientas, pero al revés. No se preocupe a la hora de
quitarlos. Si está utilizando un determinado control, VB no le dejará quitarlo.
Puede tener dos ventanas más adosadas a la caja de herramientas, una denominada Ventana
de Propiedades, donde puede ver las propiedades del formulario o de cualquier control que
tenga dentro del proyecto, y otra, denominada Ventana de Proyecto, donde puede ver todos
los formularios existentes. Existen otras ventanas, por ejemplo la Ventana de Depuración.
Por cada formulario y cada control que introduzca en el proyecto, le aparecerá otra ventana,
denominada Ventana de código.
No se extrañe de que esta presentación gráfica del Visual Basic coincida con otros sistemas de
desarrollo (Delphi, p.e.). La lógica de desarrollo de una aplicación en Windows ha llevado a
varios fabricantes de software a utilizar un entorno gráfico similar (diríamos idéntico). A Visual
basic le queda el orgullo de ser el primero en utilizarlo. (¡Y el mejor!)
Con lo descrito anteriormente ya tenemos, al menos, fijado el argot con el que expresarnos
para comenzar a estudiar el VISUAL BASIC. Veamos con un poco mas detalle la Ventana de
Código.
Esta figura le muestra un Formulario con su ventana de código. Cada objeto gráfico de VB
tiene su propia ventana de código. Así, si en este formulario hubiésemos introducido un Label
y dos CommandButton, todos ellos tendrían su propia ventana de código. La ventana de
código la podemos ver haciendo doble click sobre cualquier objeto de nuestro proyecto. En
este caso hemos hecho doble click sobre el único objeto que teníamos : el formulario.
Observe las dos cajas de la parte superior, uno con la inscripción Objeto : que en el momento
que le sacamos la foto tenía Form, y el otro con la inscripción Proc : (procedimiento), que en
el momento de la foto tenía Load. A estas cajas les denominamos Lista de Objetos y Lista
de Procedimientos respectivamente.
Haciendo click sobre la flecha de cada lista, se despliega un menú, en la lista de objetos se
desplegará una lista con los nombres de cada objeto existente en ese momento dentro del
formulario. Haciendo click sobre uno de los nombres, nos presentará la ventana de código de
ese objeto. Todos los objetos gráficos (controles) existentes dentro de un formulario y el propio
formulario aparecerán en la misma lista de objetos.
Haciendo click sobre la flecha de la lista de procedimientos, se despliega la lista con todos los
procedimientos posibles para ese objeto. Siempre saldrá uno. Si tenemos escrito código en
uno de los procedimientos, saldrá por defecto ese procedimiento para el cual hemos escrito el
código. Si no hay código en ninguno de los procedimientos, saldrá el que tenga por defecto
cada objeto.
Solamente nos queda por decir, para cerrar este capítulo, que es un procedimiento.
Para ello vamos a explicar lo que es un evento. Un Evento es algo que le puede ocurrir a un
objeto. En una interface gráfica, lo que le puede ocurrir a un objeto es que se le haga click,
doble click, que se pase el cursor del ratón por encima, etc. Este es el Evento. El
Procedimiento es la respuesta por parte de ese objeto, al evento que le está sucediendo.
Esa respuesta, esa forma de Proceder del objeto al evento que le está sucediendo, debemos
programarla según nuestras necesidades, es decir, debemos escribir el código que necesite
nuestra aplicación como respuesta al evento que acaba de ocurrir. Posiblemente, no queramos
ninguna respuesta a muchos de los eventos que pueden acaecer a un objeto. Cada objeto
tiene muchos eventos y solamente queremos aprovechar los que nos interesan. Para que un
evento no produzca ningún efecto, basta con dejar sin código el procedimiento
Observará que el primer elemento del menú desplegable de la lista de objetos se denomina
General. Este no es en realidad ningún objeto, sino un apartado existente en cada formulario,
que, al desplegar su lista de procedimientos tiene la sección de declaraciones, donde
debemos declarar las variables que queremos que afecten a todo el formulario y sus controles,
y tendrá además, los nombres de todos los procedimientos que introduzcamos (véase un
poco mas adelante). En este menú desplegable de la lista de procedimientos del General verá
con frecuencia cosas que Vd. no puso allí. Cosas tales como Command1_click, y en la
ventana un determinado código. Esto ocurre cuando se borra algún control que tenía escrito
código en alguno de sus procedimientos. Visual Basic sabe lo mucho que cuesta escribir el
código asociado a un control. Si borramos un control de nuestro formulario accidentalmente,
después de haber introducido todo el código asociado a él, Visual Basic nos sorprende con que
ese código no lo tira inmediatamente, sino que lo reserva como un procedimiento en ese
apartado General del formulario. Si en realidad queríamos borrar el control y todo su código,
debemos quitarlo de ese apartado General de nuestro formulario, pues en realidad, si no lo
queremos, no hará otra cosa que estorbar. Para quitarlo basta con borrar todo el código que
aparece en la ventana de código cuando hacemos click sobre el nombre del control eliminado.
Deberemos borrar todo el código, incluida la cabecera donde figura el nombre del control
eliminado, y la parte final, que siempre termina con End Sub.
El primer estorbo lo observará si crea otro control con el mismo nombre, cosa fácil ya que VB
da un nombre por defecto a cada control (Command1, Command2....). El código asociado al
control eliminado pasará automáticamente al nuevo control con el mismo nombre.
Una aplicación puede tener todo su código escrito en los sucesivos procedimientos del
formulario y de los controles que tenga ese formulario.
Puede ocurrir que un determinado evento no esté entre los posibles eventos de los controles
de nuestra aplicación. Piense por ejemplo, el evento de que la variable A sea igual a la
variable B. No existe en ninguno de los controles ese procedimiento. No se preocupe, puede
crear un procedimiento que se ejecute cuando su programa lo decida. Podemos añadir cuantos
procedimientos queramos. Estos procedimientos se añaden al formulario, y deberán definirse
por un nombre que Vd. debe elegir. Para que se ejecuten las instrucciones (código) incluido en
ese procedimiento, basta simplemente con nombrarlo por ese nombre.
Para insertar un procedimiento debe ir a la barra de menú, hacer click sobre Herramientas, y
en el menú que le desplegará, volver a hacer click sobre Agregar Procedimiento. VB le
presentará un cuadro donde le pedirá el nombre, si quiere que sea un procedimiento, una
función o una propiedad. A lo largo del curso irá viendo que es cada cosa.
Escribiendo el código en los sucesivos procedimientos, bien en los propios de cada objeto,
bien en los procedimientos que vayamos creando, es posible completar la aplicación. Pero en
una aplicación larga esta forma de escribir el código no sería la mas adecuada. Es mas,
posiblemente sería demasiado engorroso escribirla de esta forma, y muy probablemente
deberíamos escribir el mismo código para varios procedimientos, lo que alargaría inútilmente
el programa y el tiempo de desarrollo.
Para disponer de un sitio donde escribir parte (o la mayor parte) de su programa, puede
introducir uno o varios módulos. Expliquemos lo que es un módulo.
Un Módulo es una parte del programa donde solamente puede escribir código. Es igual que un
formulario, sin interface gráfica. Un profesor de Visual Basic lo expresaba diciendo que un
Módulo es un Formulario sin cara. En un módulo pueden existir procedimientos al igual que en
los formularios, pero como un módulo no tiene interface gráfica, esos procedimientos debe
introducirlos el programador tal y como explicamos un poco mas atrás. El módulo tiene su
propia ventana de código, al igual que un formulario, con un objeto único, el apartado General.
Aquí también tenemos la sección de declaraciones, al igual que los formularios. En esta
Los módulos se emplean para la declaración de variables globales, y para escribir el código de
la aplicación que sea común a varios formularios. Esto nos evita tener que repetir código
inútilmente. Ese código común se escribirá en un procedimiento que previamente habremos
insertado en este módulo, y lo citaremos por su nombre desde cualquier parte del programa.
Los procedimientos se pueden introducir en los módulos o en los formularios. Y les pasa lo
mismo que a las variables en cuanto a su ámbito. Para agregar un procedimiento debe abrir
una ventana de código (cualquiera) perteneciente al módulo o formulario donde quiera insertar
ese módulo, y a continuación hacer click sobre Herramientas | Agregar Procedimiento de la
Barra de Menú.
Nos aparecerá un cuadro donde le debemos poner el nombre de ese procedimiento y elegir el
ámbito (Alcance en la figura) que le queremos dar, público o privado.
¿Cual es el nombre por el que podemos llamar a ese procedimiento? Sigue las mismas
normas que para las variables. Si se ha declarado como público en un módulo, se le citará por
su nombre cualquiera que sea la parte del programa desde donde le citemos.
p.e. Formulario1.CalculaGastos
Si se ha declarado como privado, se le llamará por el nombre, pero solamente desde el código
del módulo o formulario donde se insertó, puesto que desde otro módulo o formulario no se
verá.
Fíjese en el punto usado como separador entre el nombre del formulario y el nombre del
procedimiento. VB usa como separador un punto. Usa el separador para separar el nombre de
un control y una de sus propiedades (Label1.Caption), para separar el nombre del formulario
del nombre de uno de sus controles (Formulario1.label1.caption) Se irá familiarizando con la
terminología VB según vayamos avanzando en el curso.
Call
En Visual Basic, para ejecutar un procedimiento no hace falta usar la sentencia Call, muy
propia de otros lenguajes de programación. Hay programadores que la usan no sé si porque
creen que es necesario, o porque piensan que queda más bonito. No hace falta pero VB lo
soporta. Queda a gusto del programador usarla o no usarla.
Funciones
Main
Merece la pena pararse un poco para estudiar el Procedimiento Main. Para verlo con mas
detalle, comentaremos como comienza a trabajar una aplicación realizada en Visual Basic.
Imaginemos una aplicación que tiene 3 Formularios. En cada uno de ellos tiene código.
Lógicamente la aplicación tendrá que presentar uno de ellos en primer lugar. Deberemos
decirle a Visual Basic cual es el formulario inicial, y será ese por el que empiece. En ese
formulario dispondremos el código necesario para que la aplicación se ejecute en el orden
deseado.
Verá que tiene 5 pestañas, y actualmente tiene abierta la pestaña correspondiente a General,
y tiene desplegada una lista donde nos pide el Formulario Inicial. En esa lista figura también la
expresión Sub Main. Si ponemos como formulario inicial uno de los formularios, la aplicación
comenzará por ese formulario. Si en uno de los Módulos existentes en el proyecto, ponemos
un procedimiento llamado Main, podemos comenzar la ejecución de la aplicación justamente
por ese procedimiento. En ese procedimiento pondremos el código necesario para que,
posteriormente, se muestre uno de los formularios. Esto es muy practico cuando queremos
hacer una función previa a mostrar cualquier formulario (abrir una base de datos, por
ejemplo). Para comenzar la aplicación por Main se elige esa opción en la lista Formulario
Inicial.
¡ Recuerde que Main debe estar en un Módulo !
El cuadro de diálogo anterior sirve además para otras cosas. Entre ellas poner el nombre del
proyecto (nombre que no aparecerá por ninguna parte, solo en los datos internos de la
aplicación) y su descripción.
Existe otro cuadro parecido en Herramientas | Opciones donde puede terminar de completar
las condiciones de trabajo. Observe el cuadro “Cuando Inicie sus programas”. Aquí le permite
grabar el programa antes de ejecutar, cosa que le recomiendo para evitar que, al ejecutarlo,
por un código mal puesto se le cuelgue el PC y tenga que volver a empezar. En este cuadro
puede elegir también el formato de la ventana de trabajo formato del editor, etc.
Podemos elegir también las ventanas que queremos que estén siempre visibles, y que
verifique automáticamente la sintaxis de una instrucción en el momento de escribirla.
Cambiar el color de la letra y del fondo del código, según el tipo que sea (código, comentario,
error devuelto, etc.). Los alumnos mas aventajados y con ganas de marear al profesor,
conocen la forma de poner como invisible una parte del texto del código. Si observa
comportamientos raros en el texto donde escribe el código, revise el cuadro de Colores de
Código.
En la sección de operadores lógicos puede jugar a aplicar uno de los operadores disponibles a
una pareja de número o a un par de datos booleanos. Observe que para invertir los bits de un
byte basta con hacer el Xor con 255
Este sistema de cifrado puede utilizarlo en sus aplicaciones para, por ejemplo, cifrar el
Password de entrada y poder guardarlo cifrado en el disco duro de su PC. De cualquier forma,
debo indicarle que este sistema de cifrado al tiempo que simple, es tremendamente
vulnerable, pero si lo acompaña de otras características, lo convierte en un cifrador
intrínsecamente seguro (Vigenere). La explicación mas detallada de algoritmos cifradores se
sale por completo de la intención de este curso.
Supongamos que queremos cifrar la palabra Secreto que es el Password de entrada para una
aplicación. Deberemos usar otra palabra que cifrará a la anterior, que llamaremos Clave. La
clave debe tener, al menos, tantos caracteres como la palabra a cifrar. Imaginemos que clave
es ABCDEFGHIJK
Para cifrar usamos la función Xor de cada una de las letras de Secreto con las
correspondientes letras de la clave. (La primera letra de Secreto con la primera letra de la
clave, la segunda con la segunda, etc.) Pero debemos efectuar la función Xor sobre un
número, no sobre una letra. Por lo tanto convertiremos la letra en un número usando la función
Asc Asc (A) = 65, ya que 65 es el número Ascii que corresponde a la A
Para realizar el Xor del carácter introducido en la variable a, con el carácter introducido en la
variable b haremos:
Resultado = 83 Xor 65
Luego el resultado de realizar el Xor entre S y A es el carácter 18, que no tiene representación
como una letra.
65 = 0 1 0 0 0 0 0 1
18 = 0 0 0 1 0 0 1 0
Resultado 2= 0 1 0 1 0 0 1 1 = 83 es decir la letra S