|
|
Artículo realizado por
Seguimos con los UserForms y los controles. En esta entrega vamos a ampliar el diálogo sobre datos personales, añadiéndole más opciones, y vamos a crear dos nuevos userforms: uno para convertir de pesetas a euros y viceversa, y otro para hacer operaciones (sumar, restar...) sobre un rango seleccionado (algo parecido a lo que hicimos antes, pero más completo).
Primero vamos a volver a hacer un diálogo de "Datos Personales" como el de la entrega anterior, pero añadiendo algunas cosas. Partimos del userform de la entrega anterior, que tenía un cuadro de edición para el nombre y otro para el apellido, y los dos botones clásicos (Aceptar y Cancelar). Habíamos escrito el código necesario para que al abrirse el diálogo (evento Initialize del Userform) los cuadros de edición se llenen con el texto de las celdas de la hoja de cálculo, y también para que cuando el usuario pulse Aceptar (evento Click del botón) se copie el texto de los cuadros de edición a la hoja de cálculo. Para hacer estos traspasos entre la hoja de cálculo y el Userform habíamos escrito un par de líneas de código en los eventos indicados, pero vamos a ver que hay otro método para hacerlo:
Todos los controles tienen la propiedad "ControlSource", que se utiliza para decirle al control cuál es la "fuente" de su información, que será una celda o un rango de una hoja de cálculo. Por ejemplo, en el cuadro de edición del Nombre podemos poner como ControlSource la celda de la hoja de cálculo en la que está ese dato. Como siempre, no vamos a utilizar referencias absolutas a celdas y rangos (p.ej. Hoja1!A5), sino que vamos a utilizar nombres de rango. Por ejemplo, vamos a la hoja de cálculo y damos a la celda "fuente" el nombre "rngNombre" (rng porque es un rango de una hoja de cálculo). Luego vamos al editor VBE, seleccionamos el control de edición Nombre y en su propiedad ControlSource escribimos el nombre del rango que queremos que sea su "fuente", en este caso "rngNombre". Ahora hacemos lo mismpo para el apellido: primero damos el nombre "rngApellido" a la celda de la hoja de cálculo y luego escribimos rngApellido en la propiedad ControlSource del control de edición de Apellido. Ahora tenemos que borrar el código que habíamos escrito para pasar la información de hoja de cálculo al Userform y viceversa. Mejor que borrarlo, lo que haremos será "comentarlo", utilizando una comilla simple ', que indica a Excel que todo lo que escribamos en esa línea detrás de la comilla son cosas nuestras y que las ignore (el texto "comentado" aparecerá en otro color, normalmente en verde). Aprovechando que explico lo de los comentarios, nunca está de más recordar la importancia que tiene añadir al código todos los comentarios que sean necesarios. Cuando estás escribiendo una rutina sabes perfectamente cómo funciona y qué es lo que hace, y todos pensamos que los comentarios son innecesarios, pero cuando tras algunas semanas tienes que volver a ver la rutina te encuentras con un montón de líneas que no sabes para qué sirven ni cómo lo hacen, y si no las has comentado tienes que "bucear" en ellas para averiguarlo. A lo que íbamos, estábamos borrando el código de los eventos Initialize del Userform y Click del botón Aceptar. Vamos al editor VBE, hacemos doble-click sobre el Userform y nos aparece la rutina Userform_Initialize(). Ponemos una comilla delante de las dos líneas que se encargan de copiar los datos de la hoja de cálculo al userform, y veremos que dichas líneas cambian de color, indicándonos que para Excel son comentarios y los va a ignorar. Ahora volvemos al Userform y hacemos doble-click en el botón Aceptar, y nos aparece la rutina btnAceptar_Click(). Volvemos a poner las comillas en las dos líneas de código que queremos quitar y ya está. Si probamos ahora el diálogo, veremos que la propieda ControlSource funciona, y que antes de mostrar el diálogo "lee" el contenido de la hoja de cálculo y lo pone en el Userform, y cuando pulsamos Aceptar copia el contenido de los controles del Userform en la hoja de cálculo. Sin embargo he detectado un problema con el uso de ControlSource. Si hacemos algún cambio en el Userform y luego pulsamos el botón de "Cancelar", los cambios que hemos hecho en los datos se actualizan en la hoja de cálculo, cuando no deberían actualizarse porque hemos pulsado Cancelar. En cambio, si hacemos algún cambio y pulsamos la tecla Escape los cambios no se actualizan en la hoja de cálculo. Es un poco raro. Creo que "se me escapa" algo, si alguien descubre por qué ocurre esto que me avise. Bueno, ahora vamos a añadir un control nuevo, que Excel llama "cuadro combinado" (el nombre en inglés es ComboBox), que es la típica persiana que estamos hartos de ver en cualquier diálogo, y permite al usuario escoger una opción entre varias que le presentamos. En este caso vamos a mostrar una persiana para el "Estado Civil", y las opciones que vamos a presentar son "soltero, casado, viudo y divorciado". List: un conjunto de cadenas de caracteres (strings) que representan a todos los elementos de la lista. Para acceder a un elemento en concreto utilizamos MiComboBox.List( 3 ), que nos devolvería el cuarto elemento de la lista, ya que el primero tiene el número 0. ListCount: el número de elementos que hay en la lista. Si utilizamos MiComboBox.List( MiComboBox.ListCount-1 ) obtendremos el último elemento de la lista. ListIndex: el número del elemento seleccionado actualmente por el usuario. Para obtener el texto del elemento seleccionado utilizaríamos MiComboBox.List( MiComboBox.ListIndex ). Si hemos definido el control como "multiselección" (es decir, que el usuario pueda escoger más de un elemento), esta propiedad no se puede usar, pero por ahora no nos vamos a meter en esto. Rowsource: es el rango del que queremos que el ComboBox lea los elementos. Podemos utilizar esta propiedad, o bien introducir nosotros mismos mediante código los elementos (utilizando el método AddItem). ControlSource: la celda en la que el ComboBox lee y escribe el elemento seleccionado. Igual que con RowSource, podemos utilizar esta propiedad para que el ComboBox nos escriba en una celda el elemento seleccionado o podemos utilizar código para obtener el elemento seleccionado (utilizando ListIndex). Style: identifica el tipo de ComboBox que queremos. Tiene dos valores posibles:
fmStyleDropDownCombo: el usuario puede escoger uno de los valores de la lista o escribir otro distinto.
fmStyleDropDownList: el usuario sólo puede escoger uno de los valores de la lista.
ControlTipText: esta propiedad se aplica a todos los controles, pero como todavía no la he explicado, la pongo aquí. Esta propiedad sirve para mostrar al usuario un pequeño texto de ayuda sobre el control cuando ponga el ratón sobre el mismo, el ya clásico cuadrito amarillo.
AddItem: sirve para añadir un elemento a la lista. Su sintaxis es MiComboBox.AddItem( 'Mi texto', 3 ). El primer parámetro es el texto del elemento, y el segundo parámetro (que es opcional), es la posición dentro de la lista que queremos para el nuevo elemento. Si no utilizamos el segundo parámetro, nuestro nuevo elemento se añadirá al final de la lista. RemoveItem: para borrar un elemento. Su sintaxis es MiComboBox.RemoveItem( 3 ), para borrar el elemento número 3. Clear: borra todos los elementos de la lista.
Como siempre, hay muchos más métodos y propiedades, que están bastante bien explicados en la ayuda de Excel. Vamos a colocar nuestro ComboBox en el Userform, y una vez colocado vamos a las propiedades. Primero vamos a establecer la propiedad Style como fmStyleDropDownList, para que el usuario sólo pueda escoger uno de los valores que le presentamos (es decir, que no le dejamos que se invente un nuevo estado civil). Ahora vamos a la hoja de cálculo y escribimos en una celda cualquiera "Soltero", debajo "Casado", debajo "Divorciado" y debajo "Viudo". Ahora vamos a dar un nombre a este rango, seleccionando las cuatro celdas y escribiendo en el "Cuadro de Nombres" (en la parte superior izquierda) el nombre "rngEstadoCivil". Ya que estamos vamos a seleccionar cualquier otra celda para que el ComboBox almacene el elemento seleccionado por el usuario, y le damos a esta celda el nombre "rngValorEstadoCivil". Ahora vamos otra vez al editor de Visual Basic (VBE), seleccionamos nuestro ComboBox, y en la propiedad RowSource escribimos "rngEstadoCivil". En la propiedad ControlSource escribimos "rngValorEstadoCivil". Como propina, vamos a poner en la propiedad ControlTipText el texto "Selecciona tu estado civil", que es lo que el usuario verá en un cuadrito amarillo cuando ponga el ratón sobre el ComboBox. Recuerda que esta propiedad la tienen todos los controles. Ya tenemos nuestro ComboBox, y si lo probamos veremos que funciona perfectamente. Recuerda que el ComboBox coge los valores del rango establecido en RowSource, y almacena el valor seleccionado por el usuario en la celda establecida en ControlSource. Como ejercicio podemos hacer lo siguiente: borramos las propiedades ControlSource y RowSource, y hacemos que el control funcione igual pero encargándonos nosotros mismos de poner los valores en la lista y luego identificar la selección del usuario y poner su valor en la celda que queremos. Para ello tendremos que utilizar las propiedades List y ListIndex, y los métodos Clear y AddItem, poniendo el código en los eventos Userform_Initialize() y btnAceptar_Click(). Ahora que ya dominamos el ComboBox, una buena noticia: el control ListBox ("Cuadro de Lista" según la traducción de Excel) funciona prácticamente igual. El ComboBox es el control en el que sólo se ve una línea y pulsando un botón sale una "persiana" con las distintas opciones, y en cambio en el control ListBox se ve siempre la lista de opciones, no hay persiana. Aparte de esta diferencia "visual", los dos tipos de controles son prácticamente iguales. Vamos a por otro control, el SpinButton (Botón de número). Este botón se utiliza normalmente combinado con un Cuadro de edición: si pulsamos el SpinButton hacia arriba aumentamos el valor del cuadro de edición, y viceversa. Value: el valor del SpinButton, un número.
Min: el valor mínimo que puede tener el SpinButton.
Max: el máximo.
SmallChange: el incremento/decremento que sufrirá la variable Value cada vez que el usuario pulse el SpinButton. Normalmente es 1, pero lo podemos cambiar.
Vamos a utilizar el control SpinButton combinado con un cuadro de edición que vamos a utilizar para almacenar la edad. Primero ponemos un cuadro de edición, que llamaremos "editEdad" (ya sabes, cambiando la propiedad Name). En una hoja de cálculo daremos el nombre "rngEdad" a una celda, y utilizaremos esta celda para la propiedad ControlSource de nuestro control "editEdad". Ahora colocamos un control SpinButton. Normalmente se suelen colocar a la derecha del cuadro de edición al que van asociados. En el cuadro de propiedades vamos a poner a Min el valor 0 (edad mínima) y a Max el valor 150 (edad máxima). El nombre del control lo dejamos como está (SpinButton1). Ahora tenemos que jugar un poco con los eventos: cada vez que el usuario pulsa el SpinButton se produce el evento Change. Cada vez que se produzca este evento queremos cambiar el valor del cuadro de edición "editEdad". Hacemos doble-click en el SpinButton y aparece la ventana de código, en la que escribiremos: Bastante sencillo, ¿no? Simplemente damos a la propiedad Text del objeto "editEdad" el valor del SpinButton. Ahora tenemos que hacer lo mismo pero "al revés". Si el usuario va directamente al cuadro de edición y escribe una edad, queremos que el valor del SpinButton se actualice, ya que tanto el cuadro de edición como el SpinButton tienen que tener el mismo valor. Para ello usamos el evento Change del objeto editEdad. Hacemos doble-click sobre él y en la ventana de código escribimos: Prácticamente igual que antes. El único cambio es que utilizamos la propiedad Value de editEdad en lugar de la propiedad Text, porque queremos el valor numérico, y no la cadena de caracteres. Si en el control de edición escribes alguna letra en lugar de un número verás que el Userform se detiene mostrándote un mensaje de error porque no puede calcular la propiedad Value de editEdad. En una aplicación "de verdad" deberíamos escribir algo de código para evitar estos errores, pero todavía no hemos visto el control de errores (ya llegaremos). Todavía nos queda un pequeño detalle respecto al SpinButton. Cuando el Userform se carga por primera vez, el control editEdad lee de la hoja de cálculo la edad (porque se lo hemos dicho en la propiedad ControlSource), pero el control SpinButton no está actualizado, tenemos que darle el mismo valor que tiene el control editEdad. Para ello usaremos el evento Initialize el Userform, que ya conocemos de sobra: El código es el mismo que el utilizado en el evento editEdad_Change(). Si probamos ahora el diálogo veremos que la combinación editEdad + SpinButton1 funciona perfectamente (aparte de la detección de errores, que veremos más adelante). Ahora vamos con otros tipos de controles: las casillas de verificación (CheckBoxes en inglés), y los botones de opción (OptionButtons). Para utilizarlos vamos a suponer que queremos que el usuario nos indique si utiliza o no una hoja de cálculo, y en caso de que sí la utilice nos diga cuál es su preferida. Lo primero es preguntar si utiliza una hoja de cálculo, y para ello vamos a utilizar una casilla de verificación, que puede tener el valor verdadero o falso. Como siempre colocamos el control sobre el userform y le damos el nombre "cboxUtilizaHoja". En la propiedad ControlSource vamos a escribir "rngUtilizarHoja", que es el nombre que hemos dado a un rango de una hoja de cálculo (en el fichero de ejemplo es la celda C18 de la Hoja1). Y en la propiedad Caption escribimos el texto del control, algo así como "Utiliza hoja de cálculo". También podemos escribir algo en la propiedad ControlTipText. Además de todas esas propiedades que ya conocemos las propiedades importantes de un control de verificación o CheckBox son: Value: el valor del control. Puede ser verdadero o falso. TripleState: puede ser verdadero o falso (esto último por defecto). Si le damos el valor verdadero el control tiene tres estados: verdadero, falso y nada (cuando se pone gris). En algunas ocasiones puede ser útil pero normalmente lo dejaremos como falso.
Ahora vamos a ver cuál es la hoja de cálculo preferida del usuario. Para ello vamos a utilizar unos botones de opción, para darle la opción de elegir entre Excel, Lotus 1-2-3 u otra hoja de cálculo. Lo primero que tenemos que hacer es colocar un control marco (Frame en inglés). Estos controles sólo sirven para agrupar controles y para mejorar la presentación del userform. También tienen sus propiedades y eventos, pero casi nunca se utilizan. Bueno, colocamos un control Frame en el userform, y ahora vamos a poner dentro de él los tres botones de opción. Para poner un control dentro del marco lo que hay que hacer es seleccionar el marco y sin quitar la selección añadir el nuevo control. Vamos a hacer esto tres veces, y añadiremos tres botones de opción dentro del marco. Para guardar los valores de los botones de opción vamos a dar nombres a tres celdas de la hoja de cálculo (en el ejemplo E16, E17 y E18), a las que nombraremos "rngExcel", "rngLotus" y "rngOtros". Ahora vamos a los tres botones de opción que hemos puesto en el userform y en la propiedad ControlSource de cada uno de ellos escribimos una de los nombres que acabamos de crear. También convendría cambiar la propiedad Caption de cada uno de los botones para mostrar el texto adecuado. Las propiedades Value y TripleState de un botón de opción funcionan igual que en el control de verificación, y el resto de propiedades no son demasiado importantes. Si probamos ahora el userform debería funcionar perfectamente, excepto un pequeño detalle. Si el usuario nos dice que no utiliza ninguna hoja de cálculo, los botones de opción siguen preguntándole cuál es su hoja de cálculo preferida, lo que evidentemente no tiene ningún sentido. Lo que tenemos que hacer es desactivar los botones de opción: para desactivar cualquier control (no sólo los botones de opción) se utiliza la propiedad Enabled; si esta propiedad es verdadera, el control está activado, y si es falso el control estará desactivado (aparece en color gris), y el usuario no puede interactuar con él. Lo que nos queda ahora es saber cuándo ha cambiado de estado (verdadero, falso) la casilla de verificación cboxUtilizaHoja. Como siempre, lo hacemos con un evento, el evento Change del control de verificación, que se ejecuta cada vez que cambia el estado del control. Por lo tanto, en el evento Change tendremos que cambiar el estado (activado, desactivado) de los botones de opción. El código es: Fíjate que damos a la propiedad Enabled de los botones de opción y el marco el valor de la propiedad Value del control de verificación. También podríamos haber escrito: El resultado es el mismo, pero la primera opción es bastante más elegante. Un pequeño detalle. Cuando el userform se inicia también deberíamos activar/desactivar los botones según el valor de la casilla de verificación. Una solución rápida sería escribir dentro del evento Userform_Initialize (que ya conocemos) el mismo código que en cboxUtilizaHoja_Change, pero no es lo más adecuado porque estaríamos escribiendo el mismo código en dos sitios distintos, cosa que hay que evitar porque si luego tenemos que hacer algún cambio en el código tendremos que hacerlo en dos sitios. Lo mejor es llamar a cboxUtilizaHoja_Change() desde el evento Userform_Initialize(). La rutina cboxUtilizaHoja_Change es llamada cada vez que se produce el evento Change, pero nada nos impide llamarla por nuestra cuenta en cualquier otro momento, como por ejemplo cuando se inicia el userform. El evento Userform_Initialize quedará así: Pues ya tenemos el userform de datos personales completo, y ya hemos aprendido a usar prácticamente todos los controles. La apariencia final del userform de datos personales es la siguiente.
Iñaki Ecenarro.
Capítulo 4. Cuadros de diálogo (Userforms). Segunda parte.
Todos los ejemplos de este capítulo están incluídos en este fichero:
Excel4.xls
(116kbs)
Las propiedades más importantes de un ComboBox son:
Una vez vistas las propiedades, vamos con los métodos del objeto ComboBox:
Private Sub SpinButton1_Change()
editEdad.Text = SpinButton1.Value
End Sub
Private Sub editEdad_Change()
SpinButton1.Value = editEdad.Value
End Sub
Private Sub UserForm_Initialize()
SpinButton1.Value = editEdad.Value
End Sub
Private Sub cboxUtilizaHoja_Change()
Frame2.Enabled = cboxUtilizaHoja.Value
OptionButton1.Enabled = cboxUtilizaHoja.Value
OptionButton2.Enabled = cboxUtilizaHoja.Value
OptionButton3.Enabled = cboxUtilizaHoja.Value
End Sub
If cboxUtilizaHoja.Value = True Then
OptionButton1.Enabled = True
.....
Else
OptionButton1.Enabled = False
.....
End If
Private Sub UserForm_Initialize()
cboxUtilizaHoja_Change
SpinButton1.Value = editEdad.Value
End Sub
Como ejercicio, vamos a hacer otro userform, en el que no vamos a utilizar ningún control nuevo pero sí vamos a ver un evento nuevo (KeyUp). Lo que vamos a hacer es un diálogo en el que el usuario pueda escribir una cifra en pesetas y automáticamente le diremos cuántos euros son. Y al revés, si escribe los euros calcularemos cuántas pesetas son.
Pues vamos al VBE, creamos un userform, y ponemos en él dos controles de edición, que llamaremos editPesetas y editEuros, dos etiquetas al lado de cada control de edición, y un botón para cerrar el diálogo.
Primero lo más fácil. En el botón de cerrar (al que cambiaremos el Caption para que ponga "Cerrar", y que llamaremos btnCerrar) tenemos que poner el código para cerrar el userform:
Private Sub btnCerrar_Click() Unload Me End Sub
Ahora vamos a los cuadros de edición. Lo que queremos hacer es que cada vez que el usuario pulse una tecla se actualice el otro cuadro de edición. Por ejemplo, si el usuario va a escribir 2500 pts, nosotros actualizaremos el cuadro de edición de euros cada vez que el usuario pulse una tecla, sin esperar a que termine. Para eso vamos a utilizar el evento KeyUp, que se produce cada vez que el usuario pulsa una tecla.
Para escribir el código de este evento vamos a la ventana de código de nuestro userform, y en las persianas de la parte superior seleccionamos el control editPesetas y en la parte derecha el evento KeyUp. Excel nos habrá puesto la declaración de la rutina (con los parámetros adecuados, que en este caso no nos interesan y vamos a ignorar) y el "End Sub" correspondiente. Ahora sólo tenemos que poner lo del medio:
Private Sub editPesetas_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If editPesetas.Text <> "" Then editEuros.Text = Format(editPesetas.Value / 168, "0.00") Else editEuros.Text = "" End If End Sub
El "If" lo utilizo como una pequeña forma de detección de errores, por si el cuadro de edición está vacío (de todas formas, se pueden producir muchos errores, como por ejemplo si el usuario introduce una letra en lugar de un número, pero no vamos a ponernos ahora a escribir código para detectar todos esos errores). El resto es bastante sencillo, se trata de poner en el cuadro editEuros el importe de editPesetas dividido por 168 (el valor en pesetas de un euro), y utilizando la función Format para que sólo presente dos decimales. (la función Format es muy sencilla de utilizar, si quieres más información consulta la ayuda).
Podemos probar a ejecutar ahora el diálogo y veremos que cada vez que introduzcamos un carácter en el cuadro editPesetas se actualiza el cuadro editEuros.
Ahora tenemos que hacer que cuando escribamos algo en editEuros se actualice editPesetas. El procedimiento es exactamente el mismo:
Private Sub editEuros_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If editEuros.Text <> "" Then editPesetas.Text = Format(editEuros.Value * 168, "0.00") Else editPesetas.Text = "" End If End Sub
Igual que antes, pero multiplicando por 168 en lugar de dividir.
Hasta ahora, todos los botones que hemos utilizado en los userforms servían para cerrar el userform, con la diferencia de que solemos poner uno para Aceptar y otro para Cancelar. Pero también podemos poner en un userform un botón que realice cualquier otra acción pero no cierre el userform. Lo más típico es que este botón haga algún cambio sobre los controles del userform.
En este caso, aprovechando nuestro conversor de euros, vamos a crear dos botones, uno al lado de cada cuadro de edición, que van a pegar en la celda activa de la hoja de cálculo el contenido del cuadro de edición asociado.
Colocamos los dos botones, uno al lado de cada cuadro de edición, y les damos los nombres btnPegarPts y btnPegarEuros, y les ponemos como Caption algo como "Pegar". Ahora vamos al código:
Private Sub btnPegarPts_Click() ActiveCell.Value = editPesetas.Value End Sub Private Sub btnPegarEuros_Click() ActiveCell.Value = editEuros.Value End Sub
El evento que utilizamos es el evento Click, que ya conocemos de sobra. Y el código tampoco tiene ninguna dificultad, simplemente es poner en ActiveCell el valor del control de edición, editPesetas o editEuros.
Como verás, al pulsar estos botones se pega el contenido en la hoja de cálculo, pero no se cierra el userform. Si quisiéramos que después de hacer el pegado se cerrara el userform tendríamos que añadir el clásico "Unload Me" a las dos rutinas anteriores.
Así nos ha quedado el userform del conversor de euros:
Y para terminar esta entrega, vamos a hacer un diálogo para hacer operaciones sobre un rango, como los que ya hemos hecho, pero más completo. El diálogo va a permitirnos cambiar el rango seleccionado, y luego nos permitirá seleccionar la operación aritmética que queremos hacer sobre el rango (sumar, restar, multiplicar, dividir) utilizando para ello unos botones de opción.
En este diálogo vamos a utilizar un control nuevo, el RefEdit, que sirve para que el usuario pueda introducir una referencia (un rango). Puede hacerlo escribiendo la referencia absoluta o el nombre del rango (como si fuese un cuadro de edición), o pulsando en el botoncito que aparece a la derecha, que hace que desaparezca el userform y el usuario puede seleccionar el rango con el ratón o el teclado.
Los controles que vamos a poner en este userform son:
Tipo de control | Name | Caption |
RefEdit | RefEdit1 | N/A |
TextBox | tbValor | N/A |
Frame | Frame1 | Operación |
OptionButton | obSumar | Sumar |
OptionButton | obRestar | Restar |
OptionButton | obMultiplicar | Multiplicar |
OptionButton | obDividir | Dividir |
CommandButton | btnAceptar | Aceptar |
CommandButton | btnCancelar | Cancelar |
El resultado final será algo así:
Lo único nuevo que tenemos que aprender es que el rango que el usuario ha introducido en el RefEdit se guarda en la propiedad Text. Pero Text es una cadena de caracteres, por lo que si queremos hacer referencia al rango deberemos usar Range(RefEdit1.Text).
Vamos con el código:
Private Sub UserForm_Initialize() obSumar.Value = True RefEdit1.Text = Selection.Address End Sub
Primero hacemos que la operación seleccionada por defecto sea sumar (alguna tiene que ser) y que en el RefEdit aparezca como rango la selección que tenía hecha el usuario antes de llamar al diálogo.
Ahora los botones:
Private Sub btnAceptar_Click() HacerOperacion Unload Me End Sub Private Sub btnCancelar_Click() Unload Me End Sub
La única diferencia entre los dos botones es que uno de ellos llama a la rutina HacerOperacion antes de cerrar el userform. La rutina HacerOperacion es la siguiente:
Sub HacerOperacion() Dim r As Range Dim c As Object Dim i As Double Set r = Range(RefEdit1.Text) i = tbValor.Value For Each c In r.Cells If obSumar.Value = True Then c.Value = c.Value + i ElseIf obRestar.Value = True Then c.Value = c.Value - i ElseIf obMultiplicar.Value = True Then c.Value = c.Value * i ElseIf obDividir.Value = True Then c.Value = c.Value / i End If Next c End Sub
Primero obtenemos el rango seleccionado y lo almacenamos en "r". Luego obtenemos el valor que hay que utilizar, que el usuario ha escrito en tbValor, y lo almacenamos en "i". Luego hacemos un bucle "For Each - Next", que ya conocemos, para repetir el mismo código para todas las celdas del rango. El "If" tan largo que utilizamos es bastante más sencillo de lo que parece: lo único que hace es comprobar cuál es el botón de opción activado (Value = True) y efectúa la operación asociada a ese botón.
Y aquí termina la cuarta entrega del curso. Si tienes cualquier duda o comentario que hacer, no dudes en contactar conmigo. En la próxima entrega hablaremos de la creación de menús y barras de herramientas personalizadas.
Recuerda que los ejemplos de este capítulo están incluídos en este fichero: | Excel4.xls (116kbs) |
![]() |
|
|