Вы находитесь на странице: 1из 10

22/04/2010

http://macedoniamagazine.frodrig.co

Aula Macedonia
Curso de Programacin en VBA para Excel
Artculo realizado por Iaki Ecenarro.

Captulo 4. Cuadros de dilogo (Userforms). Segunda parte.


Seguimos con los UserForms y los controles. En esta entrega vamos a ampliar el dilogo sobre datos personales, aadindole ms 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 ms completo).

Todos los ejemplos de este captulo estn includos en este fichero:

Excel4.xls (116kbs)

Primero vamos a volver a hacer un dilogo de "Datos Personales" como el de la entrega anterior, pero aadiendo algunas cosas. Partimos del userform de la entrega anterior, que tena un cuadro de edicin para el nombre y otro para el apellido, y los dos botones clsicos (Aceptar y Cancelar). Habamos escrito el cdigo necesario para que al abrirse el dilogo (evento Initialize del Userform) los cuadros de edicin se llenen con el texto de las celdas de la hoja de clculo, y tambin para que cuando el usuario pulse Aceptar (evento Click del botn) se copie el texto de los cuadros de edicin a la hoja de clculo. Para hacer estos traspasos entre la hoja de clculo y el Userform habamos escrito un par de lneas de cdigo en los eventos indicados, pero vamos a ver que hay otro mtodo para hacerlo: Todos los controles tienen la propiedad "ControlSource", que se utiliza para decirle al control cul es la "fuente" de su informacin, que ser una celda o un rango de una hoja de clculo. Por ejemplo, en el cuadro de edicin del Nombre podemos poner como ControlSource la celda de la hoja de clculo 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 clculo y damos a la celda "fuente" el nombre "rngNombre" (rng porque es un rango de una hoja de clculo). Luego vamos al editor VBE, seleccionamos el control de edicin 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 clculo y luego escribimos rngApellido en la propiedad ControlSource del control de edicin de Apellido. Ahora tenemos que borrar el cdigo que habamos escrito para pasar la informacin de hoja de clculo 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 lnea detrs 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 ms recordar la importancia que tiene aadir al cdigo todos los comentarios que sean necesarios. Cuando ests escribiendo una rutina sabes perfectamente cmo 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
frodrig.com/excel3.htm 1/10

22/04/2010

http://macedoniamagazine.frodrig.co

con un montn de lneas que no sabes para qu sirven ni cmo lo hacen, y si no las has comentado tienes que "bucear" en ellas para averiguarlo. A lo que bamos, estbamos borrando el cdigo de los eventos Initialize del Userform y Click del botn 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 lneas que se encargan de copiar los datos de la hoja de clculo al userform, y veremos que dichas lneas cambian de color, indicndonos que para Excel son comentarios y los va a ignorar. Ahora volvemos al Userform y hacemos doble-click en el botn Aceptar, y nos aparece la rutina btnAceptar_Click(). Volvemos a poner las comillas en las dos lneas de cdigo que queremos quitar y ya est. Si probamos ahora el dilogo, veremos que la propieda ControlSource funciona, y que antes de mostrar el dilogo "lee" el contenido de la hoja de clculo y lo pone en el Userform, y cuando pulsamos Aceptar copia el contenido de los controles del Userform en la hoja de clculo. Sin embargo he detectado un problema con el uso de ControlSource. Si hacemos algn cambio en el Userform y luego pulsamos el botn de "Cancelar", los cambios que hemos hecho en los datos se actualizan en la hoja de clculo, cuando no deberan actualizarse porque hemos pulsado Cancelar. En cambio, si hacemos algn cambio y pulsamos la tecla Escape los cambios no se actualizan en la hoja de clculo. Es un poco raro. Creo que "se me escapa" algo, si alguien descubre por qu ocurre esto que me avise. Bueno, ahora vamos a aadir un control nuevo, que Excel llama "cuadro combinado" (el nombre en ingls es ComboBox), que es la tpica persiana que estamos hartos de ver en cualquier dilogo, y permite al usuario escoger una opcin 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".

Las propiedades ms importantes de un ComboBox son: 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 devolvera el cuarto elemento de la lista, ya que el primero tiene el nmero 0.

ListCount: el nmero de elementos que hay en la lista. Si MiComboBox.ListCount-1 ) obtendremos el ltimo elemento de la lista.

utilizamos MiComboBox.List(

ListIndex: el nmero del elemento seleccionado actualmente por el usuario. Para obtener el texto del elemento seleccionado utilizaramos MiComboBox.List( MiComboBox.ListIndex ). Si hemos definido el control como "multiseleccin" (es decir, que el usuario pueda escoger ms 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 cdigo los elementos (utilizando el mtodo 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 cdigo 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 slo puede escoger uno de los valores de la lista.

ControlTipText: esta propiedad se aplica a todos los controles, pero como todava no la he explicado, la
frodrig.com/excel3.htm 2/10

22/04/2010

http://macedoniamagazine.frodrig.co

pongo aqu. Esta propiedad sirve para mostrar al usuario un pequeo texto de ayuda sobre el control cuando ponga el ratn sobre el mismo, el ya clsico cuadrito amarillo.

Una vez vistas las propiedades, vamos con los mtodos del objeto ComboBox: AddItem: sirve para aadir un elemento a la lista. Su sintaxis es MiComboBox.AddItem( 'Mi texto', 3 ). El primer parmetro es el texto del elemento, y el segundo parmetro (que es opcional), es la posicin dentro de la lista que queremos para el nuevo elemento. Si no utilizamos el segundo parmetro, nuestro nuevo elemento se aadir al final de la lista.

RemoveItem: para borrar un elemento. Su sintaxis es MiComboBox.RemoveItem( 3 ), para borrar el elemento nmero 3.

Clear: borra todos los elementos de la lista. Como siempre, hay muchos ms mtodos y propiedades, que estn 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 slo 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 clculo 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 ratn 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 encargndonos nosotros mismos de poner los valores en la lista y luego identificar la seleccin del usuario y poner su valor en la celda que queremos. Para ello tendremos que utilizar las propiedades List y ListIndex, y los mtodos Clear y AddItem, poniendo el cdigo en los eventos Userform_Initialize() y btnAceptar_Click(). Ahora que ya dominamos el ComboBox, una buena noticia: el control ListBox ("Cuadro de Lista" segn la traduccin de Excel) funciona prcticamente igual. El ComboBox es el control en el que slo se ve una lnea y pulsando un botn 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 prcticamente iguales. Vamos a por otro control, el SpinButton (Botn de nmero). Este botn se utiliza normalmente combinado con un Cuadro de edicin: si pulsamos el SpinButton hacia arriba aumentamos el valor del cuadro de edicin, y viceversa. Las propiedades ms importantes del SpinButton son: Value: el valor del SpinButton, un nmero.
frodrig.com/excel3.htm 3/10

22/04/2010

http://macedoniamagazine.frodrig.co

Min: el valor mnimo que puede tener el SpinButton. Max: el mximo. 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 edicin que vamos a utilizar para almacenar la edad. Primero ponemos un cuadro de edicin, que llamaremos "editEdad" (ya sabes, cambiando la propiedad Name). En una hoja de clculo 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 edicin al que van asociados. En el cuadro de propiedades vamos a poner a Min el valor 0 (edad mnima) y a Max el valor 150 (edad mxima). 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 edicin "editEdad". Hacemos doble-click en el SpinButton y aparece la ventana de cdigo, en la que escribiremos:
Private Sub SpinButton1_Change() editEdad.Text = SpinButton1.Value End Sub

Bastante sencillo, no? Simplemente damos a la propiedad Text del objeto "editEdad" el valor del SpinButton. Ahora tenemos que hacer lo mismo pero "al revs". Si el usuario va directamente al cuadro de edicin y escribe una edad, queremos que el valor del SpinButton se actualice, ya que tanto el cuadro de edicin 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 cdigo escribimos:
Private Sub editEdad_Change() SpinButton1.Value = editEdad.Value End Sub

Prcticamente igual que antes. El nico cambio es que utilizamos la propiedad Value de editEdad en lugar de la propiedad Text, porque queremos el valor numrico, y no la cadena de caracteres. Si en el control de edicin escribes alguna letra en lugar de un nmero vers que el Userform se detiene mostrndote un mensaje de error porque no puede calcular la propiedad Value de editEdad. En una aplicacin "de verdad" deberamos escribir algo de cdigo para evitar estos errores, pero todava no hemos visto el control de errores (ya llegaremos). Todava nos queda un pequeo detalle respecto al SpinButton. Cuando el Userform se carga por primera vez, el control editEdad lee de la hoja de clculo 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:
Private Sub UserForm_Initialize() SpinButton1.Value = editEdad.Value End Sub

El cdigo es el mismo que el utilizado en el evento editEdad_Change(). Si probamos ahora el dilogo veremos que la combinacin editEdad + SpinButton1 funciona perfectamente (aparte de la deteccin de errores, que veremos ms adelante). Ahora vamos con otros tipos de controles: las casillas de verificacin (CheckBoxes en ingls), y los botones de opcin (OptionButtons). Para utilizarlos vamos a suponer que queremos que el usuario nos indique si utiliza o no una hoja de clculo, y en caso de que s la utilice nos diga cul es su preferida. Lo primero es preguntar si utiliza una hoja de clculo, y para ello vamos a utilizar una casilla de verificacin, 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 clculo (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 clculo". Tambin podemos escribir algo en la propiedad ControlTipText. Adems de todas esas propiedades que ya conocemos las propiedades importantes de un control de
frodrig.com/excel3.htm 4/10

22/04/2010

http://macedoniamagazine.frodrig.co

verificacin 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 cul es la hoja de clculo preferida del usuario. Para ello vamos a utilizar unos botones de opcin, para darle la opcin de elegir entre Excel, Lotus 1-2-3 u otra hoja de clculo. Lo primero que tenemos que hacer es colocar un control marco (Frame en ingls). Estos controles slo sirven para agrupar controles y para mejorar la presentacin del userform. Tambin 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 opcin. Para poner un control dentro del marco lo que hay que hacer es seleccionar el marco y sin quitar la seleccin aadir el nuevo control. Vamos a hacer esto tres veces, y aadiremos tres botones de opcin dentro del marco. Para guardar los valores de los botones de opcin vamos a dar nombres a tres celdas de la hoja de clculo (en el ejemplo E16, E17 y E18), a las que nombraremos "rngExcel", "rngLotus" y "rngOtros". Ahora vamos a los tres botones de opcin 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. Tambin convendra cambiar la propiedad Caption de cada uno de los botones para mostrar el texto adecuado. Las propiedades Value y TripleState de un botn de opcin funcionan igual que en el control de verificacin, y el resto de propiedades no son demasiado importantes. Si probamos ahora el userform debera funcionar perfectamente, excepto un pequeo detalle. Si el usuario nos dice que no utiliza ninguna hoja de clculo, los botones de opcin siguen preguntndole cul es su hoja de clculo preferida, lo que evidentemente no tiene ningn sentido. Lo que tenemos que hacer es desactivar los botones de opcin: para desactivar cualquier control (no slo los botones de opcin) 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 cundo ha cambiado de estado (verdadero, falso) la casilla de verificacin cboxUtilizaHoja. Como siempre, lo hacemos con un evento, el evento Change del control de verificacin, 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 opcin. El cdigo es:
Private Sub cboxUtilizaHoja_Change() Frame2.Enabled = cboxUtilizaHoja.Value OptionButton1.Enabled = cboxUtilizaHoja.Value OptionButton2.Enabled = cboxUtilizaHoja.Value OptionButton3.Enabled = cboxUtilizaHoja.Value End Sub

Fjate que damos a la propiedad Enabled de los botones de opcin y el marco el valor de la propiedad Value del control de verificacin. Tambin podramos haber escrito:
If cboxUtilizaHoja.Value = True Then OptionButton1.Enabled = True ..... Else OptionButton1.Enabled = False ..... End If

El resultado es el mismo, pero la primera opcin es bastante ms elegante. Un pequeo detalle. Cuando el userform se inicia tambin deberamos activar/desactivar los botones segn el valor de la casilla de verificacin. Una solucin rpida sera escribir dentro del evento Userform_Initialize (que ya conocemos) el mismo cdigo que en cboxUtilizaHoja_Change, pero no es lo ms adecuado porque estaramos escribiendo el mismo cdigo en dos sitios distintos, cosa que hay que evitar porque si luego tenemos que hacer algn cambio en el cdigo tendremos que hacerlo en dos sitios.
frodrig.com/excel3.htm 5/10

22/04/2010

http://macedoniamagazine.frodrig.co

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:
Private Sub UserForm_Initialize() cboxUtilizaHoja_Change SpinButton1.Value = editEdad.Value End Sub

Pues ya tenemos el userform de datos personales completo, y ya hemos aprendido a usar prcticamente todos los controles. La apariencia final del userform de datos personales es la siguiente.

Como ejercicio, vamos a hacer otro userform, en el que no vamos a utilizar ningn control nuevo pero s vamos a ver un evento nuevo (KeyUp). Lo que vamos a hacer es un dilogo en el que el usuario pueda escribir una cifra en pesetas y automticamente le diremos cuntos euros son. Y al revs, si escribe los euros calcularemos cuntas pesetas son. Pues vamos al VBE, creamos un userform, y ponemos en l dos controles de edicin, que llamaremos editPesetas y editEuros, dos etiquetas al lado de cada control de edicin, y un botn para cerrar el dilogo. Primero lo ms fcil. En el botn de cerrar (al que cambiaremos el Caption para que ponga "Cerrar", y que llamaremos btnCerrar) tenemos que poner el cdigo para cerrar el userform:
Private Sub btnCerrar_Click() Unload Me End Sub

Ahora vamos a los cuadros de edicin. Lo que queremos hacer es que cada vez que el usuario pulse una tecla se actualice el otro cuadro de edicin. Por ejemplo, si el usuario va a escribir 2500 pts, nosotros actualizaremos el cuadro de edicin 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 cdigo de este evento vamos a la ventana de cdigo 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 declaracin de la rutina (con los parmetros adecuados, que en este caso no nos interesan y vamos a
frodrig.com/excel3.htm 6/10

22/04/2010

http://macedoniamagazine.frodrig.co

ignorar) y el "End Sub" correspondiente. Ahora slo 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 pequea forma de deteccin de errores, por si el cuadro de edicin est vaco (de todas formas, se pueden producir muchos errores, como por ejemplo si el usuario introduce una letra en lugar de un nmero, pero no vamos a ponernos ahora a escribir cdigo 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 funcin Format para que slo presente dos decimales. (la funcin Format es muy sencilla de utilizar, si quieres ms informacin consulta la ayuda). Podemos probar a ejecutar ahora el dilogo y veremos que cada vez que introduzcamos un carcter 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 servan para cerrar el userform, con la diferencia de que solemos poner uno para Aceptar y otro para Cancelar. Pero tambin podemos poner en un userform un botn que realice cualquier otra accin pero no cierre el userform. Lo ms tpico es que este botn haga algn 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 edicin, que van a pegar en la celda activa de la hoja de clculo el contenido del cuadro de edicin asociado. Colocamos los dos botones, uno al lado de cada cuadro de edicin, y les damos los nombres btnPegarPts y btnPegarEuros, y les ponemos como Caption algo como "Pegar". Ahora vamos al cdigo:
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 cdigo tampoco tiene ninguna dificultad, simplemente es poner en ActiveCell el valor del control de edicin, editPesetas o editEuros. Como vers, al pulsar estos botones se pega el contenido en la hoja de clculo, pero no se cierra el userform. Si quisiramos que despus de hacer el pegado se cerrara el userform tendramos que aadir el clsico "Unload Me" a las dos rutinas anteriores. As nos ha quedado el userform del conversor de euros:

frodrig.com/excel3.htm

7/10

22/04/2010

http://macedoniamagazine.frodrig.co

Y para terminar esta entrega, vamos a hacer un dilogo para hacer operaciones sobre un rango, como los que ya hemos hecho, pero ms completo. El dilogo va a permitirnos cambiar el rango seleccionado, y luego nos permitir seleccionar la operacin aritmtica que queremos hacer sobre el rango (sumar, restar, multiplicar, dividir) utilizando para ello unos botones de opcin. En este dilogo 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 edicin), 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 ratn o el teclado. Los controles que vamos a poner en este userform son:

Tipo de control Name RefEdit TextBox Frame OptionButton OptionButton OptionButton OptionButton RefEdit1 tbValor Frame1 obSumar obRestar obDividir

Caption N/A N/A Operacin Sumar Restar Dividir Aceptar

obMultiplicar Multiplicar

CommandButton btnAceptar

CommandButton btnCancelar Cancelar


El resultado final ser algo as:

frodrig.com/excel3.htm

8/10

22/04/2010

http://macedoniamagazine.frodrig.co

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 cdigo:
Private Sub UserForm_Initialize() obSumar.Value = True RefEdit1.Text = Selection.Address End Sub

Primero hacemos que la operacin seleccionada por defecto sea sumar (alguna tiene que ser) y que en el RefEdit aparezca como rango la seleccin que tena hecha el usuario antes de llamar al dilogo. 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 cdigo para todas las celdas del rango. El "If" tan largo que utilizamos es bastante ms sencillo de lo que parece: lo nico que hace es comprobar cul es el botn de opcin
frodrig.com/excel3.htm 9/10

22/04/2010

http://macedoniamagazine.frodrig.co

activado (Value = True) y efecta la operacin asociada a ese botn. Y aqu termina la cuarta entrega del curso. Si tienes cualquier duda o comentario que hacer, no dudes en contactar conmigo. En la prxima entrega hablaremos de la creacin de mens y barras de herramientas personalizadas.

Recuerda que los ejemplos de este captulo estn includos en este fichero:

Excel4.xls (116kbs)

[Aula Macedonia] [Curso de VBA para Excel]

AULA MACEDONIA a MACEDONIA Magazine

frodrig.com/excel3.htm

10/10

Вам также может понравиться