068-070 21/11/02 23:53 Página 1 PROGRAMACIÓN MACROS EXCEL Controles y formularios en las hojas de cálculo Félix Alberto Jiménez curro@bpe.es Como lenguaje de programación visual que es, Visual Basic nos va a permitir insertar controles y formularios en las hojas de cálculo para hacer visualmente más atractivas nuestras macros. N PASO 3 adie discutirá que, por muy eficaz que sea, todo programa resulta muchísimo más atractivo con un buen diseño. Basándonos en los criterios para hacer más efectivos nuestros formularios que ya explicamos en las primeras entregas del curso, nos ha llegado la hora de aprender a insertar los controles más comunes en los documentos de Excel para hacer que nuestras macros sean aún más efectivas. Con lo visto a lo largo del curso, todos los controles que utilizábamos iban insertados en formularios. Esto ocurría, entre otras cosas, porque no contábamos con otros objetos que fuesen capaces de contener dichos controles. En esta ocasión, veremos que las hojas de cálculo pueden contener controles al igual que ocurría con los formularios, si bien, en muchas ocasiones, resultará más cómodo seguir utilizando formularios para realizar algunas de las tareas más cotidianas. Hasta ahora, para poder ejecutar una macro, teníamos que acudir al diálogo Macro, donde seleccionábamos aquella que queríamos activar. En esta ocasión, lo que haremos, será insertar un botón de comando en la propia hoja de cálculo que, al ser pulsado, cargará el formulario que utilizaremos para insertar los datos. Para ello, lo primero que debemos hacer es pasar a Modo Diseño (a través del ▼ Realizar un formulario para adquirir y validar valores PASO 1 Lo primero que debemos hacer es adaptar una hoja de hoja de cálculo a nuestras necesidades. Para ello, abriremos un nuevo documento de Microsoft Excel y sobre él haremos las siguientes modificaciones con el fin de preparar la cabecera de los datos: escribimos el texto DATOS PERSONALES en la celda A1, CCC en la celda C1, Nombre en la A2, Apellidos en la B2, y Entidad, Oficina, Control y Número de cuenta en las celdas C2, D2, E2 y F2 respectivamente; después, combinamos y centramos las celdas A1 y B1 por un lado y C1, D1, E1 y F1 por otro. Para finalizar la preparación del documento, podemos modificar el tamaño de las columnas que ubicarán cada uno de los campos, cambiar el formato del texto, añadir líneas y bordes, etc. ▼ PASO 2 Private Sub cmdTomarDatos_Click() ‘Al pulsar el botón mostrar el formulario frmTomarDatos.Show End Sub Después de esto, para que nos resulte más cómodo el trabajo con controles, lo más recomendable es mostrar las barras de herramientas relacionadas con el trabajo que nos ocupa. Para ello, activamos las entradas Cuadro de controles y Visual Basic de submenú Barras de herramientas en el menú Ver. La primera de ellas contiene una colección de controles básicos de Visual Basic con los que nos resultará más sencillo añadir funcionalidad a la hoja de cálculo, así como un botón que nos muestra u oculta las propiedades del control activo y otro para entrar y salir del Modo de Diseño (aquel en el que podemos insertar y modificar los controles sobre la hoja de cálculo). La segunda de las barras contiene, ▼ computer!dea botón correspondiente de cualquiera de las dos nuevas barras de herramientas). Ya en modo de diseño, seleccionamos el botón de comando de la barra de controles y dibujamos un botón en la hoja de cálculo (fuera del área de datos). Una vez dibujado, cambiamos a nuestro criterio sus propiedades con la única condición de que el nombre que reciba el botón sea cmdTomarDatos. Estando en modo de diseño, con un doble clic sobre el control pasamos a la ventana de Microsoft Visual Basic (concretamente al código de la hoja 1 del libro) donde tendremos que añadir la sentencia fmrTomarDatos.Show al código del procedimiento asociado al evento Click del botón. Dicho procedimiento ha de quedar del siguiente modo: PASO 4 Ahora debemos insertar un formulario en el proyecto, añadirle los controles necesarios y programarlos correctamente. Para ello, debemos acudir a la ventana de Microsoft Visual Basic (si nos encontramos ante la hoja de cálculo pulsamos el botón Editor de Visual Basic de la barra de herramientas Visual Basic). Una vez allí, añadimos el formulario con la función UserForm del menú Insertar. Para mostrar la ventana de propiedades de los formulario y los controles, basta con pulsar la tecla F4. En dicha ventana, adjudicamos al nuevo formulario el nombre frmTomarDatos. 68 diciembre 2002 068-070 21/11/02 23:53 Página 2 PASO 5 Dentro del nuevo formulario hemos de insertar una serie de controles a los que cada uno puede dar su toque personal. Para que el código propuesto funcione correctamente es imprescindible insertar 6 cuadros de texto con los nombres txtNombre, txtApellidos, txtEntidad, txtOficina, txtControl y txtCuenta. Es recomendable utilizar etiquetas para que el usuario pueda distinguirlos. También es necesario añadir 2 botones de comando con los nombres cmdAceptar y cmdTerminar. Para que la movilidad por el formulario sea óptima, es recomendable utilizar el siguiente orden de tabulación: Nombre del control txtNombre txtApellidos txtEntidad txtOficina txtControl txtCuenta cmdAceptar cmdTerminar Valor de la propiedad TabIndex 0 1 2 3 4 5 6 7 PASO 6 Por último, tan sólo tenemos que añadir el código del formulario que, como podréis observar, interactúa continuamente con la hoja de cálculo: ‘Forzamos la declaración de variables Option Explicit Private Sub UserForm_Activate() ‘Activamos la primera celda ‘susceptible de contener datos ActiveSheet.Range(“a3”).Activate ‘Buscamos la primera fila sin ‘datos en la columna nombre Do While Not IsEmpty(ActiveCell) ActiveCell.Offset(1, 0).Activate Loop End Sub Private Sub cmdAceptar_Click() ‘Antes de ingresar los datos ‘comprobamos que sean correctos ValidarCampos End Sub Private Sub cmdTerminar_Click() ‘Descargamos el formulario Unload frmTomarDatos End Sub Private Sub txtEntidad_Change() ‘Al escribir los 4 dígitos de la entidad ‘pasamos al siguiente campo If Len(txtEntidad.Text) = 4 Then txtOficina.SetFocus End If End Sub Private Sub txtOficina_Change() ‘Al escribir los 4 dígitos de la oficina ‘pasamos al siguiente campo If Len(txtOficina.Text) = 4 Then txtControl.SetFocus End If End Sub ▼ MACROS EXCEL Private Sub txtControl_Change() ‘Al escribir los 2 dígitos de control ‘pasamos al siguiente campo If Len(txtControl.Text) = 2 Then txtCuenta.SetFocus End If End Sub Private Sub txtCuenta_Change() ‘Al escribir los 10 dígitos del número ‘de cuenta situamos el foco sobre el ‘botón cmdAceptar If Len(txtCuenta.Text) = 10 Then cmdAceptar.SetFocus End If End Sub Private Sub ValidarCampos() ‘Declaramos el procedimiento como privado ‘porque es específico del formulario ‘Declaramos una variable de tipo String Dim Error As String Dim ValorMensaje As Integer ‘Inicializamos el valor del mensaje de error Error = “Error en los datos del formulario” ‘Si el campo Nombre está vacío If Len(txtNombre.Text) = 0 Then ‘Mostramos mensaje de error ValorMensaje = MsgBox(“El campo Nombre está vacío”, _ vbOKOnly, Error) ‘Situamos el foco sobre el campo Nombre txtNombre.SetFocus Else ‘Si el campo Apellidos está vacío If Len(txtApellidos.Text) = 0 Then ‘Mostramos el mensaje de error ValorMensaje = MsgBox _ (“El campo Apellidos está vacío”, vbOKOnly, Error) ‘Situamos el foco sobre el campo Apellidos txtApellidos.SetFocus Else ‘Si no hubo fallos ‘insertamos With ActiveCell ‘Sobre la celda activa el Nombre .Value = txtNombre ‘Sobre la de la columna siguiete ‘los apellidos .Offset(0, 1).Value = txtApellidos ‘2 columnas después de la activa ‘el código de la entidad .Offset(0, 2).Value = txtEntidad ‘3 columnas después de la activa ‘el código de la oficina .Offset(0, 3).Value = txtOficina ‘a continuación el de control .Offset(0, 4).Value = txtControl computer!dea 70 diciembre 2002 ‘y por último el de la cuenta .Offset(0, 5).Value = txtCuenta End With ‘Pasamos a la siguiente fila ‘por si se ingresan más datos ActiveCell.Offset(1, 0).Activate ‘Borramos el formulario BorrarFormulario End If End If End Sub Private Sub BorrarFormulario() ‘Ponemos la cadena vacía ‘a todos los campos txtNombre.Text = “” txtApellidos.Text = “” txtEntidad.Text = “” txtOficina.Text = “” txtControl.Text = “” txtCuenta.Text = “” ‘Situamos el foco en el campo Nombre txtNombre.SetFocus End Sub Propuesta Como objetivo antes de la próxima entrega del curso, deberemos tratar de validar los 4 campos numéricos de la cuenta, de modo que si el usuario escribe un carácter no numérico en cualquiera de ellos el ordenador emita un sonido y desprecie dicho carácter. También habrá que controlar el tamaño de los campos de modo que los 4 numéricos estén vacíos o contengan los 20 números de la cuenta correctamente repartidos. Como ayuda, si recordáis, algo parecido a la primera parte de la propuesta ya lo resolvimos en la calculadora de euros. Por último, debemos tener en cuenta que para que el botón de comando cmdTomarDatos sea operativo hemos de salir del modo de diseño.