viernes, 12 de diciembre de 2008

Administrando bases de datos en Excel Parte I. Cargando la información y moviéndose en el registro.

Muchos son los que usan Excel para registrar información en forma de Base de Datos (B. D.), siendo en potencia una hoja de cálculo. Cuando se crea un archivo en Excel, por defecto se almacena como un libro el cual tiene hojas que a su vez contiene filas y columnas. Podemos usar el libro como una B. D. asumiendo cada hoja como una tabla(informaci{on de una BD que posee características en común). Por ejemplo, si se quiere administrar una B. D. de un colegio, la información general del estudiante se puede almacenar en la Hoja2 (se puede cambiar su nombre por Estudiantes, pero a la hora de programar seguira siendo Hoja2 como objeto), bajo los nombres de columna: Codigo, Grado, PrimerApellido, SegundoApellido, PrimerNombre, SegundoNombre,FechaNacimiento, Genero... (Se acostumbra a escribir los nombres de estos campos sin espacios y sin caracteres especiales para evitar conflictos en sentencias de consulta Sql). La Hoja1 se deja para incrustar botones que se muestran en las herramientas de VisualBasic (VB), recomiendo que se cambie su nombre por Principal. Grabar el archivo con el nombre ColegioPrueba.xls. Esta inducción esta bajo Office 2003.

Ingresar la información resulta fácil cuando se trata de una sola tabla, en este caso Estudiantes, pero las herramientas de programación de VB como macros resultan poderosas a la hora de establecer relaciones con otras tablas como Notas del estudiante y Logros del estudiante, entre otras.

Creando el formulario.

Una manera agradable de almacenar registros en la tabla estudiantes es creando un formulario. Para esto, en la hoja1 se debe incrustar un boton que aparece en las herramientas de VB (Ver-Barra de Herramientas-VisualBasic y seleccionar Cuadro de Controles y luego Boton de Comando) Aparecera el objeto CommandButton1. Este objeto tiene unas propiedades, entre ellas se deben cambiar Name (Nombre) y Caption (Titulo). En el cuadro de controles seleccionar Propiedades (icono en forma de reglita), aparecera una ventana con las propiedades del objeto. Cambie el Name CommandButton1 por BotonEstudiantes (sin espacios) y el Caption por Estudiantes. Seguidamente dar doble click al boton para que aparezca el código en VB.

Private Sub CommandButton1_Click()

End Sub

Estando allí se puede observar, en la izquierda, la ventana de Proyecto (VBProject) y Propiedades del proyecto. En la barra superior de Herramientas aparece el icono de Crear formulario (Insertar UserForm1) Dar click.
Aparecera el formulario, la ventana de Proyecto con los objetos Hoja1,Hoja2,Hoja3 y This WorkBook y la ventana de propiedades (de no estar, hacer click en el icono de propiedades "la manito") En la ventana de propiedades del formulario (UserForm1) cambiar el nombre (name) por FormEstudiantes (Acostumbre a unir las palabras Form y Estudiantes, en este caso, y usar sus iniciales en mayúscula, pues así lo hace el código de VB) y cambie Caption por Datos del estudiante. El formulario es una interfaz que permitira cargar los datos de la hoja Estudiantes de manera organizada con el propósito de facilitar su manipulación (Consultar, borrar, modificar, entre otros).

Cuando se entra a Diseñar un formulario se debe tener clara su estructura: los campos, la barra de mover registros y los botones de operacion con registros. Estos grupos de objetos se pueden encerrar en Frames (recuadros)

Para visualizar los campos, se crean Labels (etiquetas) y TextBox (Cuadros de texto). El label tiene el nombre del campo y en el cuadro de texto se visualiza la el contenido del campo y en tal caso se ingresa su contenido.

Para los campos: Codigo, Grado, PrimerApellido,... se debe crear el Frame1. Cambiar su Caption por Datos. Dentro de este dframe se deben incrustar los label de los campos de la tabla Estudiantes con sus respectivos textbox. Al label1 cambiar su caption por Codigo (Esta es la clave principal, pues el código es un dato que no se repite, que no permite duplicados, es lo que hace un registro diferente de otro), al label2 por Grado y así con el resto. Cerciórese de que los textbox queden ordenados del 1 al 8. Cabe aclarar que el textbox de fecha se pude cambiar por un DtPicker (herramienta de fecha) el textbox de genero se pueden cambiar por un ComboBox o listBox (Cuadro combinado o Cuadro de lista, pues se debe escoger entre M para masculino y F para femenino ) Por ahora todos serán TextBox.





Diseñando la barra de Mover Registro.

Ahora se deben crear cuatro botones en el frame2 (Mover Registro) y un textBox (que será el 9) y organizarlos como se muestra.










Al CommandButton1 cambiar su name por BotonInicio y su caption por < ; al 2 cambiar su name por BotonAtras y su caption por < ; al 3 cambiar su name por BotonAdelante y su caption por >;
al 4 cambiar su name por BotonFinal y su caption por > y al combobox10 cambiar su name por TextBoxBarraRegistro.

Ingresando el código de VB para el boton Inicio.
Haga doble click en el boton inicio, apareceran la líneas

Private Sub BotonInicio_Click()

End Sub

En medio de ellas copie y pegue el siguiente código:
Nota: para evitar ver todos los procedimientos, active el boton Ver Procedimiento que está en la parte izquiera de la barra horizontal de la ventana de código.


Registro = 1
'carga el codigo en el cuadro de texto 1 que está en la hoja2 (Estudiantes)
Me.TextBox1.Text = Hoja2.Cells(Registro + 1, 1)
'carga el grado
Me.TextBox2.Text = Hoja2.Cells(Registro + 1, 2)
'carga los apellidos
Me.TextBox3.Text = Hoja2.Cells(Registro + 1, 3)
Me.TextBox4.Text = Hoja2.Cells(Registro + 1, 4)
'carga los nombres
Me.TextBox5.Text = Hoja2.Cells(Registro + 1, 5)
Me.TextBox6.Text = Hoja2.Cells(Registro + 1, 6)
'carga fecha nacimientoMe.TextBox7.Text = Hoja2.Cells(Registro + 1, 7)
'carga género
Me.TextBox8.Text = Hoja2.Cells(Registro + 1, 8)
'Pone el registro actual sobre el total de registros si está en el primero
'y hay 4 muestra 1/4 Cambielo a su antojo
Me.TextBoxBarraRegistro.Text = Registro & "/" & CanRegistros


La variable Registro y CanRegistros son de tipo global, quiere decir que sus valores se mantienen mientras el formulario está cargado, a diferencia de las locales declaradas con Dim que su valor se pierde cuando el objeto donde fueron declaradas pierde el enfoque, es decir cuando se pasa a otro objeto dentro del formulario. Para declararlas haga doble click en el objeto FormEstudiantes y luego doble click en el fondo del formulario o en cualquier objeto dentro de el, seleccione ahora en el cuadro de lista de la ventana del código la opción General y alli pegue el siguiente código


Public Registro, CanRegistros As Long


Debemos recordar que al cargarse el formulario (evento Activate) se debe mostrar el contenido del primer registro, para esto, pegue el siguiente código en el evento Activate del formulario:


Dim FilaEst As Long 'Creando la variable que contara los registros como entero largo
'Bucle para contar la cantidad de registros que hay en la hoja2 Estudiantes
FilaEst = 2 'Inicia en la fila 2 ya que la 1 tiene los nombres de campos
Do While Hoja2.Cells(FilaEst, 1) <> "" 'Hace mientras la fila sea diferente de vacio
FilaEst = FilaEst + 1 'aumenta la fila de uno en uno para pasar a la siguiente
Loop 'fin del do salto
CanRegistros = FilaEst - 2 'asigna el valor de filaest a canregistros
Registro = 1 'pone el registro en el primero cuando se carga el formulario
Me.Frame1.Enabled = False 'desactiva el recuadro de datos


'carga el codigo en el cuadro de texto 1 que está en la hoja2 (Estudiantes)
Me.TextBox1.Text = Hoja2.Cells(Registro + 1, 1) 'carga el grado
Me.TextBox2.Text = Hoja2.Cells(Registro + 1, 2) 'carga los apellidos
Me.TextBox3.Text = Hoja2.Cells(Registro + 1, 3)
Me.TextBox4.Text = Hoja2.Cells(Registro + 1, 4) 'carga los nombres
Me.TextBox5.Text = Hoja2.Cells(Registro + 1, 5)
Me.TextBox6.Text = Hoja2.Cells(Registro + 1, 6) 'carga fecha nacimiento
Me.TextBox7.Text = Hoja2.Cells(Registro + 1, 7) 'carga género
Me.TextBox8.Text = Hoja2.Cells(Registro + 1, 8)
If CanRegistros = 1 Then ' si no hay registro muestra 0/0 en barraregistro
Registro = 0
CanRegistros = 0
Me.Frame2.Enabled = False 'desactiva el recuadro de mover registro
'cuando no hay registros
Else
Me.Frame2.Enabled = True 'activa el recuadro de mover registros
'cuando hay uno o mas registros.
End If
' pone el registro actual sobre la cantidad de registros
Me.TextBoxBarraRegistro.Text = Registro & "/" & CanRegistros



Nota: Cabe notar que la carga de los registros en los textbox se hace mediante un código que se repite en los cuatro botones (texto en rojo), este código se puede poner en un sólo proceso e invocarlo. Para esto se escribe la sentencia sub CargaDatos al final del codigo del formulario, y se ingresa alli el texto necesario para que se ejecute. Por ahora no se hara, para que sea mas claro.

Código para BotonAtras (recuerde que no lleva tilde)

Registro = Registro - 1
If Registro <= 0 Then Registro = 1 'carga el codigo en el cuadro de texto 1 que está en la hoja2 (Estudiantes)
Me.TextBox1.Text = Hoja2.Cells(Registro + 1, 1)
'carga el grado
Me.TextBox2.Text = Hoja2.Cells(Registro + 1, 2) 'carga los apellidos
Me.TextBox3.Text = Hoja2.Cells(Registro + 1, 3)
Me.TextBox4.Text = Hoja2.Cells(Registro + 1, 4)
'carga los nombres
Me.TextBox5.Text = Hoja2.Cells(Registro + 1, 5)
Me.TextBox6.Text = Hoja2.Cells(Registro + 1, 6)
'carga fecha nacimiento
Me.TextBox7.Text = Hoja2.Cells(Registro + 1, 7)
'carga género
Me.TextBox8.Text = Hoja2.Cells(Registro + 1, 8)
Me.TextBoxBarraRegistro.Text = Registro & "/" & CanRegistros


Código para BotonAdelante

Registro = Registro + 1
If Registro > CanRegistros Then Registro = CanRegistros
'carga el codigo en el cuadro de texto 1 que está en la hoja2 (Estudiantes)
Me.TextBox1.Text = Hoja2.Cells(Registro + 1, 1)
'carga el grado
Me.TextBox2.Text = Hoja2.Cells(Registro + 1, 2) 'carga los apellidos
Me.TextBox3.Text = Hoja2.Cells(Registro + 1, 3)
Me.TextBox4.Text = Hoja2.Cells(Registro + 1, 4)
'carga los nombres
Me.TextBox5.Text = Hoja2.Cells(Registro + 1, 5)
Me.TextBox6.Text = Hoja2.Cells(Registro + 1, 6)
'carga fecha nacimiento
Me.TextBox7.Text = Hoja2.Cells(Registro + 1, 7)
'carga género
Me.TextBox8.Text = Hoja2.Cells(Registro + 1, 8)
Me.TextBoxBarraRegistro.Text = Registro & "/" & CanRegistros

Código para BotonFinal

Registro = CanRegistros
'carga el codigo en el cuadro de texto 1 que está en la hoja2 (Estudiantes)
Me.TextBox1.Text = Hoja2.Cells(Registro + 1, 1)
'carga el grado
Me.TextBox2.Text = Hoja2.Cells(Registro + 1, 2) 'carga los apellidos
Me.TextBox3.Text = Hoja2.Cells(Registro + 1, 3)
Me.TextBox4.Text = Hoja2.Cells(Registro + 1, 4)
'carga los nombres
Me.TextBox5.Text = Hoja2.Cells(Registro + 1, 5)
Me.TextBox6.Text = Hoja2.Cells(Registro + 1, 6)
'carga fecha nacimiento
Me.TextBox7.Text = Hoja2.Cells(Registro + 1, 7)
'carga género
Me.TextBox8.Text = Hoja2.Cells(Registro + 1, 8)
Me.TextBoxBarraRegistro.Text = Registro & "/" & CanRegistros

Para ejecutar el formulario es necesario ir a la hoja principal y en modo diseño dar dobleclick al boton estudiantes, ali en el BotonEstudiantes ingresar el siguiente código

me.FormEstudiantes.show

luego ir al frame de acciones (Frame 3), alli incrustar un boton de Name BotonSalir y caption Salir, en su interior digitar

Unload me

Luego vaya otra vez a la hojo1 o Principal, salga de modo de diseño (reglita) y presione el boton estudiantes. Pruebe todos los botones. en caso de error, por cuestionde copie y pegue, revise bien el texto pegado, pues ha sido del original del programa macro que tengo. De no correr el formulario escribame a camaos2004@hotmail.com Algunos comentarios se hacen con comilla símple y no hacen parte del código (A esto se le denomina documentación) RECUERDE INGRESAR POR LO MENOS CINCO REGISTROS DE MANERA MANUAL (directamente en excel) PARA QUE EXPERIMENTE EL MOVIMIENTO DEL REGISTRO.

No hay comentarios:

Datos personales