NekroAyuda: Introducción a las Variables, Constantes y Tipos de Datos.

Iniciado por NekroByte, 15 Marzo 2005, 13:45 PM

0 Miembros y 1 Visitante están viendo este tema.

NekroByte

CitarExtraido de las Librerías de Microsoft Developer NetWork.


Introducción a las Variables, Constantes y Tipos de Datos


A menudo necesitará almacenar valores temporalmente cuando esté realizando cálculos con Visual Basic. Por ejemplo, puede que desee calcular diversos valores, compararlos y realizar distintas operaciones con ellos, dependiendo de los resultados de la comparación. Necesitará conservar los valores si desea compararlos, pero no necesitará almacenarlos en una propiedad.

Visual Basic, como la mayoría de los lenguajes de programación, utiliza variables para almacenar valores. Las variables tienen un nombre (la palabra que utiliza para referirse al valor que contiene la variable) y un tipo de dato (que determina la clase de datos que puede almacenar la variable). Se pueden usar matrices para almacenar colecciones indexadas de variables relacionadas.

Las constantes también almacenan valores pero, como su nombre indica, estos valores permanecen constantes durante la ejecución de la aplicación. La utilización de constantes puede hacer más legible el código ya que proporciona nombres significativos en vez de números. Visual Basic incorpora una serie de constantes, pero puede crear sus propias constantes.

Los tipos de datos controlan el almacenamiento interno de datos en Visual Basic. De forma predeterminada, Visual Basic utiliza el tipo de dato Variant. Hay otros tipos de datos disponibles que le permiten optimizar el código en cuanto a velocidad y tamaño cuando no necesite la flexibilidad que proporciona el tipo Variant.

Para obtener información más detallada, vea:

  • Variables   Introducción a las variables: qué son y cómo usarlas.
  • Descripción del alcance de las variables   Análisis de cómo se aplica el alcance a las variables.
  • Temas avanzados sobre variables   Información detallada sobre las variables.
  • Variables estáticas   Introducción a la utilización de variables estáticas para preservar valores.
  • Constantes   Introducción a la utilización de constantes para representar valores.
  • Tipos de datos   Análisis de los tipos de datos disponibles en Visual Basic.
  • Temas avanzados sobre el tipo de dato Variant   Información detallada sobre el tipo de dato Variant.
  • Matrices   Introducción a la utilización de matrices para grupos de valores.
  • Matrices dinámicas   Análisis sobre la utilización de matrices dinámicas para trabajar con grupos de valores

NekroByte

Variables


En Visual Basic puede usar variables para almacenar valores temporalmente durante la ejecución de una aplicación. Las variables tienen un nombre (la palabra que utiliza para referirse al valor que contiene la variable) y un tipo de dato (que determina la clase de datos que la variable puede almacenar).

Puede considerar una variable como un marcador de posición en memoria de un valor desconocido. Por ejemplo, suponga que está creando un programa para una frutería que haga un seguimiento del precio de las manzanas. No sabe el precio de una manzana o la cantidad que se ha vendido hasta que no se produce realmente la venta. Puede usar dos variables para almacenar los valores desconocidos (vamos a llamarlos PrecioManzanas y ManzanasVendidas). Cada vez que se ejecuta el programa, el usuario especifica los valores de las dos variables. Para calcular las ventas totales y mostrarlas en un cuadro de texto llamado txtVentas, el código debería parecerse al siguiente:

txtVentas.txt = PrecioManzanas * ManzanasVendidas


La expresión devuelve un total distinto cada vez, dependiendo de los valores que indique el usuario. Las variables le permiten realizar un cálculo sin tener que saber antes cuáles son los valores especificados.

En este ejemplo, el tipo de dato de PrecioManzanas es Currency; el tipo de dato de ManzanasVendidas es Integer. Las variables pueden representar otros muchos valores como valores de texto, fechas, diversos tipos numéricos e incluso objetos.


Almacenar y recuperar datos en variables

Utilice instrucciones de asignación para realizar cálculos y asignar el resultado a una variable:

ManzanasVendidas = 10                  ' Se pasa el valor 10 a
                                    ' la variable.
ManzanasVendidas = ManzanasVendidas + 1   ' Se incrementa la variable.


Observe que el signo igual del ejemplo es un operador de asignación, no un operador de igualdad; el valor (10) se asigna a la variable (ManzanasVendidas).


Declarar variables

Declarar una variable es decirle al programa algo de antemano. Se declara una variable mediante la instrucción Dim, proporcionando un nombre a la variable:

Dim nombreVariable [As tipo]

Las variables que se declaran en un procedimiento mediante la instrucción Dim sólo existen mientras se ejecuta el procedimiento. Cuando termina el procedimiento, desaparece el valor de la variable. Además, el valor de una variable de un procedimiento es local de dicho procedimiento; es decir, no puede tener acceso a una variable de un procedimiento desde otro procedimiento. Estas características le permiten usar los mismos nombres de variables en distintos procedimientos sin preocuparse por posibles conflictos o modificaciones accidentales.

El nombre de una variable:

  • Debe comenzar con una letra.
  • No puede incluir un punto o un carácter de declaración de tipo.
  • No debe exceder de 255 caracteres.
  • Debe ser única en el mismo alcance, que es el intervalo desde el que se puede hacer referencia a la variable: un procedimiento, formulario, etc.

La cláusula opcional As tipo de la instrucción Dim le permite definir el tipo de dato o de objeto de la variable que va a declarar. Los tipos de datos definen el tipo de información que almacena la variable. Algunos ejemplos de tipos de datos son String, Integer y Currency. Las variables también pueden contener objetos de Visual Basic u otras aplicaciones. Algunos ejemplos de tipos de objeto de Visual Basic, o clases, son Object, Form1 y TextBox.


Hay otras formas de declarar variables:

  • Declarar una variable en la sección Declaraciones de un módulo de formulario, estándar o de clase, en vez de en un procedimiento, hace que la variable esté disponible para todos los procedimientos del módulo.
  • Declarar una variable mediante la palabra clave Public hace que esté accesible para toda la aplicación.
  • Declarar una variable local mediante la palabra clave Static preserva su valor aunque termine el procedimiento.


Declaración implícita

No tiene por qué declarar una variable antes de usarla. Por ejemplo, podría escribir una función donde no hiciera falta declarar TempVal antes de usarla:

Function SafeSqr(num)
   TempVal = Abs(num)
   SafeSqr = Sqr(TempVal)
End Function


Visual Basic crea automáticamente una variable con ese nombre, que puede usar como si la hubiera declarado explícitamente. Aunque es cómodo, puede provocar errores sutiles en el código si se equivoca de nombre de variable. Por ejemplo, suponga que ha escrito esta función:

Function SafeSqr(num)
   TempVal = Abs(num)
   SafeSqr = Sqr(TemVal)
End Function


A primera vista, parece igual. Pero como se ha escrito erróneamente la variable TempVal en la tercera línea, la función devolverá siempre cero. Cuando Visual Basic encuentra un nombre nuevo, no puede averiguar si realmente desea declarar una variable nueva o simplemente ha escrito de forma errónea una variable existente, por lo que crea una variable nueva con ese nombre.


Declaración explícita

Para evitar problemas al equivocarse de nombre en las variables, puede estipular que Visual Basic le avise siempre que encuentre un nombre que no se haya declarado explícitamente como una variable.

Para declarar variables de forma explícita

  • Incluya esta instrucción en la sección Declaraciones del módulo de clase, de formulario o estándar:
Option Explicit

[li]–o bien–
En el menú Herramientas, elija Opciones, haga clic en la ficha Editor y active la opción Requerir declaración de variables. Esto inserta automáticamente la instrucción Option Explicit en los módulos nuevos, pero no en los ya creados, por lo que tendrá que agregar manualmente Option Explicit a los módulos existentes en el proyecto.[/li]
[/list]

Si hubiera tenido efecto dicha instrucción en el módulo de formulario o estándar que contiene la función SafeSqr, Visual Basic habría reconocido TempVal y TemVal como variables no declaradas y habría generado errores para ambas. Debería, por tanto, declarar explícitamente TempVal:

Function SafeSqr(num)
   Dim TempVal
   TempVal = Abs(num)
   SafeSqr = Sqr(TemVal)
End Function


Ahora podrá comprender el problema inmediatamente porque Visual Basic habrá mostrado un mensaje de error para la variable TemVal que se ha escrito de forma incorrecta. Como la instrucción Option Explicit le ayuda a interceptar esta clase de errores, es conveniente usarla en todo el código.

Nota: La instrucción Option Explicit funciona sobre módulo a módulo; debe colocarse en la sección Declaraciones de todos los módulos de formulario, estándar o de clase en los que desee que Visual Basic obligue a declarar explícitamente las variables. Si activa Requerir declaración de variables, Visual Basic insertará Option Explicit en todos los módulos de formulario, estándares o de clase siguientes, pero no lo agregará en el código existente. Deberá agregar manualmente Option Explicit a los módulos ya existentes en el proyecto.

NekroByte

Descripción del alcance de las variables


El alcance de una variable define qué partes del código son conscientes de su existencia. Cuando declara una variable en un procedimiento, sólo el código de dicho procedimiento puede tener acceso o modificar el valor de la variable; tiene un alcance que es local al procedimiento. A veces, sin embargo, se necesita usar una variable con un alcance más general, como aquella cuyo valor está disponible para todos los procedimientos del mismo módulo o incluso para todos los procedimientos de toda la aplicación. Visual Basic le permite especificar el alcance de una variable cuando la declara.


Establecer el alcance de las variables

Dependiendo de cómo se declara, una variable tiene como alcance un procedimiento (local) o un módulo.

Alcance ---> Nivel de Procedimiento ---> Nivel de Módulo

Privado ---> Las variables son privadas del procedimiento en el que aparecen. ---> Las variables son privadas del módulo en el que aparecen.

Público ---> No puede declarar variables públicas dentro de un procedimiento. ---> Variables utilizadas en un procedimiento.



Variables utilizadas en un procedimiento.

Las variables a nivel de procedimiento sólo se reconocen en el procedimiento en el que se han declarado. Se las conoce también como variables locales. Se declaran mediante las palabras clave Dim o Static. Por ejemplo:

Dim intTemp As Integer

–o bien–

Static intPermanent As Integer

Los valores de variables locales declaradas con Static existen mientras se ejecuta la aplicación, mientras que las variables declaradas con Dim sólo existen mientras se ejecuta el procedimiento.

Las variables locales resultan una elección apropiada para cálculos temporales. Por ejemplo, puede crear una docena de procedimientos distintos que contengan una variable llamada intTemp. Como cada intTemp se ha declarado como una variable local, cada procedimiento sólo reconoce su propia versión de intTemp. Cualquier procedimiento puede alterar el valor de su intTemp local sin que ello afecte a las variables intTemp de los demás procedimientos.


Variables utilizadas en un módulo

De forma predeterminada, una variable a nivel de módulo está disponible para todos los procedimientos del módulo, pero no para el código de otros módulos. Cree variables a nivel de módulo declarándolas con la palabra clave Private en la sección Declaraciones al principio del módulo. Por ejemplo:

Private intTemp As Integer


A nivel de módulo, no hay diferencia entre Private y Dim, pero es preferible Private porque contrasta con Public y hace que el código sea más fácil de comprender.


Variables utilizadas por todos los módulos

Para hacer que una variable a nivel de módulo esté disponible para otros módulos, utilice la palabra clave Public para declarar la variable. Los valores de las variables públicas están disponibles para todos los procedimientos de la aplicación. Al igual que todas las variables a nivel de módulo, las variables públicas se declaran en la sección Declaraciones al principio del módulo. Por ejemplo:

Public intTemp As Integer


Nota: No puede declarar variables públicas en un procedimiento, sólo en la sección Declaraciones de un módulo.

NekroByte

Temas avanzados sobre variables


Usar diversas variables con el mismo nombre

Si hay variables públicas en módulos distintos que comparten el mismo nombre, es posible diferenciarlas en el código haciendo referencia al módulo y a los nombres de variable. Por ejemplo, si hay una variable pública de tipo Integer, intX , declarada en Form1 y en Module1, puede hacer referencia a ambas como Module1.intX y Form1.intX para obtener los valores correctos.

Para ver cómo funciona, inserte dos módulos estándar en un proyecto nuevo y dibuje tres botones de comando en un formulario.

Se declara una variable, intX, en el primer módulo estándar, Module1. El procedimiento Test establece su valor:

Public intX As Integer      ' Declara intX en Module1.
Sub Test()
   ' Establece el valor de la variable intX en Module1.
   intX = 1   
End Sub


La segunda variable, que tiene el mismo nombre intX, se declara en el segundo módulo estándar, Module2. De nuevo, un procedimiento llamado Test establece su valor:

Public intX As Integer      ' Declara intX en Module2.
Sub Test()
   ' Establece el valor de la variable intX en Module2
   intX = 2   
End Sub


La tercera variable intX se declara en el módulo de formulario. Una vez más, un procedimiento llamado Test establece su valor.

Public intX As Integer      ' Declara la variable intX del
                           ' formulario.
Sub Test()
   ' Establece el valor de la variable intX del formulario.
   intX = 3
End Sub


Cada uno de los procedimientos de evento Click de los tres botones de comando llama al procedimiento Test adecuado y utiliza MsgBox para mostrar los valores de las tres variables.

Private Sub Command1_Click()
   Module1.Test               ' Llama a Test en Module1.
   MsgBox Module1.intX         ' Muestra intX de Module1.
End Sub

Private Sub Command2_Click()
   Module2.Test               ' Llama a Test en Module2.
   MsgBox Module2.intX         ' Muestra intX de Module2.
End Sub

Private Sub Command3_Click()
   Test                     ' Llama a Test en Form1.
   MsgBox intX               ' Muestra intX de Form1.
End Sub


Ejecute la aplicación y haga clic en cada uno de los tres botones de comando. Verá las distintas referencias a las tres variables públicas. Observe que en el procedimiento de evento Click del tercer botón de comando no necesita especificar Form1.Test cuando llame al procedimiento Test del formulario ni a Form1.intX cuando llame al valor de la variable Integer del formulario. Si hay varios procedimientos y variables con el mismo nombre, Visual Basic toma el valor de la variable más local que, en este caso, es la variable de Form1.


Variables públicas frente a locales

También puede tener una variable con el mismo nombre en alcances distintos. Por ejemplo, podría tener una variable pública llamada Temp y, en un procedimiento, declarar una variable local llamada Temp. Las referencias al nombre Temp dentro del procedimiento tendrían acceso a la variable local y las referencias a Temp fuera del procedimiento tendrían acceso a la variable pública. Se puede tener acceso a la variable a nivel de módulo desde el procedimiento calificándola con el nombre del módulo.

Public Temp As Integer
Sub Test()
   Dim Temp As Integer
   Temp = 2               ' Temp tiene el valor 2.
   MsgBox Form1.Temp      ' Form1.Temp tiene el valor 1.
End Sub

Private Sub Form_Load()
   Temp = 1               ' Establece Form1.Temp a 1.
End Sub
Private Sub Command1_Click()
   Test   
End Sub


En general, cuando las variables tienen el mismo nombre pero distinto alcance, la variable más local siempre oculta (es decir, tiene preferencia de acceso) a las variables menos locales. Así, si tiene también una variable a nivel de procedimiento llamada Temp, ensombrecería a la variable pública Temp de ese módulo.


Ensombrecer propiedades de formularios y controles

Debido al efecto de ensombrecimiento, las propiedades de formularios, controles, constantes y procedimientos se tratan como variables a nivel de módulo en el módulo de formulario. No es legal tener una propiedad de formulario o un control con el mismo nombre que una variable a nivel de módulo, constante, tipo definido por el usuario o procedimiento, ya que ambas tendrían el mismo alcance.

En el módulo de formulario, las variables locales con nombres iguales a controles del formulario ensombrecen a los controles. Debe calificar el control con una referencia al formulario o usar la palabra clave Me para establecer u obtener su valor o cualquiera de sus propiedades. Por ejemplo:

Private Sub Form_Click ()
Dim Text1, BackColor
' Se supone que también hay un control en el formulario que se
' llama Text1.
   Text1 = "Variable"   ' La variable ensombrece al control.
   Me.Text1 = "Control"   ' Debe calificar con Me para obtener
                        ' el control.
   Text1.Top = 0         ' Esto provoca un error
   Me.Text1.Top = 0      ' Debe calificar con Me para obtener
                        ' el control.
   BackColor = 0         ' La variable ensombrece a la propiedad.
   Me.BackColor = 0      ' Debe calificar con Me para obtener la
                        ' propiedad del formulario.
End Sub



Usar variables y procedimientos con el mismo nombre

Los nombres de las variables privadas y públicas a nivel de módulo también pueden entrar en conflicto con los nombres de los procedimientos. Una variable del módulo no puede tener el mismo nombre que los procedimientos o tipos definidos en el módulo. Sin embargo, pueden tener el mismo nombre que los procedimientos, tipos o variables públicos definidos en otros módulos. En este caso, cuando se tiene acceso a la variable desde otro módulo, debe calificarse con el nombre del módulo.

Aunque las reglas de ensombrecimiento descritas antes no son complejas, el ensombrecimiento puede confundir y conducir a errores sutiles en el código; en programación es conveniente asignar nombres distintos a las variables. En los módulos de formulario, procure usar nombres de variable que difieran de los nombres de los controles utilizados en esos formularios.

NekroByte

Variables estáticas




Usar diversas variables con el mismo nombre

Si hay variables públicas en módulos distintos que comparten el mismo nombre, es posible diferenciarlas en el código haciendo referencia al módulo y a los nombres de variable. Por ejemplo, si hay una variable pública de tipo Integer, intX , declarada en Form1 y en Module1, puede hacer referencia a ambas como Module1.intX y Form1.intX para obtener los valores correctos.

Para ver cómo funciona, inserte dos módulos estándar en un proyecto nuevo y dibuje tres botones de comando en un formulario.

Se declara una variable, intX, en el primer módulo estándar, Module1. El procedimiento Test establece su valor:

Public intX As Integer      ' Declara intX en Module1.
Sub Test()
   ' Establece el valor de la variable intX en Module1.
   intX = 1   
End Sub


La segunda variable, que tiene el mismo nombre intX, se declara en el segundo módulo estándar, Module2. De nuevo, un procedimiento llamado Test establece su valor:

Public intX As Integer      ' Declara intX en Module2.
Sub Test()
   ' Establece el valor de la variable intX en Module2
   intX = 2   
End Sub


La tercera variable intX se declara en el módulo de formulario. Una vez más, un procedimiento llamado Test establece su valor.

Public intX As Integer      ' Declara la variable intX del
                           ' formulario.
Sub Test()
   ' Establece el valor de la variable intX del formulario.
   intX = 3
End Sub


Cada uno de los procedimientos de evento Click de los tres botones de comando llama al procedimiento Test adecuado y utiliza MsgBox para mostrar los valores de las tres variables.

Private Sub Command1_Click()
   Module1.Test               ' Llama a Test en Module1.
   MsgBox Module1.intX         ' Muestra intX de Module1.
End Sub

Private Sub Command2_Click()
   Module2.Test               ' Llama a Test en Module2.
   MsgBox Module2.intX         ' Muestra intX de Module2.
End Sub

Private Sub Command3_Click()
   Test                     ' Llama a Test en Form1.
   MsgBox intX               ' Muestra intX de Form1.
End Sub


Ejecute la aplicación y haga clic en cada uno de los tres botones de comando. Verá las distintas referencias a las tres variables públicas. Observe que en el procedimiento de evento Click del tercer botón de comando no necesita especificar Form1.Test cuando llame al procedimiento Test del formulario ni a Form1.intX cuando llame al valor de la variable Integer del formulario. Si hay varios procedimientos y variables con el mismo nombre, Visual Basic toma el valor de la variable más local que, en este caso, es la variable de Form1.


Variables públicas frente a locales

También puede tener una variable con el mismo nombre en alcances distintos. Por ejemplo, podría tener una variable pública llamada Temp y, en un procedimiento, declarar una variable local llamada Temp. Las referencias al nombre Temp dentro del procedimiento tendrían acceso a la variable local y las referencias a Temp fuera del procedimiento tendrían acceso a la variable pública. Se puede tener acceso a la variable a nivel de módulo desde el procedimiento calificándola con el nombre del módulo.

Public Temp As Integer
Sub Test()
   Dim Temp As Integer
   Temp = 2               ' Temp tiene el valor 2.
   MsgBox Form1.Temp      ' Form1.Temp tiene el valor 1.
End Sub

Private Sub Form_Load()
   Temp = 1               ' Establece Form1.Temp a 1.
End Sub
Private Sub Command1_Click()
   Test   
End Sub


En general, cuando las variables tienen el mismo nombre pero distinto alcance, la variable más local siempre oculta (es decir, tiene preferencia de acceso) a las variables menos locales. Así, si tiene también una variable a nivel de procedimiento llamada Temp, ensombrecería a la variable pública Temp de ese módulo.


Ensombrecer propiedades de formularios y controles

Debido al efecto de ensombrecimiento, las propiedades de formularios, controles, constantes y procedimientos se tratan como variables a nivel de módulo en el módulo de formulario. No es legal tener una propiedad de formulario o un control con el mismo nombre que una variable a nivel de módulo, constante, tipo definido por el usuario o procedimiento, ya que ambas tendrían el mismo alcance.

En el módulo de formulario, las variables locales con nombres iguales a controles del formulario ensombrecen a los controles. Debe calificar el control con una referencia al formulario o usar la palabra clave Me para establecer u obtener su valor o cualquiera de sus propiedades. Por ejemplo:

Private Sub Form_Click ()
Dim Text1, BackColor
' Se supone que también hay un control en el formulario que se
' llama Text1.
   Text1 = "Variable"   ' La variable ensombrece al control.
   Me.Text1 = "Control"   ' Debe calificar con Me para obtener
                        ' el control.
   Text1.Top = 0         ' Esto provoca un error
   Me.Text1.Top = 0      ' Debe calificar con Me para obtener
                        ' el control.
   BackColor = 0         ' La variable ensombrece a la propiedad.
   Me.BackColor = 0      ' Debe calificar con Me para obtener la
                        ' propiedad del formulario.
End Sub



Usar variables y procedimientos con el mismo nombre

Los nombres de las variables privadas y públicas a nivel de módulo también pueden entrar en conflicto con los nombres de los procedimientos. Una variable del módulo no puede tener el mismo nombre que los procedimientos o tipos definidos en el módulo. Sin embargo, pueden tener el mismo nombre que los procedimientos, tipos o variables públicos definidos en otros módulos. En este caso, cuando se tiene acceso a la variable desde otro módulo, debe calificarse con el nombre del módulo.

Aunque las reglas de ensombrecimiento descritas antes no son complejas, el ensombrecimiento puede confundir y conducir a errores sutiles en el código; en programación es conveniente asignar nombres distintos a las variables. En los módulos de formulario, procure usar nombres de variable que difieran de los nombres de los controles utilizados en esos formularios.

NekroByte

Constantes


A menudo verá que el código contiene valores constantes que reaparecen una y otra vez. O puede que el código dependa de ciertos números que resulten difíciles de recordar (números que, por sí mismos, no tienen un significado obvio).

En estos casos, puede mejorar mucho la legibilidad del código y facilitar su mantenimiento si utiliza constantes. Una constante es un nombre significativo que sustituye a un número o una cadena que no varía. Aunque una constante recuerda ligeramente a una variable, no puede modificar una constante o asignarle un valor nuevo como ocurre con una variable. Hay dos orígenes para las constantes:

  • Constantes intrínsecas o definidas por el sistema proporcionadas por aplicaciones y controles. Las constantes de Visual Basic se muestran en Visual Basic (VB) y Visual Basic para aplicaciones (VBA) y las bibliotecas de objetos en el Examinador de objetos. Otras aplicaciones que proporcionan bibliotecas de objetos, como Microsoft Excel y Microsoft Project, también proporcionan una lista de constantes que puede usar con sus objetos, métodos y propiedades. También se definen constantes en la biblioteca de objetos de cada control ActiveX.
  • Las constantes simbólicas o definidas por el usuario se declaran mediante la instrucción Const. Las constantes definidas por el usuario se describen en la próxima sección, "Crear sus propias constantes".

En Visual Basic, los nombres de constantes tienen un formato que combina mayúsculas y minúsculas, con un prefijo que indica la biblioteca de objetos que define la constante. Las constantes de las bibliotecas de objetos de Visual Basic y Visual Basic para aplicaciones tienen el prefijo "vb"; por ejemplo, vbTileHorizontal.

Se ha diseñado el sistema de prefijos para evitar colisiones accidentales en casos donde las constantes tienen nombres idénticos y representan valores diferentes. Incluso con prefijos, es posible que dos bibliotecas de objetos puedan contener constantes idénticas que representen valores diferentes. La constante a la que se hace referencia en cada caso depende de la biblioteca de objetos que tenga mayor prioridad.

Para estar totalmente seguro de evitar colisiones en los nombres de constantes, puede calificar las referencias a constantes con la sintaxis siguiente:

[nombreBiblioteca.][nombreMódulo.]nombreConstante

nombreBiblioteca suele ser el nombre de clase del control o la biblioteca, nombreMódulo es el nombre del módulo que define la constante y nombreConstante es el nombre de la constante. Cada uno de estos elementos se define en la biblioteca de objetos y se puede ver en el Examinador de objetos.


Crear constantes propias

La sintaxis para declarar una constante es la siguiente:

[Public|Private] Const nombreConstante[As tipo] = expresión

El argumento nombreConstante es un nombre simbólico válido (las reglas son las mismas que para crear nombres de variable) y expresión está compuesta por constantes y operadores de cadena o numéricos; sin embargo, no puede usar llamadas a funciones en expresión.

Una instrucción Const puede representar una cantidad matemática o de fecha y hora:

Const conPi = 3.14159265358979
Public Const conMaxPlanetas As Integer = 9
Const conFechaSalida = #1/1/95#


Se puede usar también la instrucción Const para definir constantes de cadena:

Public Const conVersion = "07.10.A"
Const conNombreClave = "Enigma"


Puede colocar más de una declaración de constante en una única línea si las separa con comas:

Public Const conPi = 3.14, conMaxPlanetas = 9, conPobMundial = 6E+09


A menudo, la expresión del lado derecho del signo igual ( = ) es un número o cadena literal, pero también puede ser una expresión que dé como resultado un número o una cadena (aunque la función no puede contener llamadas a funciones). Puede incluso definir constantes en términos de constantes previamente definidas:

Const conPi2 = conPi * 2


Una vez que defina las constantes, puede colocarlas en el código para hacerlo más legible. Por ejemplo:

Static SistemaSolar(1 To conMaxPlanetas)
If numPersonas > conPopMundial Then Exit Sub



Alcance de las constantes definidas por el usuario

Una instrucción Const tiene igual alcance que una declaración de variable y se le aplican las mismas reglas:

  • Para crear una constante que sólo exista en un procedimiento, declárela dentro del procedimiento.
  • Para crear una constante disponible para todos los procedimientos de un módulo, pero no para el código que está fuera del módulo, declárela en la sección Declaraciones del módulo.
  • Para crear una constante disponible en toda la aplicación, declare la constante en la sección Declaraciones de un módulo estándar y coloque delante de Const la palabra clave Public. No se pueden declarar las constantes públicas en un módulo de clase o de formulario.



Evitar referencias circulares

Como es posible definir constantes en términos de otras constantes, deberá tener cuidado para no establecer un ciclo o referencia circular entre dos o más constantes. Se produce un ciclo cuando se tienen dos o más constantes públicas, cada una de las cuales está definida en función de la otra.

Por ejemplo:

' En Module 1:
Public Const conA = conB * 2      ' Disponible en toda la
                                 ' aplicación.
' En Module 2:
Public Const conB = conA / 2      ' Disponible en toda la
                                 ' aplicación.


Si se produce un ciclo, Visual Basic generará un error cuando intente ejecutar la aplicación. No puede ejecutar el código hasta que resuelva la referencia circular. Para evitar la creación de un ciclo, restrinja todas las constantes públicas a un único módulo o, al menos, al menor número posible de módulos.

NekroByte

Tipos de Datos


Las variables son marcadores de posición que se utilizan para almacenar valores; tienen nombre y un tipo de dato. El tipo de dato de la variable determina cómo se almacenan los bits que representan esos valores en la memoria del equipo. Cuando declare una variable, también puede proporcionarle un tipo de dato. Todas las variables tienen un tipo de dato que determina la clase de datos que pueden almacenar.

De forma predeterminada, si no proporciona un tipo de dato, la variable toma el tipo de dato Variant. El tipo de dato Variant es como un camaleón; puede representar diferentes tipos de datos en distintas situaciones. No tiene que convertir estos tipos de datos cuando los asigne a una variable Variant: Visual Basic realiza automáticamente cualquier conversión necesaria.

Sin embargo, si sabe que una variable almacenará siempre un tipo de dato determinado, Visual Basic tratará de forma más eficiente los datos si declara la variable con ese tipo. Por ejemplo, se representa mejor una variable que va almacenar nombres de personas como el tipo de dato String, ya que un nombre está siempre compuesto de caracteres.

Los tipos de datos se aplican a otras cosas además de a las variables. Cuando asigna un valor a una propiedad, dicho valor tiene un tipo de dato; los argumentos de las funciones tienen también tipos de datos. De hecho, todo lo relacionado con datos en Visual Basic tiene un tipo de dato.

También puede declarar matrices de cualquiera de los tipos fundamentales.




Declarar variables con tipos de datos

Antes de usar una variable que no sea Variant debe usar las instrucciones Private, Public, Dim o Static para declararla As tipo. Por ejemplo, la siguiente instrucción declara un tipo Integer, Double, String y Currency, respectivamente:

Private I As Integer
Dim Cantidad As Double
Static SuNombre As String
Public PagadoPorJuan As Currency


La instrucción de declaración puede combinar varias declaraciones, como en las instrucciones siguientes:

Private I As Integer, Amt As Double
Private SuNombre As String, PagadoPorJuan As Currency
Private Prueba, Cantidad, J As Integer


Nota: Si no proporciona un tipo de dato, se asigna a la variable el tipo predeterminado. En el ejemplo anterior, las variables Prueba y Cantidad tienen un tipo de dato Variant. Esto puede sorprenderle si su experiencia con otros lenguajes de programación le lleva a esperar que todas las variables contenidas en la misma instrucción de declaración tengan el mismo tipo que ha especificado (en este caso, Integer).


Tipos de datos numéricos

Visual Basic proporciona varios tipos de datos numéricos: Integer, Long (entero largo), Single (signo flotante de simple precisión), Double (signo flotante de doble precisión) y Currency. Usar un tipo de dato numérico emplea normalmente menos espacio de almacenamiento que un tipo Variant.

Si sabe que una variable siempre va a almacenar números enteros (como 12) en vez de números fraccionarios (como 3,57), declárela como un tipo Integer o Long. Las operaciones con enteros son más rápidas y estos tipos consumen menos memoria que otros tipos de datos. Resultan especialmente útiles como variables de contador en bucles For...Next.


Si la variable contiene una fracción, declárela como variable Single, Double o Currency. El tipo de dato Currency acepta hasta cuatro dígitos a la derecha del separador decimal y hasta quince dígitos a la izquierda; es un tipo de dato de signo fijo adecuado para cálculos monetarios. Los números de signo flotante (Single y Double) tienen más intervalo que Currency, pero pueden estar sujetos a pequeños errores de redondeo.

Nota: Los valores de signo flotante se pueden expresar como mmmEeee o mmmDeee, donde mmm es la mantisa y eee el exponente (potencia de 10). El valor positivo más alto de un tipo de dato Single es 3,402823E+38 ó 3,4 veces 10 a la 38a potencia; el valor positivo más alto de un tipo de dato Double es 1,79769313486232D+308 o alrededor de 1,8 veces 10 a la 308a potencia. Si utiliza D para separar la mantisa y el exponente en un literal numérico, el valor se tratará como un tipo de dato Double. Igualmente, usar E de la misma manera hace que el valor se trate como un tipo de dato Single.


El tipo de dato Byte

Si la variable contiene datos binarios, declárela como matriz de tipo Byte. (Las matrices se describen en "Matrices", más adelante en este mismo capítulo). Usar variables Byte para almacenar datos binarios los preserva durante las conversiones de formato. Cuando se convierten las variables String entre los formatos ANSI y Unicode, los datos binarios de la variable resultan dañados. Visual Basic puede convertir automáticamente entre ANSI y Unicode al:

  • Leer archivos
  • Escribir archivos
  • Llamar a archivos DLL
  • Llamar a métodos y propiedades en objetos

Todos los operadores que funcionan con enteros funcionan con el tipo de dato Byte excepto el de resta unaria. Puesto que Byte es un tipo sin signo con el intervalo 0-255, no puede representar un valor negativo. Así, para la resta unaria, Visual Basic convierte antes el tipo Byte en un entero con signo.

Es posible asignar todas las variables numéricas entre sí y a variables del tipo Variant. Visual Basic redondea en vez de truncar la parte fraccionaria de un número de signo flotante antes de asignarlo a un entero.




El tipo de dato String

Si tiene una variable que siempre contendrá una cadena y nunca un valor numérico, puede declararla del tipo String:

Private S As String


Así podrá asignar cadenas a esta variable y manipularla mediante funciones de cadena:

S = "Base de datos"
S = Left(S, 4)


De forma predeterminada, una variable o argumento de cadena es una cadena de longitud variable; la cadena crece o disminuye según le asigne nuevos datos. También puede declarar cadenas de longitud fija. Especifique una cadena de longitud fija con esta sintaxis:

String * tamaño

Por ejemplo, para declarar una cadena que tiene siempre 50 caracteres de longitud, utilice un código como este:

Dim NombreEmp As String * 50


Si asigna una cadena con menos de 50 caracteres, NombreEmp se rellenará con espacios en blanco hasta el total de 50 caracteres. Si asigna una cadena demasiado larga a una cadena de longitud fija, Visual Basic simplemente truncará los caracteres.

Puesto que las cadenas de longitud fija se rellenan con espacios al final, verá que las funciones Trim y RTrim, que quitan los espacios en blanco, resultan muy útiles cuando se trabaja con ellas.

Las cadenas de longitud fija se pueden declarar en módulos estándar como Public o Private. En módulos de clase y formulario, las cadenas de longitud fija deben declararse como Private.




Intercambiar cadenas y números

Puede asignar una cadena a una variable numérica si la cadena representa un valor numérico. También es posible asignar un valor numérico a una variable de cadena. Por ejemplo, coloque un botón de comando, un cuadro de texto y un cuadro de lista en un formulario. Escriba el código siguiente en el evento Click del botón de comando. Ejecute la aplicación y haga clic en el botón de comando.

Private Sub Command1_Click()
   Dim intX As Integer
   Dim strY As String
   strY = "100.23"
   intX = strY               ' Pasa la cadena a una variable numérica.
   List1.AddItem Cos(strY)   ' Agrega el coseno del número de la
                           ' cadena al cuadro de lista.
   strY = Cos(strY)         ' Pasa el coseno a la variable de cadena.
   Text1.Text = strY         ' Se imprime la variable de cadena en el
                           ' cuadro de texto.
End Sub


Visual Basic convertirá automáticamente las variables al tipo de dato apropiado. Debe tener cuidado cuando intercambie números y cadenas, ya que pasar un valor no numérico a una cadena producirá un error de tiempo de ejecución.


El tipo de dato Boolean

Si tiene una variable que siempre contendrá solamente información del tipo verdadero y falso, sí y no o activado o desactivado, puede declararla del tipo Boolean. El valor predeterminado de Boolean es False. En el siguiente ejemplo, blnEjecutando es una variable Boolean que almacena un simple sí o no.

Dim blnEjecutando As Boolean
   ' Comprueba si la cinta está en marcha.
   If Recorder.Direction = 1 Then
   blnEjecutando = True
End if



El tipo de dato Date

Los valores de fecha y hora pueden almacenarse en el tipo de dato específico Date en variables Variant. En ambos tipos se aplican las mismas características generales a las fechas.


Cuando se convierten otros tipos de datos numéricos en Date, los valores que hay a la izquierda del signo decimal representan la información de fecha, mientras que los valores que hay a la derecha del signo decimal representan la hora. Medianoche es 0 y mediodía es 0.5. Los números enteros negativos representan fechas anteriores al 30 de diciembre de 1899.


El tipo de dato Object

Las variables Object se almacenan como direcciones de 32 bits (4 bytes) que hacen referencia a objetos dentro de una aplicación o de cualquier otra aplicación. Una variable declarada como Object es una variable que puede asignarse subsiguientemente (mediante la instrucción Set) para referirse a cualquier objeto real reconocido por la aplicación.

Dim objDb As Object
Set objDb = OpenDatabase("c:\Vb5\biblio.mdb")


Cuando declare variables de objeto, intente usar clases específicas (como TextBox en vez de Control o, en el caso anterior, Database en vez de Object) mejor que el tipo genérico Object. Visual Basic puede resolver referencias a las propiedades y métodos de objetos con tipos específicos antes de que ejecute una aplicación. Esto permite a la aplicación funcionar más rápido en tiempo de ejecución. En el Examinador de objetos se muestran las clases específicas.

Cuando trabaje con objetos de otras aplicaciones, en vez de usar Variant o el tipo genérico Object, declare los objetos como se muestran en la lista Clases en el Examinador de objetos. Esto asegura que Visual Basic reconozca el tipo específico de objeto al que está haciendo referencia, lo que permite resolver la referencia en tiempo de ejecución.




Convertir tipos de datos

Visual Basic proporciona varias funciones de conversión que puede usar para convertir valores en tipos de datos específicos. Por ejemplo, para convertir un valor a Currency, utilice la función CCur:

PagoPorSemana = CCur(horas * PagoPorHora)















Funciones de conversiónConvierten una expresión en
CboolBoolean
CbyteByte
CcurCurrency
CdateDate
CDblDouble
CintInteger
CLngLong
CSngSingle
CStrString
CvarVariant
CVErrError

Nota: Los valores que se pasan a una función de conversión deben ser válidos para el tipo de dato de destino o se producirá un error. Por ejemplo, si intenta convertir un tipo Long en un Integer, el tipo Long debe estar en el intervalo válido del tipo de dato Integer.

Para obtener más información   Busque las funciones específicas de conversión en la Referencia del lenguaje.


El tipo de dato Variant

Una variable Variant es capaz de almacenar todos los tipos de datos definidos en el sistema. No tiene que convertir entre esos tipos de datos si los asigna a una variable Variant; Visual Basic realiza automáticamente cualquier conversión necesaria. Por ejemplo:

Dim AlgúnValor      ' De forma predeterminada es un tipo Variant.
AlgúnValor = "17"   ' AlgúnValor contiene "17" (cadena de dos
                  ' caracteres).
AlgúnValor = AlgúnValor - 15    ' AlgúnValor ahora contiene
                                 ' el valor numérico 2.
AlgúnValor = "U" & AlgúnValor   ' AlgúnValor ahora contiene
                                 ' "U2" (una cadena de dos
                                 ' caracteres).


Si bien puede realizar operaciones con variables Variant sin saber exactamente el tipo de dato que contienen, hay algunas trampas que debe evitar.

  • Si realiza operaciones aritméticas o funciones sobre un Variant, el Variant debe contener un número.
  • Si está concatenando cadenas, utilice el operador & en vez del operador +. Para obtener más detalles, vea la sección "Cadenas almacenadas en tipos Variant" en "Temas avanzados sobre Variant".

Además de poder actuar como otros tipos de datos estándar, los Variant también pueden contener tres valores especiales: Empty, Null y Error.


El valor Empty

A veces necesitará saber si se ha asignado un valor a una variable existente. Una variable Variant tiene el valor Empty antes de asignarle un valor. El valor Empty es un valor especial distinto de 0, una cadena de longitud cero ("") o el valor Null. Puede probar el valor Empty con la función IsEmpty:

If IsEmpty(Z) Then Z = 0


Cuando un Variant contiene el valor Empty, puede usarlo en expresiones; se trata como un 0 o una cadena de longitud cero, dependiendo de la expresión.

El valor Empty desaparece tan pronto como se asigna cualquier valor (incluyendo 0, una cadena de longitud cero o Null) a una variable Variant. Puede establecer una variable Variant de nuevo como Empty si asigna la palabra clave Empty al Variant.


El valor Null

El tipo de dato Variant puede contener otro valor especial: Null. Null se utiliza comúnmente en aplicaciones de bases de datos para indicar datos desconocidos o que faltan. Debido a la forma en que se utiliza en las bases de datos, Null tiene algunas características únicas:

  • Las expresiones que utilizan Null dan como resultado siempre un Null. Así, se dice que Null se "propaga" a través de expresiones; si cualquier parte de la expresión da como resultado un Null, la expresión entera tiene el valor Null.
  • Al pasar un Null, un Variant que contenga un Null o una expresión que dé como resultado un Null como argumento de la mayoría de las funciones hace que la función devuelva un Null.
  • Los valores Null se propagan a través de funciones intrínsecas que devuelven tipos de datos Variant.

También puede asignar un Null mediante la palabra clave Null:

Z = Null


Puede usar la función IsNull para probar si una variable Variant contiene un Null:

If IsNull(X) And IsNull(Y) Then
   Z = Null
Else
   Z = 0
End If


Si asigna Null a una variable de un tipo que no sea Variant, se producirá un error interceptable. Asignar Null a una variable Variant no provoca ningún error y el Null se propagará a través de expresiones que contengan variables Variant (Null no se propaga a través de determinadas funciones). Puede devolver Null desde cualquier procedimiento Function con un valor de devolución de tipo Variant.

Null no se asigna a las variables a menos que se haga explícitamente, por lo que si no utiliza Null en su aplicación, no tendrá que escribir código que compruebe su existencia y lo trate.




El valor Error

En un Variant, Error es un valor especial que se utiliza para indicar que se ha producido una condición de error en un procedimiento. Sin embargo, a diferencia de otros tipos de error, no se produce el tratamiento de errores a nivel normal de aplicación. Esto le permite a usted o a la propia aplicación elegir alternativas basadas en el valor del error. Los valores de error se crean convirtiendo números reales en valores de error mediante la función CVErr.

NekroByte

Temas avanzados sobre el Tipo de Dato Variant


Representación interna de los valores en los tipos Variant

Las variables Variant mantienen una representación interna de los valores que pueden almacenar. Esta representación determina cómo trata Visual Basic esos valores cuando realiza comparaciones y otras operaciones. Cuando asigna un valor a una variable Variant, Visual Basic utiliza la representación más compacta que graba el valor de forma más fiable. Las operaciones posteriores pueden hacer que Visual Basic cambie la representación si está utilizando una variable determinada. (Una variable Variant no es una variable sin tipo, sino una variable que puede cambiar libremente de tipo.) Estas representaciones internas corresponden a los tipos de datos explícitos mostrados en "Tipos de datos" anteriormente en este capítulo.

Nota   Un tipo Variant siempre ocupa 16 bytes, independientemente de lo que almacene en él. Los objetos, las cadenas y las matrices no se almacenan físicamente en el Variant; en estos casos, cuatro bytes del Variant se utilizan para almacenar una referencia de objeto, o un puntero a la cadena o a la matriz. Los datos reales se almacenan en otro lugar.

La mayoría de las veces no le importará la representación interna que Visual Basic esté utilizando para una variable en particular; Visual Basic trata las conversiones automáticamente. Sin embargo, si desea saber qué valor está utilizando Visual Basic, puede emplear la función VarType.

Por ejemplo, si almacena valores con fracciones decimales en una variable Variant, Visual Basic utiliza siempre la representación interna Double. Si sabe que su aplicación no necesita la máxima precisión (y menor velocidad) que proporciona el valor Double, puede acelerar los cálculos si convierte los valores a Single e incluso a Currency:

If VarType(X) = 5 Then X = CSng(X)   ' Convierte a Single.


En una variable de matriz, el valor de VarType es la suma de la matriz y los valores devueltos del tipo de dato. Por ejemplo, esta cadena contiene valores Double:

Private Sub Form_Click()
   Dim dblEjemplo(2) As Double
   MsgBox VarType(dblEjemplo)
End Sub


Las versiones futuras de Visual Basic podrán agregar representaciones adicionales de los tipos Variant, por lo que el código que escriba que tome decisiones basadas en el valor devuelto de la función VarType podría devolver un valor que no se ha definido.

Para obtener más información acerca de las matrices, vea "Matrices" más adelante en este mismo capítulo. Para obtener más detalles acerca de la conversión de tipos de datos, vea "Tipos de datos" anteriormente en este mismo capítulo.


Valores numéricos almacenados en tipos Variant

Cuando almacena números enteros en variables Variant, Visual Basic utiliza la representación más compacta posible. Por ejemplo, si almacena un número pequeño sin fracción decimal, el Variant utiliza una representación Integer para el valor. Si asigna un número mayor, Visual Basic usará un valor Long o, si es muy largo o tiene un componente decimal, un valor Double.

A veces querrá usar una representación específica para un número. Por ejemplo, deseará tener una variable Variant para almacenar un valor numérico como Currency y evitar errores de redondeo en cálculos posteriores. Visual Basic proporciona varias funciones de conversión que puede usar para convertir valores en un tipo específico (vea "Convertir tipos de datos" anteriormente en este mismo capítulo). Por ejemplo, para convertir un valor a Currency, utilice la función CCur:

PagoPorSemana = CCur(horas * pagoPorHora)


Se producirá un error si intenta realizar una operación o función matemática sobre un tipo Variant que no contiene un número o algo que se pueda interpretar como un número. Por ejemplo, no puede realizar operaciones aritméticas sobre el valor U2 aunque contenga un carácter numérico, ya que todo el valor no es un número válido. De la misma manera, no puede realizar cálculos sobre el valor 1040EZ; sin embargo, puede realizar cálculos sobre los valores +10 ó -1,7E6 porque son números válidos. Por esta razón, a menudo deseará determinar si una variable Variant contiene un valor que se pueda usar como un número. La función IsNumeric realiza esta tarea:

Do
   cualquierNúmero = InputBox("Escriba un número")
Loop Until IsNumeric(cualquierNúmero)
MsgBox "La raíz cuadrada es: " & Sqr(cualquierNúmero)


Cuando Visual Basic convierte una representación que no es numérica (como una cadena que contenga un número) a un valor numérico, utiliza la configuración regional (especificada en el Panel de control de Windows) para interpretar el separador de miles, el separador decimal y el símbolo de moneda.

Así, si la configuración regional del Panel de control de Windows está establecida como Estados Unidos, Canadá o Australia, estas dos instrucciones devolverían "verdadero":

IsNumeric("$100")
IsNumeric("1,560.50")


Mientras que estas dos instrucciones devolverían "falso":

IsNumeric("DM100")
IsNumeric("1.560,50")


Sin embargo, podría resultar cierto lo contrario: las dos primeras devolverían falso y las segundas verdadero si la configuración regional del Panel de control de Windows fuera para Alemania.

Si asigna un Variant que contiene un número a una variable de cadena o a una propiedad, Visual Basic convierte automáticamente la representación del número a una cadena. Si desea convertir explícitamente un número a una cadena, utilice la función CStr. También puede usar la función Format para convertir un número a una cadena que incluya formato como los símbolos de moneda, separador de miles y separador decimal. La función Format utiliza automáticamente los símbolos adecuados de acuerdo con el cuadro de diálogo Configuración regional del Panel de control de Windows.




Cadenas almacenadas en tipos Variant

Generalmente, almacenar y usar cadenas en variables Variant plantea pocos problemas. Sin embargo, como se mencionó anteriormente, algunas veces el resultado del operador + puede resultar ambiguo cuando se utiliza con dos valores Variant. Si ambas variables de tipo Variant contienen números, el operador + realizará una suma. Si ambas contienen cadenas, el operador + realizará una concatenación de cadenas. Pero si uno de los valores se representa como numérico y el otro como cadena, la situación es más complicada. Visual Basic intenta primero convertir la cadena en un número. Si la conversión funciona, el operador + suma los dos valores pero, si falla, genera el error El tipo no coincide.

Para asegurarse de que se produce la concatenación, sin tener en cuenta la representación del valor de las variables, utilice el operador &. Por ejemplo, el siguiente código:

Sub Form_Click ()
   Dim X, Y
   X = "6"
   Y = "7"
   Print X + Y, X & Y
   X = 6
   Print X + Y, X & Y
End Sub


produce este resultado en el formulario:

67      67
13      67




Valores de fecha y hora almacenados en tipos Variant

Las variables Variant también pueden contener valores de fecha y hora. Algunas funciones devuelven valores de fecha y hora. Por ejemplo, DateSerial devuelve el número de días que quedan del año:

Private Sub Form_Click ()
   Dim ahora, días, horas, minutos
   ahora = Now   ' Now devuelve la fecha y la hora actuales.
   días = Int(DateSerial(Year(ahora) + 1, 1, 1) - ahora)
   horas = 24 - Hour(ahora)
   minutos = 60 - Minute(ahora)
   Print "Quedan " &días & "&días en el año."
   Print "Quedan " &horas & "&horas en el día."
   Print "Quedan " &minutos & "&minutos en la hora."
End Sub


También puede realizar operaciones matemáticas sobre valores de fecha y hora. Sumar o restar enteros agrega o resta días; sumar o restar fracciones agrega o resta horas. Por tanto, al sumar 20 se agregan 20 días, mientras que al restar 1/24 se resta una hora.

El intervalo para las fechas almacenadas en variables Variant es 1 de enero de 0100 a 31 de diciembre de 9999. Sin embargo, los cálculos sobre fechas no tienen en cuenta las revisiones del calendario antes del calendario gregoriano, por lo que los cálculos que dan como resultado valores de fechas anteriores al año en que se adoptó el calendario gregoriano (1752 en Gran Bretaña y sus colonias en aquella época, y antes o más tarde en otros países) no serán correctas.

Puede usar en el código literales de fecha y hora si los escribe entre signos de número (#), de la misma forma que pone literales de cadena entre comillas (""). Por ejemplo, puede comparar un Variant que contenga un valor de fecha y hora con una fecha literal:

If AlgunaFecha > #3/6/93# Then


De forma similar, puede comparar un valor de fecha y hora con un literal completo de fecha y hora:

If AlgunaFecha > #3/6/93 1:20pm# Then


Si no incluye una hora en el literal de fecha y hora, Visual Basic establece la parte horaria del valor como medianoche (el inicio del día). Si no incluye una fecha en un literal de fecha y hora, Visual Basic establece la parte de fecha del valor como 30 de diciembre de 1899.

Visual Basic acepta una amplia variedad de formatos de fecha y hora en literales. Estos son todos los valores válidos de fecha y hora:

AlgunaFecha = #3-6-93 13:20#
AlgunaFecha = #Marzo 27, 1993 1:20am#
AlgunaFecha = #Abr-2-93#
AlgunaFecha = #4 Abril 1993#



De la misma forma que puede usar la función IsNumeric para averiguar si una variable Variant contiene un valor que se pueda considerar como valor numérico válido, puede usar la función IsDate para averiguar si una variable Variant contiene un valor que se pueda considerar como valor válido de fecha y hora. Puede entonces usar la función CDate para convertir el valor en un valor de fecha y hora.

Por ejemplo, el código siguiente prueba la propiedad Text de un cuadro de texto mediante IsDate. Si la propiedad contiene texto que pueda considerarse una fecha válida, Visual Basic convierte el texto en una fecha y calcula los días que faltan hasta final de año:

Dim AlgunaFecha, días
If IsDate(Text1.Text) Then
   AlgunaFecha = CDate(Text1.Text)
   días = DateSerial(Year(AlgunaFecha) + 1, 1, 1) - AlgunaFecha
   Text2.Text = "Quedan " días & "días en el año."
Else
   MsgBox Text1.Text & " no es una fecha válida."
End If





Objetos almacenados en tipos Variant

Es posible almacenar objetos en variables Variant. Esto puede resultar muy útil cuando necesite tratar elegantemente gran variedad de tipos de datos, incluyendo objetos. Por ejemplo, todos los elementos de una matriz deben tener el mismo tipo de dato. Establecer el tipo de dato de una matriz como Variant le permite almacenar objetos junto con otros tipos de datos en una matriz.

NekroByte

Matrices


Si ha programado en otros lenguajes, probablemente ya conocerá el concepto de matrices. Las matrices le permiten hacer referencia por el mismo nombre a una serie de variables y usar un número (índice) para distinguirlas. Esto le ayuda a crear código más pequeño y simple en muchas situaciones, ya que puede establecer bucles que traten de forma eficiente cualquier número de casos mediante el número del índice. Las matrices tienen un límite superior e inferior y los elementos de la matriz son contiguos dentro de esos límites. Puesto que Visual Basic asigna espacio para cada número de índice, evite declarar las matrices más grandes de lo necesario.

Nota: Las matrices mostradas en esta sección son matrices de variables, declaradas en el código. Son distintas de las matrices de controles que se especifica al establecer la propiedad Index de los controles en tiempo de diseño. Las matrices de variables siempre son contiguas; a diferencia de las matrices de controles, no puede cargar y descargar elementos de la mitad de la matriz.

Todos los elementos de una matriz tienen el mismo tipo de datos. Por supuesto, cuando el tipo de dato es Variant, los elementos individuales pueden contener distintas clases de datos (objetos, cadenas, números, etc.). Puede declarar una matriz de cualquiera de los tipos de datos fundamentales, incluyendo los tipos definidos por el usuario (descritos en la sección "Creación de sus propios tipos de datos", en "Más acerca de la programación ") y variables de objetos (descritas en "Programación con objetos").

En Visual Basic hay dos tipos de matrices: las matrices de tamaño fijo que tienen siempre el mismo tamaño y las matrices dinámicas cuyo tamaño cambia en tiempo de ejecución. Las matrices dinámicas se describen con más detalle en la sección "Matrices dinámicas", más adelante en este mismo capítulo.


Declarar matrices de tamaño fijo

Hay tres formas de declarar una matriz de tamaño fijo, dependiendo del alcance que desee que tenga la matriz:

  • Para declarar una matriz pública, utilice la instrucción Public en la sección Declaraciones de un módulo para declarar la matriz.
  • Para crear una matriz a nivel de módulo, utilice la instrucción Private en la sección Declaraciones de un módulo para declarar la matriz.
  • Para crear una matriz local, utilice la instrucción Private en un procedimiento para declarar la matriz.


Establecer los límites superior e inferior

Cuando declare una matriz, ponga a continuación del nombre de la matriz el límite superior entre paréntesis. El límite superior no puede exceder el intervalo de un tipo de dato Long (-2.147.483.648 a 2.147.483.647). Por ejemplo, estas declaraciones de matrices pueden aparecer en la sección Declaraciones de un módulo:

Dim Contadores(14) As Integer   ' 15 elementos.
Dim Sumas(20) As Double            ' 21 elementos.


Para crear una matriz pública, simplemente utilice Public en lugar de Dim:

Public Contadores(14) As Integer
Public Sumas(20) As Double


Las mismas declaraciones dentro de un procedimiento utilizan Dim:

Dim Contadores(14) As Integer
Dim Sumas(20) As Double


La primera declaración crea una matriz de 15 elementos, con números de índice que van de 0 a 14. La segunda crea una matriz de 21 elementos, con números de índice que van de 0 a 20. El límite inferior predeterminado es 0.

Para especificar el límite inferior, proporciónelo explícitamente (como tipo de dato Long) mediante la palabra clave To:

Dim Contadores(1 To 15) As Integer
Dim Sumas(100 To 120) As String


En las anteriores declaraciones, los números de índice de Contadores van de 1 a 15 y los números de índice de Sumas van de 100 a 120.


Matrices que contienen otras matrices

Es posible crear una matriz Variant y llenarla con otras matrices de distintos tipos de datos. El código siguiente crea dos matrices, una que contiene enteros y otra que contiene cadenas. Se declara entonces una tercera matriz Variant y se llena con las matrices de enteros y cadenas.

Private Sub Command1_Click()
   Dim intX As Integer   ' Declara la variable de contador.
   ' Declara y llena una matriz de enteros.
   Dim contadoresA(5) As Integer
      For intX = 0 To 4
         contadoresA(intX) = 5
      Next intX
   ' Declara y llena una matriz de cadenas.
      Dim contadoresB(5) As String
         For intX = 0 To 4
            contadoresB(intX) = "adiós"
         Next intX
   Dim arrX(2) As Variant         ' Declara una matriz nueva de dos
                                 ' miembros.
      arrX(1) = contadoresA()   ' Llena la matriz con las otras
                                 ' matrices.
      arrX(2) = contadoresB()
      MsgBox arrX(1)(2)            ' Muestra un miembro de cada
                                 ' matriz.
      MsgBox arrX(2)(3)
End Sub



Matrices multidimensionales

A veces necesitará hacer un seguimiento de la información relacionada de una matriz. Por ejemplo, para hacer un seguimiento de cada píxel de la pantalla del equipo, necesitará referirse a sus coordenadas X e Y. Esto se puede hacer mediante una matriz multidimensional para almacenar los valores.

En Visual Basic puede declarar matrices de varias dimensiones. Por ejemplo, la instrucción siguiente declara una matriz bidimensional de 10 por -10 en un procedimiento:

Static MatrizA(9, 9) As Double


Se puede declarar una o ambas dimensiones con límites inferiores explícitos:

Static MatrizA(1 To 10, 1 To 10) As Double


Puede hacer que tenga más de dos dimensiones. Por ejemplo:

Dim MultiD(3, 1 To 10, 1 To 15)


Esta declaración crea una matriz que tiene tres dimensiones con tamaños de 4 por 10 por 15. El número total de elementos es el producto de las tres dimensiones, es decir, 600.

Nota: Cuando comience a agregar dimensiones a una matriz, el almacenamiento total que necesita la matriz se incrementa considerablemente, por lo que debe usar las matrices multidimensionales con sumo cuidado. Tenga especial cuidado con las matrices Variant, ya que son más grandes que otros tipos de datos.


Usar bucles para manipular matrices

Puede procesar eficientemente una matriz multidimensional mediante bucles For anidados. Por ejemplo, estas instrucciones inicializan cada elemento de MatrizA a un valor basándose en su ubicación en la matriz:

Dim I As Integer, J As Integer
Static MatrizA(1 To 10, 1 To 10) As Double
For I = 1 To 10
   For J = 1 To 10
      MatrizA(I, J) = I * 10 + J
   Next J
Next I

NekroByte

#9
Matrices dinámicas


A veces necesitará saber exactamente lo grande que debe ser una matriz. Puede que desee poder cambiar el tamaño de la matriz en tiempo de ejecución.

Una matriz dinámica se puede cambiar de tamaño en cualquier momento. Las matrices dinámicas son una de las características más flexibles y cómodas de Visual Basic, y le ayudan a administrar de forma eficiente la memoria. Por ejemplo, puede usar una matriz grande durante un tiempo corto y liberar memoria del sistema cuando no necesite volver a usar la matriz.

La alternativa consiste en declarar la matriz con el mayor tamaño posible y pasar por alto los elementos de la matriz que no necesite. Sin embargo, esta solución, si se utiliza demasiado, puede hacer que el sistema operativo funcione con muy poca memoria.

Para crear una matriz dinámica

    Declare la matriz con la instrucción
Public (si desea que la matriz sea pública), la instrucción Dim a nivel de módulo (si desea que sea una matriz a nivel de módulo), o con la instrucción Static o Dim en un procedimiento (si desea que la matriz sea local). Declare la matriz como dinámica proporcionándole una lista de dimensiones vacía.

Dim MatrizDyn()

Asigne el número real de elementos con la instrucción ReDim.

ReDim MatrizDyn(X + 1)[/list]

La instrucción ReDim puede aparecer sola en un procedimiento. A diferencia de las instrucciones Dim y Static, ReDim es una instrucción ejecutable; hace que la aplicación realice una acción en tiempo de ejecución.

La instrucción ReDim acepta la misma sintaxis que se utiliza en las matrices fijas. Cada ReDim puede cambiar el número de elementos, así como los límites inferior y superior de cada dimensión. Sin embargo, no se puede cambiar el número de dimensiones de la matriz.

ReDim MatrizDyn(4 to 12)

Por ejemplo, la matriz dinámica Matriz1 se crea declarándola primero a nivel de módulo:

Dim Matriz1() As Integer

Luego, un procedimiento asigna el espacio de la matriz:

Sub CalcValoresAhora ()
   .
   .
   .
   ReDim Matriz1(19, 29)
End Sub


La instrucción ReDim mostrada aquí asigna una matriz de 20 por 30 enteros (con un tamaño total de 600 elementos). Como alternativa, se pueden establecer los límites de una matriz dinámica mediante variables:

ReDim Matriz1(X, Y)


Nota  Puede asignar cadenas a matrices redimensionables de bytes. Una matriz de bytes también se puede asignar a una cadena de longitud fija. Tenga cuidado en que el número de bytes de una cadena es diferente según las plataformas. En plataformas Unicode la misma cadena contiene el doble de bytes que los que contiene una plataforma no Unicode.


Preservar el contenido de las matrices dinámicas

Cada vez que ejecute la instrucción ReDim perderá todos los valores almacenados en ese momento en la matriz. Visual Basic restablece los valores al valor Empty (en matrices Variant), a cero (en matrices numéricas), a una cadena de longitud cero (en matrices de cadenas) o a Nothing (en matrices de objetos).

Esto resulta muy útil cuando desee preparar la matriz para contener datos nuevos o cuando desee reducir el tamaño de la matriz para que ocupe menos memoria. Puede que a veces desee cambiar el tamaño de la matriz sin perder los datos de la misma. Para ello puede usar ReDim con la palabra clave Preserve. Por ejemplo, puede ampliar una matriz en un elemento sin perder los valores de los elementos existentes mediante la función UBound para hacer referencia al límite superior:

ReDim Preserve MatrizDyn(UBound(MatrizDyn) + 1)


Sólo se puede cambiar el límite superior de la última dimensión de una matriz multidimensional cuando se utiliza la palabra clave Preserve; si cambia alguna otra dimensión o el límite inferior de la última dimensión, se producirá un error en tiempo de ejecución. Así pues, puede usar un código como el siguiente:

ReDim Preserve Matriz(10, UBound(Matriz, 2) + 1)


Pero no puede usar este código:

ReDim Preserve Matriz(UBound(Matriz, 1) + 1, 10)


|