You are on page 1of 98

PROGRAMACION VBA SINTAXIS

Uso del Editor de Visual Basic para Aplicaciones


El Editor de Visual Basic es una til herramienta que le permite ampliar la eficacia y versatilidad de las macros ms all de lo posible mediante grabacin. Para abrirlo, seleccione Macro en el men Herramientas y haga clic en Editor de Visual Basic (o presione ALT+F11). Para abrir una macro especfica, seleccione Macro en el men Herramientas y haga clic en Macros (o presione ALT+F8). En el cuadro de dilogo Macro, seleccione la macro que desea editar o ver y haga clic en Editar para abrir el Editor de Visual Basic. Programacin orientada a objetos en el Editor de Visual Basic En el Editor de Visual Basic, puede utilizar la programacin orientada a objetos para crear sus propios programas. Un programa es, en principio, un mero conjunto de instrucciones que un equipo ejecuta en un orden especfico. En los lenguajes de programacin orientada a objetos, todos los aspectos del cdigo informtico se basan en los elementos del entorno. Esos "elementos" se representan como objetos, y todas las acciones y todos los datos estn encapsulados en dichos objetos. En Excel, los objetos pueden ser libros, hojas de clculo, rangos de celdas o archivos externos. En general, hay cuatro aspectos de los objetos que se utilizan para desarrollar un programa: propiedades, mtodos, eventos y colecciones. Propiedades Resumiendo, las propiedades son variables que describen algunos aspectos del objeto en el que estn incluidas. Una propiedad de objeto comn de Excel es Nombre, que encierra el valor identificativo que el usuario o Excel asigna a un libro, a una hoja de clculo, a un rango de celdas o a otro objeto. Por ejemplo, si modifica el nombre de una hoja de clculo (utilizando un cdigo VBA o haciendo clic con el botn secundario en la ficha de la hoja de clculo), se modifica el valor guardado en la propiedad Nombre. Puede definir nuevos valores para algunas propiedades de hoja de clculo (por ejemplo, el nombre) directamente en VBA. Para cambiar otras propiedades de hoja de clculo, es posible que necesite grabar una accin en Excel (por ejemplo, los pasos requeridos para proteger un rango de celdas) o utilizar un mtodo (tal y como se describe en la siguiente seccin). En VBA, se hace referencia a las propiedades en los programas utilizando la notacin con puntos, donde se escribe primero el nombre del objeto y despus el nombre de la propiedad, separando estos dos elementos mediante un punto. Por ejemplo, para modificar el nombre de una hoja de clculo, se utiliza la propiedad hojadeclculo.nombre. Mtodos Un mtodo es una accin que un objeto "sabe" como ejecutar. Por ejemplo, probablemente sabe que la hoja de clculo que se muestra en la ventana de Excel se conoce como hoja de clculo activa. En lenguaje VBA de Excel, puede dirigirse a la hoja de clculo que desea modificar llamando primero a su mtodo Activar. Una vez ejecutado el mtodo Activar, la hoja de clculo a la que est asociado se coloca al frente del resto de las hojas de clculo en la ventana de Excel, quedando disponible para su edicin.

Centro de Formacin solucion.es

pg. 1

Al igual que ocurre con las propiedades, los mtodos se llaman utilizando notacin con puntos. Para volver a calcular todas las frmulas de una hoja de clculo, por ejemplo, hay que llamar al mtodo hojadeclculo.calcular. Eventos Igual que una propiedad es un atributo cuantificable de un objeto y que un mtodo es una accin que el objeto sabe ejecutar, un evento es una accin que el objeto "reconoce" que ha ocurrido. Por ejemplo, Excel 2003 reconoce los siguientes eventos (entre otros muchos): Se ha abierto o cerrado un libro. Se ha activado o desactivado una hoja de clculo. Se ha guardado un libro. Se ha hecho clic en un grfico. Se ha presionado una tecla (o una combinacin de teclas). Se han escrito datos en una celda. Se han calculado de nuevo las frmulas de una hoja de clculo. Se ha seguido un hipervnculo.

Excel incluye varios controladores de eventos, o rutinas de cdigo, que controlan acciones determinadas. Cuando ocurre una de dichas acciones, y ha comunicado a Excel qu desea que haga cuando ocurra el evento, Excel ejecuta el cdigo del controlador de eventos. Por ejemplo, si despus de crear un nuevo libro desea que Excel muestre todos los libros abiertos como un conjunto de ventanas en cascada, puede crear el siguiente controlador de eventos: Private Sub App_NewWorkbook(ByVal Wb As Workbook) Application.Windows.Arrange xlArrangeStyleCascade End Sub No se preocupe si no est seguro de qu hace cada uno de los elementos de la rutina del controlador de eventos. Por ahora, concntrese en la lnea del medio del cdigo, que comunica a Excel que organice las ventanas utilizando el estilo de cascada. Puede obtener el mismo resultado utilizando los comandos de men de Excel (men Ventana, comando Organizar, subcomando Cascada). Sin embargo, si se trata de una accin que desea que se ejecute cada vez que ocurra un evento determinado, puede utilizar el lenguaje VBA para que se ejecute automticamente y as ahorrarse el trabajo. Colecciones El elemento final de la programacin orientada a objetos con el que debe familiarizarse es la coleccin. Tal y como indica su nombre, una coleccin es un grupo de objetos del mismo tipo contenidos en otro objeto. Por ejemplo, un libro contiene una coleccin de una o varias hojas de clculo. Si desea realizar un mismo cambio en todas las hojas de clculo de un libro, puede programar el cambio automtico en todas las hojas de clculo de la coleccin. Si ha creado programas antes, seguramente conozca el bucle For...Next, que permite repetir un grupo de instrucciones varias veces utilizando algo como la siguiente secuencia. (En este ejemplo se agrega la ruta de directorio del libro activo a la seccin derecha del pie de pgina en las primeras tres hojas de clculo.) For i = 1 to 3 Worksheets(i).PageSetup.RightFooter = Path Next i El inconveniente de codificar (es decir, asignar un valor determinado a) el lmite superior de este bucle ForNext es que ser necesario cambiar el cdigo cada vez que se agregue o elimine una hoja de clculo. Esto no es grave si se tiene que hacer una o dos veces, pero si est administrando muchos cdigos, probablemente olvide cambiarlo en algunos sitios. Esto generar errores que tendr que solucionar. Lo que es peor, es posible que los errores pasen inadvertidos hasta que el responsable de

Centro de Formacin solucion.es

pg. 2

calidad descubra que las 500 copias impresas del informe anual no tienen el formato correcto (y que cuando esto ocurra tenga apagado el mvil porque est dando un paseo por la playa). Puede utilizar un cdigo para que le devuelva el nmero de hojas de clculo que se incluyen en el libro, pero hay un modo ms sencillo de hacer esto: utilizar un bucle For EachNext. Los bucles For EachNext buscan el nmero de objetos que hay en una coleccin, por ejemplo las hojas de clculo de un libro, y pasan por todos ellos. Utilizando esta tcnica, el cdigo anterior se puede escribir de este modo: For Each Wksht in Worksheets Wksht.PageSetup.RightFooter = Path Next Wksht En vez de incrementar el valor en un bucle ForNext estndar, el bucle For EachNext busca simplemente el siguiente elemento de la coleccin Worksheets (hojas de clculo) y se detiene cuando no encuentra uno. Editor de Visual Basic y sus ventanas El Editor de Visual Basic muestra distinta informacin en distintas ventanas. Es importante conocer las siguientes ventanas cuando se est aprendiendo a escribir macros: la ventana Explorador del proyecto, la ventana Propiedades y la ventana Cdigo. Ventana Explorador del proyecto Cuando se abre el Editor de Visual Basic directamente, se puede utilizar la ventana Explorador del proyecto para seleccionar la macro en la que se desea trabajar. El Explorador del proyecto muestra todos los proyectos (grupos de cdigos) y las macros que contienen en vista de rbol, como la vista de rbol del Explorador de Windows. La raz u objetos de base de la estructura de rbol son los libros actuales en los que se est trabajando, y los dems libros y complementos que estn abiertos. Cada uno de los elementos principales que se utilizan en los proyectos VBA se guarda en una carpeta independiente en cada proyecto. Estos elementos son: Objetos (descritos anteriormente en este artculo) Mdulos, que contienen el cdigo de macro asociado a la hoja de clculo Mdulos de clase, que son definiciones de los objetos definidos por usuario creados para el libro Formularios de usuario, que ofrecen una superficie visible en la que se pueden colocar controles grficos, como botones, imgenes y reas de texto (estos dos ltimos no ser tratados en este curso).

En el siguiente ejemplo, el libro actual est identificado como VBAProject. Las tres hojas de clculo incluidas en el libro (Hoja1, Hoja2 y Hoja3), as como el libro completo (EsteLibro), aparecen en la carpeta Objetos de Microsoft Office Excel. Las macros programadas en VBA o grabadas aparecen en la carpeta Mdulos. Todos los mdulos de clase o formularios de usuario aparecen en la carpeta Mdulos de clase o Formularios, respectivamente.

Centro de Formacin solucion.es

pg. 3

Ventana Propiedades Justo debajo de la ventana Explorador del proyecto, se encuentra la ventana Propiedades, que se utiliza para examinar y modificar las distintas propiedades asociadas al objeto seleccionado. La nica propiedad que suele estar disponible para los mdulos es el nombre. Las hojas de clculo tienen propiedades adicionales que se pueden modificar, como StandardWidth y DisplayPageBreaks. La modificacin de propiedades en la ventana Propiedades se suele realizar cuando se trabaja con formularios de usuario.
Nota El nombre que se muestra en el cuadro Nombre de la ventana Propiedades correspondiente a un objeto no tiene que coincidir necesariamente con el nombre del objeto en Excel. Puede que sean similares, pero probablemente sean distintos debido a las reglas de nombre predeterminadas que utiliza el Editor de Visual Basic para los objetos. (Por ejemplo, los nombres no pueden incluir espacios en blanco, deben comenzar con una letra, no pueden ser palabras reservadas y no pueden tener una longitud superior a 31 caracteres.) Incluso cuando los nombres son distintos, deben estar vinculados internamente para garantizar que se hace referencia al objeto adecuado.

Ventana Cdigo La ventana Cdigo es la ventana de mayor tamao del Editor de Visual Basic e incluye en su lado superior dos cuadros desplegables. El cuadro desplegable de la izquierda (cuadro Objeto) se utiliza para seleccionar el objeto en el que se quiere trabajar. Cuando se trabaja slo con cdigo, el cuadro muestra el objeto General predeterminado. El segundo cuadro desplegable (cuadro Procedimiento) se utiliza para seleccionar macros individuales del mdulo actual. Segn se agreguen o eliminen macros en el mdulo, se agregarn y eliminarn en el cuadro Procedimiento.

Tambin puede utilizar las teclas de FLECHA ARRIBA o FLECHA ABAJO para desplazarse por las listas del cdigo y buscar la macro que desea. Conforme se vaya desplazando por el cdigo, el cuadro Procedimiento se ir actualizando para reflejar la macro actual.

Centro de Formacin solucion.es

pg. 4

El editor de visual bsic es la aplicacin que utilizaremos para construir las macros que interactuaran junto con los libros de trabajo. A continuacin prepararemos un archivo en el que escribiremos las primeras instrucciones en Visual basic.

Preparar un archivo nuevo


Para entrar en el editor de Visual Basic, active opcin Herramientas/ Macro/ Editor de Visual Bsic. Se abrir la ventana del editor. Maximize la ventana para trabajar ms cmodamente y procure tener activadas la ventana Explorador de proyectos y la ventana Propiedades (Ver/ Explorador de proyectos y Ver/ Ventana propiedades).

Insertar un nuevo mdulo


Un mdulo sirve para agrupar procedimientos y funciones. El procedimiento y la funcin son entidades de programacin que sirven para agrupar instrucciones de cdigo que realizan una accin concreta. Para insertar un mdulo active opcin del men Insertar/ Mdulo. Se activar una nueva ventana, si aparece demasiado pequea, maximcela.

Insertar un procedimiento
Ya hemos dicho que un procedimiento es un bloque de instrucciones de cdigo que sirven para llevar acabo alguna tarea especfica. Un procedimiento empieza siempre con la instruccin Sub Y termina con la instruccin End Sub Sub Nombre_Procedimiento Sentencias de VBA End Sub A continuacin crearemos un procedimiento para poner el texto "Hola" en la casilla A1. [ Ejemplo 1 ] Sub Primero Range("A1").Value = "Hola" End Sub Observe el cdigo Range("A1").Value="Hola". En esta lnea estamos indicando que trabajamos con un objeto Range. Para indicarle que nos referimos a la casilla A1, encerramos entre parntesis esta referencia (ms adelante ver otra forma de referirnos a las celdas). De este objeto, indicamos que queremos establecer un nuevo valor para la propiedad Value, observe que para separar el objeto de su propiedad utilizamos la notacin punto.

Introduccin a los principales Objetos VBA Excel


Como nota el objeto Range es un objeto que pende del objeto WorkSheets, as por ejemplo el siguiente cdigo hara

lo mismo que el anterior. WorkSheets(1).Range("A1").Value = "Hola" . Bueno, de hecho no hace lo mismo, en la primera opcin, el texto "Hola" se pone dentro de la casilla A1 de la hoja activa, mientras que en el segundo es en la casilla A1 de primera hoja (de la coleccin de hojas). La segunda notacin es ms larga, pero tambin ms recomendable ya que se especifican todos los

Centro de Formacin solucion.es

pg. 5

objetos. En muchas ocasiones se pueden omitir algunos objetos precedentes, no le aconsejamos hacerlo, sus programas perdern claridad y concisin. Si desea hacer referencia a la hoja activa puede utilizar ActiveSheet, as, el primer ejemplo lo dejaremos de la manera siguiente. Sub Primero ActiveSheet.Range("A1").Value = "Hola" End Sub Si desea poner "Hola" (o cualquier valor) en la casilla activa, puede utilizar la propiedad (objeto) Activecell de WorkSheets. As para poner "Hola" en la casilla activa de la hoja activa seria, Sub Primero ActiveSheet.ActiveCell.Value = "Hola" End Sub Para terminar con este primer ejemplo. WorkSheets estn dentro del Objeto WorkBooks (libros de trabajo) y WorkBooks estn dentro de Application. Application es el objeto superior, es el que representa la aplicacin Excel. As, el primer ejemplo, siguiendo toda la jerarqua de objetos quedara de la forma siguiente. Sub Primero
Application.WorkBooks(1).WorkSheets(1).Range("A1").Value = "Hola"

End Sub Insistiendo con la nomenclatura, Application casi nunca es necesario especificarlo, piense que todos los objetos penden de este, WorkBooks ser necesario implementarlo si en las macros se trabaja con diferentes libros de trabajo (diferentes archivos), a partir de WorkSheets, es aconsejable incluirlo en el cdigo, sobre todo si se quiere trabajar con diferentes hojas, ver, sin embargo, que en muchas ocasiones no se aplica.

Ejecutar un procedimiento o funcin


Pruebe ejecutar el primer procedimiento de ejemplo. 1. Site el cursor dentro del procedimiento. 2. haga clic sobre el botn ejecutar de la barra de herramientas Para ejecutar el procedimiento desde la hoja de clculo. 1. Debe estar en una hoja, no en el editor de Visual Basic: active opcin de la barra de mens Herramientas/ Macro/ Macros. Se despliega una ventana que muestra una lista donde ests todas las macros incluidas en el libro de trabajo. 2. Seleccione la macro de la lista y pulse sobre el botn Ejecutar. [ Ejemplo 2 ] En este segundo ejemplo simplemente ampliaremos la funcionalidad de la macro del ejemplo 1. Adems de escribir "Hola" en la casilla A1 de la celda A1, la pondremos en negrita y le daremos color al texto. Para ello utilizaremos las propiedades Bold y Color del objeto Font. Sub Segundo ActiveSheet.Range("A1").Value = "Hola" ActiveSheet.Range("A1").Font.Bold = True ActiveSheet.Range("A1").Font.Color = RGB(255,0,0) End Sub o pulsar la tecla F5.

Centro de Formacin solucion.es

pg. 6

True, que traducido es verdadero, simplemente indica que la propiedad Bold est activada. Si se deseara desactivar, bastara con igualarla al valor False. La funcin RGB. Observe que para establecer el color de la propiedad se utiliza la funcin RGB(Red, Green, Blue), los tres argumentos para esta funcin son valores del 0 a 255 que corresponden a la intensidad de los colores Rojo, Verde y Azul respectivamente. Referenciar un rango de celdas. Slo tiene que cambiar a la forma Casilla_Inicial:Casilla_Final. Por ejemplo aplicar el ltimo ejemplo al rango de casillas que va de la A1 a la A8, ponga. Sub Segundo ActiveSheet.Range("A1:A8").Value = "Hola" ActiveSheet.Range("A1:A8").Font.Bold = True ActiveSheet.Range("A1:A8").Font.Color = RGB(255,0,0) End Sub

Variables, objetos y funciones para su tratamiento


A continuacin vamos a repetir el programa Ejemplo1, pero en lugar de poner "Hola" en la casilla A1 de la hoja activa, dejaremos que el usuario entre un texto desde teclado y a continuacin guardaremos ese valor en esa casilla. Observe que el valor que entre del usuario debe guardarse en algn lugar para poder ponerlo despus en la casilla A1; pues bien, ese valor se guardar en una variable. Una variable es simplemente un trozo de memoria que la funcin o procedimiento se reserva para guardar datos, la forma general de declarar una variable es: DIM variable AS tipo. Siendo variable el nombre que se asigna a la misma y Tipo el tipo de datos que se guardarn (nmeros, texto, fecha, boleanos,...). En nuestro ejemplo, declararemos la variable de tipo String (tipo texto), y lo haremos de la forma siguiente. Dim Texto As String Con esto estamos indicando que se reserve un trozo de memoria (el que sea), que se llama Texto y que el tipo de datos que se guardarn ah sern caracteres.

La funcin InputBox Esta funcin muestra una ventana para que el usuario pueda teclear datos. Cuando se pulsa sobre Aceptar, los datos entrados pasan a la variable a la que se ha igualado la funcin. Vea la lnea siguiente. Texto = InputBox("Introduzca el texto", "Entrada de datos"). Si en la ventana que muestra InputBox pulsa sobre el botn Aceptar, los datos tecleados se guardarn el la variable Texto.

Centro de Formacin solucion.es

pg. 7

Sintaxis de InputBox. InputBox(Mensaje, Ttulo, Valor por defecto, Posicin horizontal, Posicin Vertical, Archivo ayuda, Nmero de contexto para la ayuda). Mensaje : Es el mensaje que se muestra en la ventana. Si desea poner ms de una lnea ponga Chr(13) para cada nueva lnea, vea el ejemplo siguiente. Ttulo : Es el ttulo para la ventana InputBox. Es un parmetro opcional. Valor por defecto: Es el valor que mostrar por defecto el cuadro donde el usuario entra el valor. Posicin Horizontal: La posicin X de la pantalla donde se mostrar el cuadro, concretamente es la posicin para la parte izquierda. Si se omite el cuadro se presenta horizontalmente centrado a la pantalla. Posicin Vertical: La posicin Y de la pantalla donde se mostrar el cuadro, concretamente es la posicin para la parte superior. Si se omite el cuadro se presenta verticalmente centrado a la pantalla. Archivo Ayuda: Es el archivo que contiene la ayuda para el cuadro. Parmetro opcional. Nmero de contexto para la ayuda: Nmero asignado que corresponde al identificador del archivo de ayuda, sirve para localizar el texto que se debe mostrar. Si se especifica este parmetro, debe especificarse obligatoriamente el parmetro Archivo Ayuda. [ Ejemplo 3 ] Sub Entrar_Valor
Dim Texto As String ' Chr(13) sirve para que el mensaje se muestre en dos Lneas Texto = InputBox("Introducir un texto " & Chr(13) & "Para la celda A1", _ "Entrada_de datos") ActiveSheet.Range("A1").Value = Texto

End Sub Este ejemplo tambin se puede hacer sin variables. Sub Entrar_Valor
ActiveSheet.Range("A1").Value = InputBox("Introducir un texto "_ & Chr(13) & "Para la casilla A1", "Entrada de datos")

End Sub

[ Ejemplo 4 ] Repetiremos el ejemplo 3, pero en lugar de entrar los valores sobre la casilla A1, haremos que el usuario pueda elegir en que casilla quiere entrar los dat os, es decir, se le preguntar al usuario mediante un segundo Inputbox sobre que casilla quiere entrar el valor del primer Inputbox. Sern necesarias dos variables, una para guardar la casilla que escoja el usuario y otra para guardar el valor.

Centro de Formacin solucion.es

pg. 8

Option Explicit Sub Entrar_Valor Dim Casilla As String Dim Texto As String Casilla = InputBox("En que casilla quiere entrar el valor", _ "Entrar Casilla") Texto = InputBox("Introducir un texto " & Chr(13) & "Para la _ casilla " & Casilla , "Entrada de datos") ActiveSheet.Range(Casilla).Value = Texto End Sub

La sentencia Option Explicit. En visual basic no es necesario declarar las variables, por ejemplo, en el programa anterior se hubiera podido prescindir de las lneas: Dim Casilla As String Dim Texto As String A pesar de ello, le recomendamos que siempre declare las variables que va a utilizar, de esta forma sabr cuales utiliza el procedimiento y que tipo de datos guarda cada una, piense que a medida que vaya aprendiendo, crear procedimientos cada vez ms complicados y que requerirn el uso de ms variables, si no declara las variables al principio del procedimiento ocurrirn dos cosas. Primero, las variables no declaradas son asumidas como tipo Variant (este es un tipo de datos que puede almacenar cualquier valor, nmero, fechas, texto, etc. pero tenga en cuenta que ocupa 20 Bytes y para guardar una referencia a una casilla, la edad de alguien, etc. no son necesarios tantos bytes); segundo, reducir considerablemente la legibilidad de sus procedimientos ya que las variables las ir colocando a medida que las necesite, esto, a la larga complicar la correccin o modificacin del procedimiento. Bueno, pues toda la explicacin anterior es para que declare todas las variables que va a utilizar. La sentencia Option Explicit al principio del mdulo fuerza a que se declaren todas las variables. Si al ejecutar el programa, se encuentra alguna variable sin declarar se producir un error y no se podr ejecutar el programa hasta que se declare. Si todava no se ha convencido sobre la conveniencia de declarar las variables y utilizar Option Explicit, pruebe el procedimiento siguiente, cpielo tal cual (Texto y Testo estn puestos adrede simulando que nos hemos equivocado al teclear). Sub Entrar_Valor Texto = InputBox("Introducir un texto " & Chr(13) & "Para la _ casilla A1", "Entrada de datos") ActiveSheet.Range("A1").Value = Testo End Sub Observe que el programa no hace lo que se pretenda que hiciera. Efectivamente, Texto y Testo son dos variables diferentes, como no se ha declarado ninguna ni se ha utilizado Option Explicit Visual Basic no da ningn tipo de error y ejecuta el programa. Pruebe el siguiente mdulo e intente ejecutarlo.

Centro de Formacin solucion.es

pg. 9

Option Explicit Sub Entrar_Valor Dim Texto As String Texto = InputBox("Introducir un texto " & Chr(13) & "Para la _ casilla A1", "Entrada de datos") ActiveSheet.Range("A1").Value = Testo End Sub Observe que el programa no se ejecuta, al poner Option Explicit, forzamos a que se declaren todas las variables. Visual Basic detecta que la variable Testo no ha sido declarada y as lo indica mostrando Error, entonces es cuando es ms fcil darnos cuenta del error que hemos cometido al teclear y cambiamos Testo por Texto. Ahora imagine que el error se produce en un programa de cientos de lneas que necesita otras tantas variables. Tipos de datos en Visual Basic para Excel.
(Tabla obtenida de la ayuda en lnea de Visual Basic para Excel).

Centro de Formacin solucion.es

pg. 10

Conversin de Tipos de datos. Copie el siguiente Ejemplo. Simplemente se piden dos nmeros, se suman y se guardan el la casilla A1 de la hoja activa. [ Ejemplo 5 ] Option Explicit Sub Sumar()
Dim Numero1 As Integer Dim Numero2 As Integer Numero1 = InputBox("Entrar el primer valor", "Entrada de datos") Numero2 = InputBox("Entrar el primer valor", "Entrada de datos") ActiveSheet.Range("A1").Value = Numero1 + Numero2

End Sub Ejecute el procedimiento y ponga respectivamente los valores 25 y 25. Observe que todo ha ido correctamente y en la casilla A1 de la hoja activa aparece un 50. Ahora, vuelva a ejecutar el programa y cuando se le pide el primer valor teclee "Hola". Observe que el programa se detiene indicando un error en el tipo de datos. Efectivamente, observe que la funcin InputBox devuelve siempre datos tipo String, en el primer ejemplo no ha habido ningn problema, al entrar caracteres numricos, estos pueden asignarse a variables tipo Integer porque Visual Basic hace automticamente la conversin, pero al entrar texto e intentarlo asignar a una variable Integer Visual Basic muestra un error indicando que la variable no es adecuada para los datos que se desean guardar. Para solucionar estos problemas se deben utilizar funciones de conversin de tipo. Estas funciones, como su nombre indica, convierten datos de un tipo a otro, de String a Integer, de Integer a String, de Date a String ,... As el procedimiento anterior quedara. Option Explicit Sub Sumar()
Dim Numero1 As Integer Dim Numero2 As Integer Numero1 = Val(InputBox("Entrar el primer valor", "Entrada de datos")) Numero2 = Val(InputBox("Entrar el primer valor", "Entrada de datos")) ActiveSheet.Range("A1").Value = Numero1 + Numero2

End Sub La funcin Val(Dato String), convierte una cadena de caracteres a valor numrico. Si la cadena a convertir contiene algn carcter no numrico devuelve 0. As, si al pedir un valor se teclea "Hola", la funcin Val, devolver un cero. Tenga en cuenta que para los ordenadores no es lo mismo el nmero 1 que el carcter "1". En los lenguajes de programacin actuales la conversin de carcter "1" a nmero 1 se hace automticamente en muchos casos, esto es bueno y es malo. Es bueno porque nos ahorra tener que hacer las conversiones y es malo porque es ms difcil controlar ciertos casos. Siga con los ejemplos y entender de lo que estamos hablando. Slo para su informacin, el ordenador guarda el nmero 1 de la siguiente manera 00000001, mientras que el carcter "1" se guarda como 00110000 (el nmero 48 del cdigo ASCII).

Centro de Formacin solucion.es

pg. 11

Funciones de conversin de tipos. Val(Cadena). Convierte la cadena a un valor numrico. Str(Nmero). Convierte el nmero a una expresin cadena. Las siguientes funciones tienen la forma Funcin(Expresin).
(Tabla copiada de la ayuda en lnea de Visual Basic para Excel).

Bueno, despus de esta introduccin a las variables, pasemos a estudiar unos cuantos objetos y propiedades que se utilizan habitualmente. Objeto Cells(fila, columna). Sirve, como el objeto range, para referenciar una casilla o rango de casillas, pero en lugar de utilizar la referencia de la forma A1, B1, X320,... utiliza la fila y la columna que ocupa la casilla dentro de la hoja (objeto WorkSheet). Por ejemplo, para poner hola en la casilla A1 de la hoja activa seria,
ActiveSheet.Cells(1,1).Value="Hola"

Utilizar Cells para referenciar un rango. Esto seria el equivalente a Range("Casilla_Inicial:Casilla_Final"). La forma que se obtiene utilizando Cells es un poco ms larga, pero se ver que a veces resulta mucho ms funcional que utilizando nicamente range. Para referirnos al rango A1:B8, pondremos:
Range(Cells(1, 1), Cells(8, 2)).Value = "Hola"

Otra forma interesante de Cells es la siguiente:


Range("A5:B10").Cells(2, 1).Value = "Hola"

Pondr en la celda A6 el valor "Hola", observe que en este ejemplo Cells comienza a contar filas y columnas a partir del rango especificado en el objeto Range.

Centro de Formacin solucion.es

pg. 12

Variables de Objetos
Una variable objeto sir ve para hacer referencia a un objeto, esto significa que podremos acceder a las propiedades de un objeto e invocar a sus mtodos a travs de la variable en lugar de hacerlo directamente a travs del objeto. Posiblemente no se utilice demasiado esta clase de variables (esta claro que esto depender de las preferencias del programador), pero hay casos en los que no hay ms remedio que utilizarlas , por ejemplo en estructuras For Each ... Next como veremos, o cuando sea necesario construir funciones que devuelvan rangos, referencias a hojas, etc. Para declarar una variable objeto se utiliza tambin la palabra Dim de la forma siguiente:
Dim Var_Objeto As Objeto

Por Ejemplo:
Dim R As Range Dim Hoja As WorkSheet

Para asignar un objeto a una variable debe utilizar la instruccin Set.


Set Variable_Objeto = Objeto

Por Ejemplo:
Set R= ActiveSheet.Range("A1:B10") Set Hoja = ActiveSheet Set Hoja = WorkSheets(1)

Veamos a continuacin un ejemplo de cmo utilizar este tipo de variables. [ Ejemplo 6 ] Algo muy simple, llenar el rango de A1 a B10 con la palabra "Hola" y despus poner negrita, observe como se asigna una variable objeto al objeto y luego como se trabaja con esa variable de la misma forma que trabajara directamente sobre el objeto.
Sub obj() Dim R As Range Set R = ActiveSheet.Range("A10:B15") R.Value = "Hola" R.Font.Bold = True End Sub

El valor Nothing. Algunas veces puede que sea necesario desasignar una variable del objeto al cual hace referencia, en este caso debe igualar la variable al valor Nothing de la forma siguiente.
Set Variable_Objeto = Nothing

Habitualmente se utiliza Nothing en una estructura condicional para comprobar si la variable objeto est asignada. Observe que si se utiliza una variable objeto a la cual todava no se le ha hecho ninguna asignacin el programa dar error y detendr su ejecucin. Es buena prctica hacer este tipo de comprobaciones antes de trabajar con variables objeto. Veremos un ejemplo de esto en el tema siguiente.

Centro de Formacin solucion.es

pg. 13

Estructuras condicionales
Ahora que ya ha experimentado con unos cuantos objetos y propiedades, nos detendremos a estudiar las estructuras condicionales. Las estructuras condicionales son instrucciones de programacin que permiten controlar la ejecucin de un fragmento de cdigo en funcin de si se cumple o no una condicin. Estudiaremos en primer lugar la instruccin if Condicin then..End if (Si Condicin Entonces...Fin Si) La estructura condicional que se construye con la instruccin Si Condicin Entonces... Fin Si tiene la forma siguiente. Si Condicin Entonces Sentencia 1 Sentencia 2 .. Sentencia N Fin Si Cuando el programa llega a la instruccin Si Condicin Entonces, se evala la condicin, si esta se cumple (es cierta), se ejecutan todas las sentencias que estn encerradas en el bloque, si no se cumple la condicin, se saltan estas sentencias. Esta estructura en Visual Basic tiene la sintaxis siguiente:
If Condicin Then Sentencia 1 Sentencia 2 Sentencia N End If

[ Ejemplo 6 ] Entrar una cantidad que representa el precio de algo por el teclado con la instruccin InputBox y guardarlo en la celda A1 de la hoja activa. Si el valor entrado desde el teclado (y guardado en A1) es superior a 1000, pedir descuento con otro InputBox y guardarlo en la casilla A2 de la hoja activa. Calcular en A3, el precio de A1 menos el descuento de A2.
Sub Condicional()
' Poner las casillas donde se ActiveSheet.Range("A1").Value ActiveSheet.Range("A2").Value ActiveSheet.Range("A3").Value ActiveSheet.Range("A1").Value guardan los valores 0. = 0 = 0 = 0 = Val(InputBox("Entrar el precio", "Entrar"))

' Si el valor de la casilla A1 es mayor que 1000, entonces, pedir descuento If ActiveSheet.Range("A1").Value > 1000 Then ActiveSheet.Range("A2").Value = Val(InputBox("Entrar Descuento", "Entrar")) End If ActiveSheet.Range("A3").Value = ActiveSheet.Range("A1").Value - _ ActiveSheet.Range("A2").Value

End Sub

Centro de Formacin solucion.es

pg. 14

[ Ejemplo 7 ] El mismo que el anterior pero utilizando variables.


Option Explicit Sub Condicional()
Dim Precio As Integer Dim Descuento As Integer Precio = 0 Descuento = 0 Precio = Val(InputBox("Entrar el precio", "Entrar")) ' Si el valor de la variable precio es mayor que 1000, entonces, pedir descuento If Precio > 1000 Then Descuento = Val(InputBox("Entrar Descuento", "Entrar")) End If ActiveSheet.Range("A1").Value = Precio ActiveSheet.Range("A2").Value = Descuento ActiveSheet.Range("A3").Value = Precio Descuento

End Sub

Viendo los dos programas anteriores puede que le surja la duda de si emplear variables o directamente valores almacenados en las celdas. La solucin es fcil, lo que le parezca ms conveniente en cada caso concreto que desee solucionar. Las variables, aunque muchas veces "innecesarias", quizs dejan los programas ms legibles y claros. Y la legibilidad de un programa es lo ms valioso del mundo para un programador (profesionalmente hablando), sobre todo si se da el caso (inevitable el 99,999...% de las ocasiones) que se tenga que modificar un programa para dotarle de ms funcionalidades, facilitar su manejo, etc. En la mayora de ejemplos que encontrar en este manual ver que se utilizan variables preferentemente. Aunque muchas veces su funcin sea simplemente recoger datos de las celdas para operarlas y dejarlas en otras celdas y, consecuentemente, aumente el nmero de operaciones, creemos que con ello se gana en legibilidad y flexibilidad.

[ Ejemplo 8 ] Macro que compara los valores de las casillas A1 y A2 de la hoja activa. Si son iguales pone el color de la fuente de ambas en azul.
Sub Condicional2() If ActiveSheet.Range("A1").Value = ActiveSheet.Range("A2").Value Then ActiveSheet.Range("A1").Font.Color = RGB(0, 0, 255) ActiveSheet.Range("A2").Font.Color = RGB(0, 0, 255) End If End Sub

Centro de Formacin solucion.es

pg. 15

Estructura If..Else
Esta estructura se utiliza cuando se requiere una respuesta alternativa a una condicin. Su estructura es la siguiente. Si Condicin Entonces Sentencia 1 Sentencia 2 .. Sentencia N Sino Sentencia 1 Sentencia 2 .. Sentencia N Fin Si Observe que, si se cumple la condicin, se ejecuta el bloque de sentencias delimitado por Si Condicin Entonces y Si no se cumple la condicin se ejecuta el bloque delimitado por Sino y Fin Si. En Visual Basic la instruccin Si Condicin Entonces ... Sino ... Fin Si se expresa con las instrucciones siguientes.:
If Condicin Then Sentencia 1 Sentencia 2 Sentencia N Else Sentencia 1 Sentencia 2 Sentencia N End If

[ Ejemplo 9 ] Entrar una cantidad que representa el precio de algo por el teclado con la instruccin InputBox y guardarlo en la celda A1 de la hoja activa. Si el valor entrado desde el teclado (y guardado en A1) es superior a 1000, se aplica un descuento del 10% sino se aplica un descuento del 5%, el descuento se guarda en la casilla A2 de la hoja activa. Colocar en A3, el total descuento y en A4 el total menos el descuento.
Sub Condicional_Else() Dim Precio As Single Dim Descuento As Single Precio = 0 Precio = Val(InputBox("Entrar el precio", "Entrar"))
' Si el valor de la variable precio es mayor que 1000, entonces, aplicar descuento del 10%

If Precio > 1000 Then Descuento = Precio * (10 / 100) ActiveSheet.Range("A2").Value = 0,1 Else ' Sino Aplicar descuento del 5% Descuento = Precio * (5 / 100) ActiveSheet.Range("A2").Value = 0,05 End If ActiveSheet.Range("A1").Value = Precio ActiveSheet.Range("A3").Value = Descuento ActiveSheet.Range("A4").Value = Precio Descuento End Sub

Centro de Formacin solucion.es

pg. 16

[ Ejemplo 10 ] Restar los valores de las casillas A1 y A2. Guardar el resultado en A3. Si el resultado es positivo o 0, poner la fuente de A3 en azul, sino ponerla en rojo.
Sub Condicional_Else2() ActiveSheet.Range("A3").Value = AvtiveSheet.Range("A1").Value - _ ActiveSheet.Range("A2").Value If ActiveSheet("A3").Value < 0 Then ActiveSheet.Range("A3").Font.Color = RGB(255,0,0) Else ActiveSheet.Range("A3").Font.Color = RGB(0,0,255) End If End Sub

Estructuras If anidadas
No tiene que sorprenderle, dentro de una estructura if puede ir otra, y dentro de esta otra, y otra... Vea el ejemplo siguiente. Ejemplo 11. Comparar los valores de las casillas A1 y A2 de la hoja activa. Si son iguales, escribir en A3 "Los valores de A1 y A2 son iguales", si el valor de A1 es mayor que A2, escribir "A1 mayor que A2", sino, escribir "A2 mayor que A1" .
Sub Condicional()
If ActiveSheet.Range("A1").Value = ActiveSheet.Range("A2").Value Then ActiveSheet.Range("A3").Value = "Los Valores de A1 y A2 son iguales" Else If ActiveSheet.Range("A1").Value > ActiveSheet.Range("A2").Value Then ActiveSheet.Range("A3").Value = "A1 mayor que A2" Else ActiveSheet.Range("A3").Value = "A2 mayor que A1" End If End If

End Sub

Observe que la segunda estructura If..Else..End If queda dentro del Else de la primera estructura. Esta es una regla general, cuando pone un End If, este cierra siempre el ltimo If (o Else) abierto.

Operadores lgicos
Estos operadores se utilizan cuando se necesitan evaluar dos o ms condiciones para decidir si se ejecutan o no determinadas acciones. Operador Lgico And (Y). Utilizaremos este operador cuando sea preciso que para ejecutar un bloque de instrucciones se cumpla ms de una condicin. Observe que debern cumplirse todas las condiciones. Vea el ejemplo siguiente.

Centro de Formacin solucion.es

pg. 17

[ Ejemplo 12 ] Entrar el Nombre, la cantidad y el precio de un producto desde el teclado y guardarlos respectivamente en A1, A2 y A3. Calcular el total y guardarlo en A4. Si el total es superior a 10.000 y el nombre del producto es "Patatas", pedir un descuento, calcularlo el total descuento y guardarlo en A5, luego restar el descuento del total y guardarlo en A6.
Sub Ejemplo_12() Dim Dim Dim Dim Dim Dim Producto As String Cantidad As Integer Precio As Single Total As Single Descuento As Single Total_Descuento As Single

Precio = 0 Producto = InputBox("Entrar Nombre del Producto","Entrar") Precio = Val(InputBox("Entrar el precio", "Entrar")) Precio = Val(InputBox("Entrar la cantidad", "Entrar")) Total = Precio * Cantidad ActiveSheet.Range("A1").Value ActiveSheet.Range("A2").Value ActiveSheet.Range("A3").Value ActiveSheet.Range("A4").Value = = = = Producto Precio Cantidad Total

' Si total mayor que 10.000 y el producto es Patatas, aplicar descuento. If Total > 10000 And Producto = "Patatas" Then Descuento = Val(InputBox("Entrar Descuento", "Entrar")) Total_Descuento = Total * (Descuento / 100) Total = Total - Total_Descuento ActiveSheet.Range("A5").Value = Total_Descuento ActiveSheet.Range("A6").Value = Total End If End Sub

Observe que para que se ejecute el bloque de instrucciones entre If.. End If deben cumplirse las dos condiciones que se evalan, si falla cualquiera de las dos (o las dos a la vez), no se ejecuta dicho bloque. Operador Lgico Or (O). Utilizaremos este operador cuando sea preciso que para ejecutar un bloque de instrucciones se cumpla alguna de una serie de condiciones. Observe que slo es necesario que se cumpla alguna de las condiciones que se evalan. Vea el ejemplo siguiente. [ Ejemplo 13 ] Entrar el Nombre, la cantidad y e l precio de un producto desde el teclado y guardarlos respectivamente en A1, A2 y A3. Calcular el total y guardarlo en A4. Si el total es superior a 10.000 o el nombre del producto el "Patatas", pedir un descuento, calcularlo el total descuento y guardarlo en A5, luego restar el descuento del total y guardarlo en A6.
Sub Ejemplo_13() Dim Dim Dim Dim Producto As String Cantidad As Integer Precio As Single Total As Single

Centro de Formacin solucion.es

pg. 18

Dim Descuento As Single Dim Total_Descuento As Single Precio = 0 Producto = InputBox("Entrar Nombre del Producto","Entrar") Precio = Val(InputBox("Entrar el precio", "Entrar")) Precio = Val(InputBox("Entrar la cantidad", "Entrar")) Total = Precio * Cantidad ActiveSheet.Range("A1").Value ActiveSheet.Range("A2").Value ActiveSheet.Range("A3").Value ActiveSheet.Range("A4").Value = = = = Producto Precio Cantidad Total

' Si total mayor que 10.000 o el producto es Patatas, aplicar descuento. If Total > 10000 Or Producto = "Patatas" Then Descuento = Val(InputBox("Entrar Descuento", "Ent rar")) Total_Descuento = Total * (Descuento / 100) Total = Total - Total_Descuento ActiveSheet.Range("A5").Value = Total_Descuento ActiveSheet.Range("A6").Value = Total End If End Sub

Observe que para que se ejecute el bloque de instrucciones entre If. End If slo es necesario que se cumpla alguna de las dos condiciones que se evalan (o las dos a la vez). Slo cuando no se cumple ninguna de las dos no se ejecutan las instrucciones del bloque. Operador Lgico Not (no). Este operador se utiliza para ver si NO se cumple una condicin. El siguiente ejemplo hace lo mismo que el ejemplo 7 pero utilizando el operador Not. [ Ejemplo 14 ] Entrar una cantidad que representa el precio de algo por el teclado con la instruccin InputBox y guardarlo en la celda A1 de la hoja activa. Si el valor entrado desde el teclado (y guardado en A1) es superior a 1000, pedir descuento con otro InputBox y guardarlo en la casilla A2 de la hoja activa. Calcular en A3, el precio de A1 menos el descuento de A2.
Sub Ejemplo_14() Dim Precio As Integer Dim Descuento As Integer Precio = 0 Descuento = 0 Precio = Val(InputBox("Entrar el precio", "Entrar")) ' Si el valor de la variable precio NO es menor igual 1000, entonces, ' pedir descuento If Not (Precio <= 1000) Then Descuento = Val(InputBox("Entrar Descuento", "Entrar")) End If ActiveSheet.Range("A1").Value = Precio ActiveSheet.Range("A2").Value = Descuento ActiveSheet.Range("A3").Value = Precio Descuento End Sub

Centro de Formacin solucion.es

pg. 19

Tablas de la verdad. Vea las tablas siguientes para ver los resultados de evaluar dos condiciones con el operador And y con el operador Or.

Observe que con el operador AND deben de cumplirse todas las condiciones (dos o n condiciones) para que el resultado sea cierto. Con el operador OR slo es necesario que se cumpla una (de las dos o de las n) para que el resultado sea cierto.

Estructura Select Case


En ocasiones se dar el caso que en funcin del valor o rango de valores que pueda tener una variable, una casilla, una expresin, etc. debern llevarse a cabo diferentes acciones o grupos de acciones. Vea el ejemplo siguiente. [ Ejemplo 15 ] Macro que suma, resta, multiplica o divide los valores de las casillas A1 y A2 dependiendo de si B1 contiene el signo +, -, x, :. El resultado lo deja en A3. Si en B1 no hay ninguno de los signos anteriores en A3 debe dejarse un 0.
Sub Ejemplo_15() Dim Signo As String Dim Valor1 As Integer, Valor2 As Integer, Total As Integer Valor1 = ActiveSheet.Range("A1").Value Valor2 = ActiveSheet.Range("A2").Value Signo = ActiveSheet.Range("B1").Value Total=0 If Signo = "+" Then Total = Valor1 + Valor2 End if If Signo = "-" Then Total = Valor1 - Valor2 End if If Signo = "x" Then Total = Valor1 * Valor2 End if If Signo = ":" Then Total = Valor1 / Valor2 End if ActiveCell.Range("A3").Value = Total End Sub

Observe que en el ejemplo anterior todas las instrucciones if evalan la misma variable. El programa

Centro de Formacin solucion.es

pg. 20

funciona correctamente pero para estos casos es mejor utilizar la instruccin Select Case, el motivo principal es por legibilidad y elegancia. Select Case tiene la sintaxis siguiente:
Select Case Expresin Case valores Instrucciones Case valores Instrucciones Case valores Instrucciones Case Else Instrucciones en caso que no sean ninguno de los valores anteriores. End Select

Vea el ejemplo anterior solucionado con esta estructura. [ Ejemplo 16 ]


Sub Ejemplo_16() Dim Signo As String Dim Valor1 As Integer, Valor2 As Integer, Total As Integer Valor1 = ActiveSheet.Range("A1").Value Valor2 = ActiveSheet.Range("A2").Value Signo = ActiveSheet.Range("A3").Value Select Case signo Case "+" Total = Valor1 + Valor2 Case "-" Total = Valor1 - Valor2 Case "x" Total = Valor1 * Valor2 Case ":" Total = Valor1 / Valor2 Case Else Total = 0 End Select ActiveCell.Range("A3").Value = Total End Sub

Centro de Formacin solucion.es

pg. 21

Vea el ejemplo siguiente donde cada sentencia Case evala un rango de valores. [ Ejemplo 17 ] Programa que pide tres notas de un alumno mediante la funcin InputBox. Las notas van a parar respectivamente a las casillas A1, A2 y A3 de la hoja activa. El programa calcula la media y la deja en A4. Si la media est entre 0 y 2 deja en A5 el mensaje "Muy deficiente", si la nota es 3 deja en A5 el mensaje "Deficiente", si la nota es 4 deja "Insuficiente", si es 5 "Suficiente", si es 6 "Bien", si est entre 7 y 8 deja "Notable", si es mayor que 8 deja "Sobresaliente".
Sub Ejemplo_17() Dim Nota1 As Integer, Nota2 As Integer, Nota3 As Integer Dim Media As Single Nota1 Nota2 Nota3 Media = = = = Val(InputBox("Entrar Nota Val(InputBox("Entrar Nota Val(InputBox("Entrar Nota (Nota1 + Nota2 + Nota3) / = = = = primera evaluacin", "Nota")) Segunda evaluacin", "Nota")) Tercera evaluacin", "Nota")) 3

ActiveSheet.Range("A1").Value ActiveSheet.Range("A2").Value ActiveSheet.Range("A3").Value ActiveSheet.Range("A4").Value Select Case Media

Nota1 Nota2 Nota3 Media

Case 0 To 2 ActiveSheet.Range("A5").Value = "Muy deficiente" Case 3 ActiveSheet.Range("A5").Value = "Deficiente" Case 4 ActiveSheet.Range("A5").Value = "Insuficiente" Case 5 ActiveSheet.Range("A5").Value = "Suficiente" Case 6 ActiveSheet.Range("A5").Value = "Bien" Case 7 To 8 ActiveSheet.Range("A5").Value = "Notable" Case >8 ActiveSheet.Range("A5").Value = "Sobresaliente" End Select End Sub

Centro de Formacin solucion.es

pg. 22

Funciones de comprobacin
Antes de terminar con el tema de condicionales veremos unas funciones que nos sern tiles a la hora de comprobar o validar el tipo de los datos entrados desde teclado o simplemente los datos contenidos en una celda. Volvamos al ejemplo 16 que codificamos de la manera siguiente:
Sub Ejemplo_16() Dim Signo As String Dim Valor1 As Integer, Valor2 As Integer, Total As Integer Valor1 = ActiveSheet.Range("A1").Value Valor2 = ActiveSheet.Range("A2").Value Signo = ActiveSheet.Range("A3").Value Select Case signo Case "+" Total = Valor1 + Valor2 Case "-" Total = Valor1 - Valor2 Case "x" Total = Valor1 * Valor2 Case ":" Total = Valor1 / Valor2 Case Else Total = 0 End Select ActiveCell.Range("A3").Value = Total End Sub

Imagine que en alguna de las casillas que se deben operar no hubiera ningn valor o bien datos alfanumricos. Al ejecutar la macro se producir un error. Aunque con Visual Basic se puede controlar el flujo del programa cuando se produce un error imprevisto, para solucionar este problema utilizaremos una funcin de comprobacin que nos diga si en las casillas A1 y A2 hay valores adecuados (numricos) para proseguir con la ejecucin de la macro, en caso contrario se mostrar un error y no se ejecutar ninguna de las operaciones. La funcin que utilizaremos es IsNumeric(expresin), esta funcin devuelve un valor True si la expresin que se evala es un valor numrico, en caso contrario devuelve False. Vea como quedara el programa. Tambin se utiliza la funcin IsEmpty para comprobar si en B1 hay algo, IsEmpty(Expresin) evala si xpresin est vaca, devuelve True si es as y False en caso contrario. [ Ejemplo 18 ]
Sub Ejemplo_18() Dim Signo As String Dim Valor1 As Integer, Valor2 As Integer, Total As Integer Dim Continuar As Boolean

Centro de Formacin solucion.es

pg. 23

Valor1 = ActiveSheet.Range("A1").Value Valor2 = ActiveSheet.Range("A2").Value Signo = ActiveSheet.Range("A3").Value Continuar = True ' Si en la casilla A1 no hay un valor numrico If Not IsNumeric(ActiveSheet.Range("A1")) Then MsgBox Prompt:="En la casilla A1 no hay ningn valor numrico", _ Title:="ERROR" Continuar= False End If

' Si en la casilla A2 no hay un valor numrico If not IsNumeric(ActiveSheet.Range("A2")) Then MsgBox Prompt:="En la casilla A2 no hay ningn valor numrico", _ Title:="ERROR" Continuar= False End If If IsEmpty(ActiveSheet.Range("B1")) Then MsgBox Prompt:="la casilla B1 est vaca", Title:="ERROR" Continuar= False End If If Continuar Then Select Case signo Case "+" Total = Valor1 + Valor2 Case "-" Total = Valor1 - Valor2 Case "x" Total = Valor1 * Valor2 Case ":" Total = Valor1 / Valor2 Case Else Total = 0 End Select ActiveCell.Range("A3").Value = Total End If End Sub

En lugar de los tres If de comprobacin se hubiera podido utilizar el operador OR de la manera siguiente:
If not IsNumeric(ActiveSheet.Range("A1")) Or not IsNumeric(ActiveSheet.Range("A2")) _ Or IsEmpty(ActiveSheet.Range("B1")) Then MsgBox Prompt:="Debe entrar nmeros en A1 y A2 y un signo (+,-,x, : ) en B1, _ Title:="ERROR" Else ' Instrucciones de las operaciones End if

Centro de Formacin solucion.es

pg. 24

Lista de Funciones de Comprobacin. IsNumric(Expresin). Comprueba si expresin tiene un valor que se puede interpretar como numrico. IsDate(Expresin). Comprueba si expresin tiene un valor que se puede interpretar como tipo fecha. IsEmpty(Expresin). Comprueba que expresin tenga algn valor, que se haya inicializado. IsError(Expresin). Comprueba si expresin devuelve algn valor de error. IsArray(Expresin). Comprueba si expresin (una variable) es un array o no. IsObject(Expresin). Comprueba si expresin (una variable) representa una variable tipo objeto. IsNull(Expresin). Comprueba si expresin contiene un valor nulo debido a datos no vlidos. Nothing. No es propiamente una funcin, sirve para comprobar si una variable objeto esta asociada a un objeto antes de hacer cualquier operacin con ella. Recuerde que para trabajar con una variable objeto antes debe asignarse a uno (mediante la instruccin Set), en caso contrario se producir un error en el programa cuando utilice el objeto y se detendr su ejecucin.
Sub Obj() Dim R As Range ' Si la variable R es Nothing es que no ha sido asignada, no se puede ' trabajar con ella If R Is Nothing Then MsgBox Prompt := "La variable Objeto no ha sido asignada", _ Buttons:=vbOk, Title := "Error" Else R.Value = "Hola" End If End Sub

Centro de Formacin solucion.es

pg. 25

La funcin MsgBox
Esta funcin muestra un mensaje en un cuadro de dilogo hasta que el usuario pulse un botn. La funcin devuelve un dato tipo Integer en funcin del botn pulsado por el usuario. A la hora de invocar est funcin, s e permiten diferentes tipos de botones. Sintaxis de MsgBox.
MsgBox( Mensaje, Botones, Ttulo, Archivo de ayuda, contexto)

Mensaje: Obligatorio, es el mensaje que se muestra dentro del cuadro de dilogo. Botones: Opcional. Es un nmero o una suma de nmeros o constantes (vea tabla Valores para botones e Iconos), que sirve para mostrar determinados botones e iconos dentro del cuadro de dilogo. Si se omite este argumento asume valor 0 que corresponde a un nico Botn OK. Ttulo: Opcional. Es el texto que se mostrar en la barra del ttulo del cuadro de dilogo. Archivo de Ayuda: Opcional. Si ha asignado un texto de ayuda al cuadro de dilogo, aqu debe especificar el nombre del archivo de ayuda donde est el texto. Contexto: Opcional. Es el nmero que sirve para identificar el texto al tema de ayuda correspondiente que estar contenido en el archivo especificado en el parmetro Archivo de Ayuda.

Tabla para botones e iconos del cuadro MsgBox.


(Tabla copiada del archivo de ayuda de Microsoft Excel).

El primer grupo de valores (0 a 5) describe el nmero y el tipo de los botones mostrados en el cuadro de dilogo; el segundo grupo (16, 32, 48, 64) describe el estilo del icono, el tercer grupo (0, 256, 512) determina el botn predeterminado y el cuarto grupo (0, 4096) determina la modalidad del cuadro de mensajes. Cuando se suman nmeros para obtener el valor final del argumento buttons, se utiliza solamente un nmero de cada grupo. Nota Estas constantes las especifica Visual Basic for Applications. Por tanto, el nombre de las mismas puede utilizarse en cualquier lugar del cdigo en vez de sus valores reales.

Centro de Formacin solucion.es

pg. 26

Los valores que puede devolver la funcin msgbox en funcin del botn que pulse el usuario se muestran en la tabla siguiente.

Tabla de valores que puede devolver MsgBox

Ejemplos de MsgBox. El cuadro Muestra los botones Si y No y un icono en forma de interrogante. Cuando se pulsa un botn, el valor lo recoge la variable X. En este caso los valores devueltos pueden ser 6 o 7 que corresponden respectivamente a las constantes VbYes y VbNo, observe la instruccin If de despus.

Sub Tal() X = MsgBox("Desea Continuar", vbYesNo + vbQuestion, "Opcin",,) ' Se ha pulsado sobre botn Si If X = vbYes Then Else ' Se ha pulsado sobre botn No EndIf End Sub

Algunas veces puede que le interese simplemente desplegar un cuadro MsgBox para mostrar un mensaje al usuario sin que se requiera recoger ningn valor. En este caso puede optar por la forma siguiente (sin los parntesis de funcin): MsgBox "Hola usuario, Ha acabado el proceso", VbOkOnly, "Mensaje" Lo que no puede hacer porque Visual Basic dara error es poner la primera forma sin igualarla a ninguna variable. Por ejemplo, la expresin siguiente es incorrecta: MsgBox ("Hola usuario, Ha acabado el proceso", VbOkOnly, "Mensaje") Seria correcto poner: X= MsgBox ("Hola usuario, Ha acabado el proceso", VbOkOnly, "Mensaje") En este caso, aunque X reciba un valor, luego no se utiliza para nada, es decir simplemente se pone para que Visual Basic no genere un error.

Centro de Formacin solucion.es

pg. 27

La instruccin With
Suponemos que llegado a este punto le parecer engorroso tener que referirse a los objetos siguiendo toda o casi toda la jerarqua. La sentencia With le ayudar a tener que escribir menos cdigo sin que por esto el programa pierda en claridad. Concretamente esta funcin sirve para ejecutar una serie de acciones sobre un mismo Objeto. Su sintaxis es la siguiente: With Objeto Instrucciones End With Repetiremos el ejemplo 13 utilizando esta sentencia. Observe como con With se hace referencia al objeto ActiveSheet. [ Ejemplo 19 ] Entrar el Nombre, la cantidad y el precio de un producto desde el teclado y guardarlos respectivamente en A1, A2 y A3. Calcular el total y guardarlo en A4. Si el total es superior a 10.000 o el nombre del producto el "Patatas", pedir un descuento, calcularlo el total descuento y guardarlo en A5, luego restar el descuento del total y guardarlo en A6. Sub Ejemplo_19() Dim Dim Dim Dim Dim Dim Producto As String Cantidad As Integer Precio As Single Total As Single Descuento As Single Total_Descuento As Single

Precio = 0 Producto = InputBox("Entrar Nombre del Producto","Entrar") Precio = Val(InputBox("Entrar el precio", "Entrar")) Precio = Val(InputBox("Entrar la cantidad", "Entrar")) Total = Precio * Cantidad With ActiveSheet .Range("A1").Value .Range("A2").Value .Range("A3").Value .Range("A4").Value End With

= = = =

Producto Precio Cantidad Total

' Si total mayor que 10.000 o el producto es Patatas, aplicar ' descuento. If Total > 10000 Or Producto = "Patatas" Then Descuento = Val(InputBox("Entrar Descuento", "Entrar")) Total_Descuento = Total * (Descuento / 100) Total = Total - Total_Descuento With ActiveSheet .Range("A5").Value = Total_Descuento .Range("A6").Value = Total End With End If End Sub

Centro de Formacin solucion.es

pg. 28

Estructuras Repetitivas
Este tipo de estructuras permiten ejecutar ms de una vez un mismo bloque de sentencias. [ Ejemplo 20 ] Supongamos que tenemos que hacer un programa para entrar las notas de una clase de 5 alumnos que se guardaran respectivamente en las celdas de A1 a A5 de la hoja activa. Despus hacer la media que se guardar en A6. Con las estructuras vistas hasta ahora, podramos hacer: Sub Ejemplo_20 () Dim Nota As Integer Dim Media As Single Media = 0 Nota = Val(InputBox("Entrar la 1 Nota : ","Entrar Nota")) ActiveSheet.Range("A1").Value = Nota Media = Media + Nota Nota = Val(InputBox("Entrar la 2 Nota : ","Entrar Nota")) ActiveSheet.Range("A2").Value = Nota Media = Media + Nota Nota = Val(InputBox("Entrar la 3 Nota : ","Entrar Nota")) ActiveSheet.Range("A3").Value = Nota Media = Media + Nota Nota = Val(InputBox("Entrar la 4 Nota : ","Entrar Nota")) ActiveSheet.Range("A4").Value = Nota Media = Media + Nota Nota = Val(InputBox("Entrar la 5 Nota : ","Entrar Nota")) ActiveSheet.Range("A5").Value = Nota Media = Media + Nota Media = Media / 5 ActiveSheet.Range("A6").Value = Media End Sub Observe que este programa repite el siguiente bloque de sentencias, 5 veces. Nota = Val(InputBox("Entrar la 1 Nota : ","Entrar Nota")) ActiveSheet.Range("A5").Value = Nota Media = Media + Nota Para evitar esta tipo de repeticiones de cdigo, los lenguajes de programacin incorporan instrucciones que permiten la repeticin de bloques de cdigo.

Centro de Formacin solucion.es

pg. 29

Estructura repetitiva Para (For..Next).


Esta estructura sirve para repetir la ejecucin de una sentencia o bloque de sentencias, un nmero definido de veces. La estructura es la siguiente: Para var =Valor_Inicial Hasta Valor_Final Paso Incremento Hacer Inicio Sentencia 1 Sentencia 2 Sentencia N Fin Var es una variable que la primera vez que se entra en el bucle se iguala a Valor_Inicial, las sentencias del bucle se ejecutan hasta que Var llega al Valor_Final, cada vez que se ejecutan el bloque de instrucciones Var se incrementa segn el valor de Incremento. En Visual Basic para Excel la estructura Para se implementa con la instruccin For ... Next. For Varible = Valor_Inicial To Valor_Final Step Incremento Sentencia 1 Sentencia 2 Sentencia N Next Variable * Si el incremento es 1, no hace falta poner Step 1, para decrementos asignar valores negativos -1, -2 ... [ Ejemplo 21 ] Entrar 10 valores utilizando la funcin InputBox, sumarlos y guardar el resultado en la casilla A1 de la hoja activa. Sub Ejemplo_21() Dim i As Integer Dim Total As Integer Dim Valor As Integer For i=1 To 10 Valor= Val(InputBox("Entrar un valor","Entrada")) Total = Total + Valor Next i ActiveCell.Range("A1").Value = Total End Sub

Recorrer celdas de una hoja de clculo usando los bucles (estructuras repetitivas). Una operacin bastante habitual cuando se trabaja con Excel es el recorrido de rangos de celdas para llenarlas con valores, mirar su contenido, etc. Las estructuras repetitivas son imprescindibles para recorrer grupos de celdas o rangos. Vea los siguientes ejemplos para ver ejemplos de utilizacin de estructuras repetitivas para recorrer rangos de casillas, observe la utilizacin de las propiedades Cells y Offset.

Centro de Formacin solucion.es

pg. 30

Propiedad Cells: Ya conoce esta propiedad, sirve para referenciar una celda o un rango de celdas segn coordenadas de fila y columna. [ Ejemplo 22 ] Llenar el rango de las casillas A1..A5 con valores pares consecutivos empezando por el 2. Sub Ejemplo_22() Dim Fila As Integer Dim i As Integer Fila = 1 For i=2 To 10 Step 2 ActiveSheet.Cells(Fila,1).Value = i Fila = Fila+1 Next i End Sub

[ Ejemplo 23 ] Llenar un rango de filas, empezando por una celda, que se debe especificar desde teclado, con una serie de 10 valores correlativos (comenzando por el 1). Sub Ejemplo_23() Dim Casilla_Inicial As String Dim i As Integer Dim Fila As Integer, Columna As Integer Casilla_Inicial = InputBox("Introducir la casilla Inicial : ", _ "Casilla Inicial") ActiveSheet.Range(Casilla_Inicial).Activate Coger el valor de fila de la celda activa sobre la variable Fila Fila = ActiveCell.Row Coger el valor de columna de la celda activa sobre la variable Fila Columna = ActiveCell.Column For i = 1 To 10 ActiveSheet.Cells(Fila, Columna).Value = i Fila = Fila + 1 Next i End Sub

Propiedades ROW y COLUMN. Como habr deducido del ejemplo anterior devuelven la fila y la columna de un objeto range. En el ejemplo anterior se utilizaban concretamente para obtener la fila y la columna de la casilla activa. Otra forma de solucionar el ejemplo 23 seria la siguiente:

Centro de Formacin solucion.es

pg. 31

Sub Ejemplo_23() Dim Casilla_Inicial As String Dim i As Integer Dim Fila As Integer, Columna As Integer Casilla_Inicial = InputBox("Introducir la casilla Inicial : ", _ "Casilla Inicial") ActiveSheet.Range(Casilla_Inicial).Activate Fila = 1 For i = 1 To 10 ActiveSheet.Range(Casilla_Inicial).Cells(Fila, 1).Value = i Fila = Fila + 1 Next i End Sub ** Recuerde que cuando utilizamos Cells como propiedad de un rango (Objeto Range), Cells empieza a contar a partir de la casilla referenciada por Range. [ Ejemplo 24 ] El mismo con el que introducamos el tema (ejemplo 20), pero utilizando el For y propiedad Cells Sub Ejemplo_24() Dim Nota As Integer Dim Media As Single Dim Fila As Integer Media = 0 For Fila = 1 To 5 Nota=Val(InputBox("Entrar la " & Fila & " Nota : ", "Entrar _ Nota")) ActiveSheet.Cells(Fila, 1) = Nota Media = Media + Nota Next Fila Media = Media / 5 ActiveSheet.Cells(6, 1).Value = Media End Sub

Propiedad Offset. Esta propiedad es tambin muy til a la hora de recorrer rangos. Offset, que significa desplazamiento, es una propiedad del objeto Range y se utiliza para referenciar una casilla situada a n Filas y n Columnas de una casilla dada. Vea los ejemplos siguientes: ActiveSheet.Range("A1").Offset(2, 2).Value = "Hola" ' Celda C3=Hola, 2 filas y 2 columnas desde A1. ActiveCell.Offset(5,1).Value = "Hola" ' 5 Filas por debajo de la casilla Activa = Hola ActiveCell.Offset(2,2).Activate 'Activar la casilla que est 2 filas y 2 columnas de la activa

Centro de Formacin solucion.es

pg. 32

[ Ejemplo 25 ] El mismo con el que introducamos el tema (ejemplo 20), pero utilizando el For y propiedad Offset Sub Ejemplo_25() Dim Nota As Integer Dim Media As Single Dim Fila As Integer Media = 0 ActiveSheet.Range("A1").Activate For Fila = 0 To 4 Nota=Val(Input Box("Entrar la " & Fila+1 & " Nota : ", _ "Entrar Nota")) ActiveCell.Offset(Fila, 0).Value = Nota Media = Media + Nota Next Fila Media = Media / 5 ActiveCell.Offset(6, 1).Value = Media End Sub [ Ejemplo 26 ] El mismo con el que introducamos el tema (ejemplo 20), pero utilizando el For y propiedad Offset. Observe que ahora vamos cambiando de celda activa. Sub Ejemplo_26() Dim Nota As Integer Dim Media As Single Dim i As Integer Media = 0 ActiveSheet.Range("A1").Activate For i = 1 To 5 Nota=Val(InputBox("Entrar la " & i & " Nota : ", "Entrar _ Nota")) ActiveCell.Value = Nota Media = Media + Nota Hacer activa la casilla situada una fila por debajo de la actual ActiveCell.Offset(1, 0).Activate Next Fila Media = Media / 5 ActiveCell.Value = Media End Sub Observe la diferencia entre los ejemplos 25 y 26, ambos utilizan la propiedad Offset de diferente forma, en el ejemplo 25 la casilla activa siempre es la misma A1, Offset se utiliza para referenciar una casilla a partir de esta. En A26 se va cambiando de casilla activa cada vez de forma que, cuando termina la ejecucin del programa la casilla activa es A6.

Centro de Formacin solucion.es

pg. 33

Cuando utilizar cada mtodo?, como casi siempre depende de lo que se pretenda hacer. Aqu es bastante claro, si le interesa que no cambie la casilla utilice Offset como en el ejemplo 25, en caso que interese que vaya cambiando, haga como en el Ejemplo 26. Por supuesto hay muchas variantes sobre el estilo de recorrer Celdas, tanto con Cells como con Offset, solo tiene que ir probando y, como casi siempre, elegir el que ms le guste.

Estructura repetitiva Do While..Loop (Hacer Mientras)


La estructura repetitiva for se adapta perfectamente a aquellas situaciones en que se sabe previamente el nmero de veces que se ha de repetir un proceso, entrar veinte valores, recorrer cincuenta celdas, etc. Pero hay ocasiones o casos en los que no se sabe previamente el nmero de veces que se debe repetir un proceso. Por ejemplo, suponga que ha de recorrer un rango de filas en los que no se sabe cuantos valores habr (esto es, cuantas filas llenas habr), en ocasiones puede que hayan veinte, en ocasiones treinta, en ocasiones ninguna, etc. Para estos casos la estructura for no es adecuada y deberemos recurrir a la sentencia Do While..Loop en alguna de sus formas. Esta estructura repetitiva est controlada por una o varias condiciones, la repeticin del bloque de sentencias depender de si se va cumpliendo la condicin o condiciones. Hacer Mientras (se cumpla la condicin) Sentencia 1 Sentencia 2 Sentencia N Fin Hacer Mientras En Visual Basic: Do While condicin Sentencia 1 Sentencia 2 Sentencia N Loop ** Los ejemplos que veremos a continuacin sobre la instruccin Do While..Loop se harn sobre una lista de datos. Una lista de datos en Excel es simplemente un rango de celdas en que cada fila representa un registro y cada columna un campo de registro, la primera fila es la que da nombre a los campos. Para nuestra lista de datos utilizaremos los campos siguientes, Nombre, Ciudad, Edad, Fecha. Ponga estos ttulos en el rango A1:D1 de la Hoja1 (En A1 ponga Nombre, en B1 ponga Ciudad, en C1 ponga Edad y en D1 Fecha), observe que los datos se empezarn a entrar a partir de A2. Ejemplo 27 Programa para entrar registros en la lista de datos. Cada campo se entra con InputBox. El programa va pidiendo datos mientras se entre un valor en el InputBox correspondiente al nombre, es decir cuando al preguntar el nombre no se entre ningn valor, terminar la ejecucin del bloque encerrado entre Do While...Loop. Observe el uso de la propiedad Offset para colocar los datos en las celdas correspondientes.

Centro de Formacin solucion.es

pg. 34

Sub Ejemplo_27() Dim Dim Dim Dim Nombre As String Ciudad As String Edad As Integer fecha As Date

Activar hoja1 WorkSheets("Hoja1").Activate Activar casilla A2 ActiveSheet.Range("A2").Activate Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", _ "Nombre") Mientras la variable Nombre sea diferente a cadena vaca Do While Nombre <> "" Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Entre la Edad : ", "Edad")) Fecha=Cdate(InputBox("Entra la Fecha : ", "Fecha")) Copiar los datos en las With ActiveCell .Value = Nombre .Offset(0,1).Value = .Offset(0,2).Value = .Offset(0,3).Value = End With casillas correspondientes

Ciudad Edad fecha

Hacer activa la celda de la fila siguiente a la actual ActiveCell.Offset(1,0).Activate Nombre = InputBox("Entre el Nombre (Return para Terminar) : _ ", "Nombre") Loop End Sub

[ Ejemplo 28 ] Preste especial atencin a este ejemplo ya que seguro que el cdigo que viene a continuacin lo utilizar en muchas ocasiones. Antes que nada observe el ejemplo anterior, fjese en que siempre empezamos a llenar el rango de la hoja a partir de la celda A2, esto tiene una nefasta consecuencia, la segunda vez que ejecute la macro machacar los datos de A2:D2 y si continua ejecutando machacar los datos de los rangos siguientes. Una solucin seria observar cual es la casilla vaca siguiente y cambiar en la instruccin ActiveSheet.Range("A2").Activate , la referencia A2 por la que corresponde a la primera casilla vaca de la columna A. El cdigo que le mostramos a continuacin har esto por nosotros, es decir recorrer una fila de celdas a partir de A1 hasta encontrar una vaca y dejar a esta como celda activa para que la entrada de datos comience a partir de ella.

Centro de Formacin solucion.es

pg. 35

Sub Ejemplo_28() Activar hoja1 WorkSheets("Hoja1").Activate Activar casilla A2 ActiveSheet.Range("A1").Activate Mientras la celda activa no est vaca Do While Not IsEmpty(ActiveCell) Hacer activa la celda situada una fila por debajo ActiveCell.Offset(1,0).Activate Loop End Sub

[ Ejemplo 29 ] Es la unin de los dos programas anteriores. Es decir habr un bucle Do While que buscar la primera casilla vaca de la base da datos y otro para pedir los valores de los campos hasta que se pulse Enter en Nombre.
Sub Ejemplo_29() Dim Dim Dim Dim Nombre As String Ciudad As String Edad As Integer fecha As Date

WorkSheets("Hoja1").Activate ActiveSheet.Range("A1").Activate Buscar la primera celda vaca de la columna A y convertirla en activa Do While Not IsEmpty(ActiveCell) ActiveCell.Offset(1,0).Activate Loop Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", _ "Nombre") Mientras la variable Nombre sea diferente a cadena vaca Do While Nombre <> "" Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Entre la Edad : ", "Edad")) Fecha=Cdate(InputBox("Entra la Fecha : ", "Fecha")) With ActiveCell .Value = Nombre .Offset(0,1).Value = Ciudad .Offset(0,2).Value = Edad .Offset(0,3).value = fecha End With ActiveCell.Offset(1,0).Activate Nombre = InputBox("Entre el Nombre (Return para Terminar) : _ ", "Nombre") Loop End Sub

Cuando se tienen que entrar desde el teclado conjuntos de valores, algunos programadores y usuarios prefieren la frmula de que el programa pregunte si se desean entrar ms datos, la tpica pregunta Desea

Centro de Formacin solucion.es

pg. 36

Introducir ms datos?, si el usuario contesta S, el programa vuelve a ejecutar las instrucciones correspondientes a la entrada de datos, si contesta que no se finaliza el proceso, observe como quedara nuestro bucle de entrada de datos con este sistema.
Mas_datos = vbYes Do While Mas_Datos = vbYes Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Entre la Edad : ", "Edad")) Fecha=Cdate(InputBox("Entra la Fecha : ", "Fecha")) With ActiveCell .Value = Nombre .Offset(0,1).Value = Ciudad .Offset(0,2).Value = Edad .Offset(0,3).value = fecha End With ActiveCell.Offset(1,0).Activate Preguntar al usuario si desea entrar otro registro. Mas_datos = MsgBox("Otro registro ?", vbYesNo+vbQuestion,"Entrada de _ datos") Loop

** Observe que es necesaria la lnea anterior al bucle Mas_datos = vbYes, para que cuando se evale la condicin por vez primera esta se cumpla y se ejecuten las sentencias de dentro del bucle, Mas_datos es una variable de tipo Integer. Vea la seccin siguiente donde se estudia una variante de la estructura Do While que es ms adecuada para este tipo de situaciones.

Estructura Do..Loop While


El funcionamiento de esta estructura repetitiva es similar a la anterior salvo que la condicin se evala al final, la inmediata consecuencia de esto es que las instrucciones del cuerpo del bucle se ejecutaran al menos una vez. Para nuestra estructura de entrada de datos vista en el ltimo apartado es ms conveniente, si vamos a entrar datos, al menos uno entraremos, por tanto las instrucciones del cuerpo del bucle se deben ejecutar al menos una vez, luego ya decidiremos si se repiten o no.
Do Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Entre la Edad : ", "Edad")) Fecha=Cdate(InputBox("Entra la Fecha : ", "Fecha")) With ActiveCell .Value = Nombre .Offset(0,1).Value = Ciudad .Offset(0,2).Value = Edad .Offset(0,3).value = fecha End With ActiveCell.Offset(1,0).Activate Mas_datos = MsgBox("Otro registro ?", vbYesNo+vbQuestion,"Entrada de _ datos") Mientras Mas_Datos = vbYes Loop While Mas_Datos = vbYes

Centro de Formacin solucion.es

pg. 37

Observe que en este caso no es necesario la lnea Mas_Datos = vbYes antes de Do para forzar la entrada en el bucle ya que la condicin va al final.

Estructura Do..Loop Until (Hacer.. Hasta que se cumpla la condicin)


Es otra estructura que evala la condicin al final observe que la interpretacin es distinta ya que el bucle se va repitiendo HASTA que se cumple la condicin, no MIENTRAS se cumple la condicin. Cual de los dos utilizar, pues, no se sorprenda, la que entienda mejor o le guste ms. La entrada de datos con este bucle quedara:
Do Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Ent re la Edad : ", "Edad") Fecha=Cdate("InputBox("Entra la Fecha : ", "Fecha") With ActiveCell .Value = Nombre .Offset(0,1).Value = Ciudad .Offset(0,2).Value = Edad .Offset(0,3).value = fecha End With ActiveCell.Offset(1,0).Activate Mas_datos = MsgBox("Otro registro ?", vbYesNo+vbQuestion,"Entrada de _ datos") Hasta que Mas_Datos sea igual a vbNo Loop Until Mas_Datos=vbNo

Centro de Formacin solucion.es

pg. 38

Estructura For Each


Este bucle se utiliza bsicamente para ejecutar un grupo de sentencias con los elementos de una coleccin o una matriz (pronto veremos los que es). Recuerde que una coleccin es un conjunto de objetos, hojas, rangos, etc. Vea el ejemplo siguiente que se utiliza para cambiar los nombres de las hojas de un libro de trabajo.

[ Ejemplo 29 ] Programa que pregunta el nombre para cada hoja de un libro de trabajo, si no se pone nombre a la hoja, queda el que tiene.
Sub Ejemplo_29() Dim Nuevo_Nombre As String Dim Hoja As WorkSheet Para cada hoja del conjunto WorkSheets For Each Hoja In WorkSheets Nuevo_Nombre=InputBox("Nombre de la Hoja : " & Hoja.Name,"Nombrar _ Hojas") If Nueva_Nombre <> "" Then Hoja.Name=Nuevo_nombre End If Next End Sub

** La variable Hoja va referenciando cada una de las hojas del conjunto WorkSheets a cada paso de bucle. [ Ejemplo 30 ]
Entrar valores para las celdas del rango A1:B10 de la hoja Activa. Sub Ejemplo_30() Dim R As Range Para cada celda del rango A1:B10 de la hoja activa For Each R in ActiveSheet.Range("A1:B10") R.Value = InputBox("Entrar valor para la celda " & R.Address, _ "Entrada de valores") Next End Sub

** Observe que se ha declarado una variable tipo Range, este tipo de datos, como puede imaginar y ha visto en el ejemplo sirve para guardar Rangos de una o ms casillas, estas variables pueden luego utilizar todas las propiedades y mtodos propios de los Objetos Range. Tenga en cuenta que la asignacin de las variables que sirven para guardar o referenciar objetos (Range, WorkSheet, etc.) deben inicializarse muchas veces a travs de la instruccin SET, como ya se coment en otro captulo, aunque en su uso en el bucle For Each no se realice de esa manera.

Centro de Formacin solucion.es

pg. 39

Procedimientos y funciones
Se define como procedimiento y/o funcin a un bloque de cdigo que realiza alguna tarea. Hasta ahora, hemos construido los programas utilizando un nico procedimiento, pero a medida que los programas (y los problemas) crecen se va haciendo necesaria la inclusin de ms procedimientos. Podra fcilmente caer en la tentacin de utilizar, como hasta ahora, un nico procedimiento por programa pero se dar cuenta rpidamente de que este mtodo no es nada prctico ya que grandes bloques de cdigo implican mayor complicacin del mismo, repeticin de sentencias y lo que es ms grave, mayores problemas de seguimiento a la hora de depurar errores, ampliar funcionalidades o incluir modificaciones. La filosofa de utilizar procedimientos es la antigua frmula del "divide y vencers", es decir, con los procedimientos podremos tratar cada problema o tarea de forma ms o menos aislada de forma que construiremos el programa paso a paso evitando tener que resolver o controlar mltiples cosas a la vez. Cada tarea la realizar un procedimiento, si esta tarea implica la ejecucin de otras tareas, cada una se implementar y solucionar en su correspondiente procedimiento de manera que cada uno haga una cosa concreta. As, los diferentes pasos que se deben ejecutar para que un programa haga algo, quedaran bien definidos cada uno en su correspondiente procedimiento, si el programa falla, fallar a partir de un procedimiento y de esta forma podremos localizar el error ms rpidamente. Los procedimientos son tambin un eficaz mecanismo para evitar la repeticin de cdigo en un mismo programa e incluso en diferentes programas. Suponemos que habr intuido que hay muchas tareas que se repiten en casi todos los programas, veremos como los procedimientos que ejecutan estas tareas se pueden incluir en un mdulo de forma que este sea exportable a otros programas y de esta manera ganar tiempo que, como dice el tpico, es oro. Definir un procedimiento. Ya lo hemos hecho unas cuantas veces, pero ah va de nuevo.
Sub Nombre_Procedimento() Sentencias End Sub.

Llamar a un procedimiento. Para llamar un procedimiento desde otro se utiliza la instruccin Call Nombre_Procedimiento.
Sub P_Uno() Sentencias Call P_Dos Sentencias End Sub

Las secuencias del procedimiento P_Uno se ejecutan hasta llegar a la lnea Call P_Dos, entonces se salta al procedimiento P_Dos, se ejecutan todas las sentencias de este procedimiento y el programa continua ejecutndose en el procedimiento P_Uno a partir de la sentencia que sigue a Call P_Dos. [ Ejemplo 32 ] Es el mismo programa que el visto en el ejemplo 29 pero el cdigo que salta casilla hasta que se encuentra una vaca se implementa en un procedimiento llamado, Saltar_Celdas_Llenas. Observe que para entrar valores se ha sustituido Do While..Loop por Do.. Loop While.

Centro de Formacin solucion.es

pg. 40

Sub Ejemplo_32() Dim Dim Dim Dim Nombre As String Ciudad As String Edad As Integer fecha As Date

Llamada a la funcin Saltar_Celdas_Llenas, el programa salta aqu a ejecutar las instrucciones de este procedimiento y luego vuelve para continuar la ejecucin a partir de la instruccin Do Call Saltar_Celdas_Llenas Do Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", _ "Nombre") Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Entre la Edad : ", "Edad")) Fecha=Cdate(InputBox("Entra la Fecha : ", "Fecha")) With ActiveCell .Value = Nombre .Offset(0,1).Value = Ciudad .Offset(0,2).Value = Edad .Offset(0,3).value = fecha End With ActiveCell.Offset(1,0).Activate Mas_datos = MsgBox("Otro registro ?", vbYesNo+vbQuestion,"Entrada de _ datos") LoopWhile Mas_Datos = vbYes End Sub Funcin que salta celdas de una misma columna. Sirve para encontrar la primera celda vaca de la columna Sub Saltar_Celdas_Llenas() WorkSheets("Hoja1").Activate ActiveSheet.Range("A1").Activate Do While not IsEmpty(ActiveCell) ActiveCell.Offset(1,0).Activate Loop End Sub

Generalizar una funcin. Observe que para saltar un rango de casillas llenas slo necesitar llamar a la funcin Saltar_Celdas_Llenas, pero, siempre y cuando este rango est en una hoja llamada "Hoja1" y empiece en la casilla A1, el procedimiento es poco prctico ya que su mbito de funcionamiento es limitado. En la siguiente seccin modificaremos el procedimiento de manera que sirva para recorrer un rango que empiece en cualquier casilla de cualquier hoja. Parmetros. Los parmetros son el mecanismo por el cual un procedimiento puede pasarle valores a otro y de esta forma condicionar, moldear, etc. las acciones que ejecuta. El procedimiento llamado gana entonces en flexibilidad. La sintaxis de llamada de un procedimiento es la siguiente:
Call Procedimiento(Parmetro1, Parmetro2,..., ParmetroN)

Los parmetros pueden ser valores o variables.

Centro de Formacin solucion.es

pg. 41

La sintaxis para crear el procedimiento llamado es la siguiente:


Sub Procedimiento(Parmetro1 as Tipo, Parmetro2 As Tipo,.., ParmetroN As Tipo)

Observe que aqu los parmetros son variables que recibirn los valores, evidentemente debe haber coincidencia de tipo. Por ejemplo, si el primer parmetro es una variable tipo Integer, el primer valor que se le debe pasar al procedimiento cuando se llama tambin ha de ser de tipo Integer (recuerde que puede ser un valor directamente o una variable). [ Ejemplo 33 ] El mismo programa que en el ejemplo 32 pero ahora la funcin Saltar_Celdas_Llenas tiene dos parmetros Hoja y Casilla_Inicial que reciben respectivamente la hoja donde est el rango a recorrer y la casilla inicial del rango.
Sub Ejemplo_33() Dim Nombre As String Dim Ciudad As String Dim Edad As Integer Dim fecha As Date ' Llamada a la funcin Saltar_Celdas_Llenas, observar que mediante dos parmetros se pasa al procedimiento en que hoja est el rango a saltar y en la casilla donde debe empezar. Call Saltar_Celdas_Llenas("Hoja1", "A1") Do Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Entre la Edad : ", "Edad")) Fecha=Cdate(InputBox("Entre la Fecha : ", "Fecha")) With ActiveCell .Value = Nombre .Offset(0,1).Value = Ciudad .Offset(0,2).Value = Edad .Offset(0,3).value = fecha End With ActiveCell.Offset(1,0).Activate Mas_datos = MsgBox("Otro registro ?", vbYesNo+vbQuestion,"Entrada de datos") Loop While Mas_Datos = vbYes End Sub ' ' ' ' Procedimiento Saltar_Celdas_Llenas. Sirve para Saltar celdas llenas de una columna hasta encontrar una vaca que se convierte en activa Parmetros : Hoja : Hoja donde est el rango a saltar nombre tipo cadena. Casilla_Inicial : Casilla Inicial de la columna tipo A1 cadena.

Sub Saltar_Celdas_Llenas(Hoja As String, Casilla_Inicial As String) WorkSheets(Hoja).Activate ActiveSheet.Range(Casilla_Inicial).Activate Do While not IsEmpty(ActiveCell) ActiveCell.Offset(1,0).Activate Loop End Sub

Observe que ahora el procedimiento Saltar_Celdas_Llenas sirve para recorrer cualquier rango en cualquier hoja. Observe que al procedimiento se le pasan dos valores directamente, recuerde, y esto es quizs lo ms habitual, que tambin pueden pasarse variables, por ejemplo.

Centro de Formacin solucion.es

pg. 42

Sub Ejemplo_33() Dim Hoja As String Dim Casilla_Inicial As String Hoja = InputBox("En que hoja est la base de datos : ", "Entrar Nombre de Hoja") Casilla_Inicial = InputBox("En que casilla comienza la base de datos","Casilla _ Inicial") Observe que los parmetros son dos variables cuyo valor se ha entrado desde teclado en las dos instrucciones InputBox anteriores. Call Saltar_Celdas_Llenas(Hoja, Casilla_Inicial) End Sub

Variables locales y variables Globales. El mbito de una variable declarada dentro de una funcin es la propia funcin, es decir no podr utilizares fuera de dicha funcin. As, el siguiente programa que debera sumar las cinco filas siguientes a partir de la casilla activa y guardar el resultado en la sexta es incorrecto.
Sub Alguna_Cosa() Call Sumar_Cinco_Siguientes ActiveCell.Offset(6,0).Value = Suma End Sub Sub Sumar_Cinco_Siguientes() Dim i As Integer Dim Suma As Single Suma=0 For i=1 To 5 Suma = Suma+ActiveCell.Offset(i,0).Value Next i End Sub

Es incorrecto porque tanto la variable i como la variable Suma estn declaradas dentro del procedimiento Sumar_Cinco_Siguientes consecuentemente, su mbito de accin es este procedimiento. Por tanto, la instruccin ActiveCell.Offset(6,0).Value = Suma del procedimiento Alguna_Cosa, generara un error (con Option Explicit activado) ya que la variable Suma no est declarada dentro de l. Si piensa en declarar la variable Suma dentro del procedimiento Hacer_Algo, no solucionar nada porque esta ser local a dicho procedimiento, en este caso tendra dos variables llamadas Suma pero cada una de ellas local a su propio procedimiento y consecuentemente con el mbito de accin restringido a ellos. Una solucin, que debemos evitar, seria declarar suma como variable global. Una variable global se declara fuera de todos los procedimientos y es reconocida por todos los procedimientos del mdulo, incluso por aquellos que no tienen necesidad de usarla, por esto que no recomendamos variables globales entre otras cosas:
Option Explicit Dim Suma As Single Sub Alguna_Cosa() Call Sumar_Cinco_Siguientes ActiveCell.Offset(6,0).Value = Suma End Sub Sub Sumar_Cinco_Siguientes() Dim i As Integer Suma=0 For i=1 To 5 Suma = Suma+ActiveCell.Offset(i,0).Value Next i End Sub

Centro de Formacin solucion.es

pg. 43

Las variables globales son adecuadas en pocas ocasiones, para este caso seria mejor declarar Suma en la funcin Hacer_Algo y pasarla como parmetro al procedimiento Sumar_Cinco_Siguientes.
Sub Alguna_Cosa() Dim Suma As Single ' Llamada a la funcin Sumar_Cinco_Siguientes pasndole la variable Suma Call Sumar_Cinco_Siguientes(Suma) ActiveCell.Offset(6,0).Value = Suma End Sub Sub Sumar_Cinco_Siguientes(S As Single) Dim i As Integer Suma=0 For i=1 To 5 S = S+ActiveCell.Offset(i,0).Value Next i End Sub

Esto le funcionaria porque la variable parmetro S (y se le ha cambiado el nombre adrede) de Sumar_Cinco_Siguientes es la variable Suma declarada en Hacer_Algo. Funcionar porque en visual basic, a menos que se indique lo contrario, el paso de parmetros es por referencia, vea la siguiente seccin. Paso por referencia y paso por valor. No entraremos en detalles sobre como funciona el paso de parmetros por valor y el paso de parmetros por referencia, slo indicar que el paso por valor significa que la variable parmetro del procedimiento recibe el valor de la variable (o directamente el valor) de su parmetro correspondiente de la instruccin de llamada y en el paso por referencia, la variable parmetro del procedimiento es la misma que su parmetro correspondiente de la instruccin de llamada, es decir, la declarada en el procedimiento desde el que se hace la llamada. Por defecto, y siempre que en la instruccin de llamada se utilicen variables, las llamadas son por referencia. Si desea que el paso de parmetros sea por valor, debe anteponer a la variable parmetro la palabra reservada ByVal, por ejemplo, Sub Saltar_Celdas_Llenas(ByVal Hoja As String, ByVal Casilla_Inicial As String) Aunque lo elegante y efectivo por razones de memoria seria pasar siempre que sea posible por valor, es poco habitual que as se haga en visual basic, seguramente por comodidad. Como suponemos que har como la mayora, es decir, pasar por referencia, tenga cuidado con los (indeseables) efectos laterales. Copie y ejecute este programa y descubrir que son los efectos laterales. Ejemplo Efecto_Lateral. Antes de copiar el programa, active una hoja en blanco y ponga valores del 1 al 15 distribuidos de la forma siguiente, en el rango A1:A5 valores del 1 al 5, en el rango B1:B5 valores del 6 al 10, en el rango C1:C5 valores del 11 al 15. El siguiente programa debe recorrer cada una de tres las columnas de valores, sumarlos y poner el resultado en las filas 6 de cada columna. Entonces, segn los valores que ha entrado en cada una de las columnas, cuando haya acabado la ejecucin del programa debe haber los siguientes resultados, A6 = 15, B6=40, C6=65. Para llevar a cabo la suma de los valores de cada columna se llama a la funcin Recorrer_Sumar tres veces, una para cada columna, esta funcin recibe en el parmetro F el valor de la fila donde debe

Centro de Formacin solucion.es

pg. 44

empezar a sumar, sobre el parmetro C el valor de la columna a sumar y sobre el parmetro Q la cantidad de filas que ha de recorrer. El programa utiliza la propiedad Cells para referenciar las filas y columnas de los rangos. Observe atentamente los valores que ir cogiendo la variable Fila ya que esta ser la que sufra el efecto lateral.
Sub Efecto_Lateral() Dim Fila As Integer Fila = 1 Call Recorrer_Sumar(Fila, 1,5) ' Columna A Call Recorrer_Sumar(Fila, 2,5) ' Columna B Call Recorrer_Sumar(Fila, 3,5) ' Columna C End Sub Sub Recorrer_Sumar(F As Integer, C As Integer, Q As Integer) Dim i As Integer Dim Total As Integer Total = 0 For i =1 To Q Total = Total + ActiveSheet.Cells(F, C).Value F=F+1 ' OJO con esta asignacin, recuerde que F es la variable Fila declarada en el procedimiento Efecto_Lateral Next i ActiveSheet.Cells(F, C) = Total End Sub

Cuando ejecute el programa se producir la salida siguiente, en A6 habr un 15, hasta aqu todo correcto, pero observe que en la segunda columna aparece un 0 en B12 y en la tercera columna aparece un 0 en C18, veamos que ha pasado. La primera vez que se llama la funcin, la variable F vale 1 ya que este es el valor que tiene su parmetro correspondiente (Fila) en la instruccin Call. Observe que F se va incrementando una unidad a cada paso de bucle For, RECUERDE que F es realmente la variable Fila declarada en el procedimiento Efecto_Lateral, por tanto cuando finaliza el procedimiento Recorrer_Sumar y vuelve el control al procedimiento Efecto_Lateral Fila vale 6, y este es el valor que se pasar a Recorrer_Suma la segunda vez que se llama, a partir de ah todo ir mal ya que se empezar el recorrido de filas por la 6. Una de las soluciones a este problema para hacer que cada vez que se llame Recorrer_Sumar la variable F reciba el valor 1, es utilizar un paso por valor, es decir que F reciba el valor de Fila, no que sea la variable Fila, observe que entonces, si F no es la variable Fila, cuando incremente F no se incrementar Fila, esta siempre conservar el valor 1. Para hacer que F sea un parmetro por valor, simplemente ponga la palabra ByVal antes de F en la declaracin del procedimiento. Vuelva a ejecutar el programa, ver como ahora funciona correctamente. Insistimos de nuevo en que tenga cuidado con estas cosas. Al menos ahora ya est sobre aviso, cuando un programa no haga lo que ha previsto una de las cosas que deber repasar es el paso de parmetros a los procedimientos.
** Para acabar, observe que en muchas ocasiones le hemos indicado que en el paso por referencia la variable del procedimiento llamado es la variable declarada en el procedimiento que llama. En este ltimo ejemplo, le hemos dicho que F era la variable Fila, pues bien, esto no es del todo cierto Fila es una variable y F es otra variable, ahora es lgico que se pregunte por qu entonces F acta como si fuera Fila, esto de manera esquemtica se produce por que F es una variable puntero que contiene la direccin en la memoria de la variable Fila (referencia a la variable fila) y que es capaz de modificar directamente el contenido de Fila es aignar a dos nombres de variable el mismo espacio en memoria.

Centro de Formacin solucion.es

pg. 45

Funciones. Una funcin es lo mismo que un procedimiento con la salvedad que este devuelve un valor al procedimiento o funcin que lo llama. Vea el siguiente ejemplo, es una funcin muy sencilla ya que simplemente suma dos nmeros y devuelve el resultado. [ Ejemplo 34 ] Funcin que devuelve la suma de dos valores que se le pasan como parmetros. Observe las diferentes formas en como se llama la funcin.
Sub Ejemplo_34() Dim X As Integer Dim n1 As Integer, n2 As Integer X = Sumar(5, 5) n1= Val ( InputBox("Entrar un nmero : ", "Entrada")) n2= Val ( InputBox("Entrar otro nmero : ", "Entrada")) X= Sumar(n1,n2) ActiveCell.Value = Sumar(ActiveSheet.Range("A1").Value , _ ActiveSheet.Range("A2").Value) X = Sumar(5, 4) + Sumar(n1, n2) End Sub Function Sumar(V1 As Integer, V2 As Integer) As Integer Dim Total As Integer Total = V1 + V2 Sumar = Total End Function

Observe la sintaxis de la cabecera de funcin:


Function Sumar(V1 As Integer, V2 As Integer) As Integer

La estructura general seria: Function Nombre_Funcion(var1 As Tipo, var2 As Tipo,..., varN As Tipo) As Tipo. La sintaxis es similar a la cabecera de un procedimiento, slo que una funcin tiene tipo, esto tiene su lgica, ya que una funcin devuelve un valor, ese valor ser de un tipo determinado. As, en nuestro ejemplo de Function Suma, esta funcin es de tipo Integer, o dicho de otra manera, la funcin ejecuta sus sentencias y devuelve un valor hacia el procedimiento o la funcin que la llam, el valor devuelto se establece igualando el nombre de la funcin a algo. Nombre_Funcin = .... En el ejemplo anterior fjese en la lnea de cdigo: Sumar = Total Observe tambin la sintaxis de la llamada a la funcin, en el ejemplo hemos utilizado unas cuantas formas de llamarla, lo que debe tener siempre presente es que en cualquier expresin aritmtica o de clculo, el ordenador realiza un mnimo de dos operaciones, una de clculo y otra de asignacin. Por ejemplo, A= B+C El ordenador primero calcula el resultado de sumar B+C luego asigna ese resultado a la variable A.

Centro de Formacin solucion.es

pg. 46

En cualquier llamada a una funcin, cojamos por caso, X=Sumar(n1,n2), primero se ejecutan todas las sentencias de la funcin Sumar, luego se asigna el clculo de la funcin a la variable X. D otro vistazo a la funcin de ejemplo y vea lo que realiza cada sentencia en la que se llama a la funcin Sumar. [ Ejemplo 35 ] Funcin que devuelve la direccin de la primera celda vaca de un rango. La funcin es de tipo String ya que devuelve la casilla en la forma "FilaColumna ", por ejemplo "A10". Utilizaremos la propiedad Address del objeto ActiveCell, esta propiedad devuelve un string que contiene la referencia "FilaColumna" de una casilla o rango de casillas. En el caso de un rango devuelve, "FilaColumna_Inicial:FilaColumna_Final", por ejemplo "A1:C10"
Sub Ejemplo_35() Dim Casilla As String Casilla = Casilla_Vacia("A1") End Sub ' ' ' ' ' Funcin Casilla_Vacia de Tipo String Sirve para Recorrer las filas de una columna hasta encontrar una vaca. Parmetros : Casilla_Inicio : Casilla donde debe empezar a buscar. Devuelve un string que contiene la referencia de la primera casilla

Function Casilla_Vacia(Casilla_Inicio As String) As String ActiveSheet.Range(Casilla_Inicio).Activate Do While Not IsEmpty(ActiveCell) ActiveCell.Offset(1, 0).Activate Loop Casilla_Vacia = ActiveCell.Address End Function

[ Ejemplo 36 ] Similar al anterior. Es la tpica bsqueda secuencial de un valor en un rango de casillas, en esta funcin solo se avanzar a travs de una fila. La funcin devuelve la direccin (address) de la casilla donde est el valor buscado, en caso que el valor no est en el rango de filas, devuelve una cadena vaca ("").
Sub Ejemplo_36() Dim Casilla As String Casilla = Buscar_Valor("A1", 25) ' Si valor no encontrado If Casilla = "" Then Else 'Valor encontrado Endif End Sub

' ' ' ' ' ' '

Funcin Buscar de Tipo String Recorre las filas de una columna hasta encontrar el valor buscado o una de vaca. Parmetros : Casilla_Inicial : Casilla donde debe empezar a buscar. Valor_Buscado : Valor que se debe encontrar Devuelve un string con la referencia de la casilla donde se encuentre el valor. Tambin puede devolver "" en caso que el valor buscado no est.

Function Buscar(Casilla_Inicial As String, Valor_Buscado As Integer) As String ActiveSheet.Range(Casilla_Inicial).Activate ' Mientras casilla no vaca Y valor de casilla diferente al buscado

Centro de Formacin solucion.es

pg. 47

Do While Not IsEmpty(ActiveCell) And ActiveCell.Value <> Valor_Buscado ActiveCell.Offset(1, 0).Activate Loop 'Si la casilla donde se ha detenido la bsqueda NO EST VACA es que se ha Encontrado el valor. If Not IsEmpty(ActiveCell) Then Buscar = ActiveCell.Address ' Devolver la celda donde se encuentra el valor Else ' La casilla est vaca, NO se ha encontrado el valor buscado Buscar="" 'Devolver una cadena vaca End If End Function

[ Ejemplo 36b ] Similar al anterior. Bsqueda secuencial de un valor en un rango de casillas, en esta funcin se avanzar a travs de filas y columnas. La funcin devuelve la direccin (address) de la casilla donde est el valor buscado, en caso que el valor no est en el rango, devuelve una cadena vaca ("").
Sub Ejemplo_36b() Dim Casilla As String Casilla = Buscar_Valor("A1", 25) If Casilla = "" Then MsgBox "no encontrado" Else MsgBox "encontrado" End If End Sub Function Buscar_Valor(Casilla_Inicial As String, Valor_Buscado As Integer) As String Dim Incremento_Columna As Integer Dim Continuar As Boolean ActiveSheet.Range(Casilla_Inicial).Activate Continuar = True Do While Continuar Incremento_Columna = 0 ' Buscar el valor por las columnas encontrarlo o encontrar una celda vaca. Do While Not IsEmpty(ActiveCell.Offset(0, Incremento_Columna)) And _ ActiveCell.Offset(0, Incremento_Columna).Value <> Valor_Buscado ' Siguiente columna Incremento_Columna = Incremento_Columna + 1 Loop ' Si no est vaca la casilla, se ha encontrado el valor If Not IsEmpty(ActiveCell.OffSet(0, Incremento_Columna)) Then Continuar=False Else ' La casilla est vaca, no se ha encontrado el valor ActiveCell.Offset(1, 0).Activate ' Saltar a una nueva fila If IsEmpty(ActiveCell) Then ' Si la nueva fila est vaca Continuar=False ' Parar la bsqueda End If End If Loop 'Si la casilla donde se ha detenido NO EST VACA es que se ha encontrado If Not IsEmpty(ActiveCell) Then Buscar_Valor = ActiveCell(0, Incremento_Columna).Address ' Devolver la celda Else ' NO se ha encontrado el valor buscado Buscar_Valor="" ' Devolver una cadena vaca End If End Function

Centro de Formacin solucion.es

pg. 48

La clusula Private. Puede anteponer la clusula private a todos los procedimientos y funciones que sean llamados slo desde el mismo mdulo, es una forma de ahorrar memoria y hacer que el programa corra un poco ms rpido. Si necesita llamar un procedimiento o funcin desde otro mdulo, nunca debe precederlo por la clusula private, recuerde que esta clusula restringe el mbito de utilizacin de un procedimiento o funcin a su propio mdulo. Supongamos el ejemplo siguiente:
' Mdulo 1 Sub General .... End Sub Private Sub Privado .... End Sub ' Mdulo 2 Sub Procedimiento_de_modulo2 ' Esto es correcto. Llama al procedimiento General definido en Mdulo1 Call General ' Esto no es correcto. Llama al procedimiento Privado definido en Mdulo 1, este ' procedimiento va precedido pro la clusula Private, por tanto slo puede ser llamado desde procedimientos de su propio mdulo Call Privado End Sub

Vamos a ver a continuacin tres ejemplos ms sobre funciones. Es importante que los cree en un libro de trabajo nuevo y los ponga en un mismo mdulo, al final del captulo utilizaremos las opciones de exportar e importar mdulos de procedimientos y funciones. En todos los ejemplos ver el procedimiento Procedimiento_Llamador, es para mostrar de que forma se debe llamar al procedimiento o funcin. [ Ejemplo 37 ] Procedimiento que abre un cuador MsgBox y muestra el texto que se le pasa como parmetro.
Sub Procedimiento_Llamador() Call mAviso("Esto es el mensaje de aviso", "Esto es el Ttulo") End Sub

' Procedimiento mAviso ' Funcin Mostrar el cuadro de funcin MsgBox, con el icono informacin y el botn OK (Aceptar). ' Se utiliza para mostrar avisos. ' Parmetros: ' Texto = Texto que muestra el cuadro ' Titulo = Ttulo del cuadro Sub mAviso(Texto As String, Titulo As String) otra forma de escribir msgbox que no devuelve nada MsgBox Prompt:=Texto, Buttons:=vbOKOnly + vbInformation, Title:=Titulo End Sub

Centro de Formacin solucion.es

pg. 49

[ Ejemplo 38 ] Funcin tipo range que devuelve un rango. Observe como la funcin se iguala a una variable tipo Range, recuerde que con esta variable podr acceder a todas las propiedades e invocar todos los mtodos propios de los objetos Range. En este ejemplo en concreto se utilizan las variables para Copiar un grupo de celdas de un rango hacia otro, se utilizan los mtodos Copy y Paste del objeto Range.
Sub Procedimiento_Llamador() Dim Rango_Origen As Range Dim Rango_Destino As Range Set Rango_Origen=Coger_Rango(A1,5,5) Rango_Origen.Copy Set Rango_Destino=Coger_Rango(G1,5,5) Rango_Destino.PasteSpecial xlPasteAll End Sub

' ' ' ' '

Funcin que devuelve un rango a una variable de este tipo Parmetros Casilla = casilla inicial del rango Filas = nmero' de filas Columnas = nmero de columnas del rango

Function Coger_Rango(Casilla As String, Filas As Integer, Columnas As Integer) As Range Dim Casilla_Final As String ActiveSheet.Range(Casilla).Activate ActiveCell.Cells(Filas, Columnas).Activate Casilla_Final = ActiveCell.Address ActiveSheet.Range(Casilla & ":" & Casilla_Final).Select Set Coger_Rango = ActiveSheet.Range(Casilla & ":" & Casilla_Final) End Function

Centro de Formacin solucion.es

pg. 50

[ Ejemplo 39 ] Funcin para comprobar el tipo de datos. Es una funcin de comprobacin que se puede utilizar para validar los datos que se entran desde un cuadro InputBox o desde los cuadros de texto de formularios. La funcin es de tipo Booleano, devuelve True (cierto) o False en funcin de si el dato pasado es correcto. En esta funcin se evalan slo datos numricos y datos tipo Fecha, puede ampliarla para que se comprueben ms tipos.
Sub Procedimiento_Llamador() Dim Cantidad As Integer Dim Fecha As Date Dim Datos As String Datos = InputBox("Entrar una Cantidad : ", "Entrar") If Not Comprobar_Tipo(Datos,"N") Then mAviso("Los datos introducido no son numricos", "Error") Else Cantidad = Val(Datos) End If Datos=InputBox("Entrar Fecha","Entrar") If Not Comprobar_Tipo(Datos,"F") Then mAviso("Los fecha introducida no es correcta", "Error") Else Fecha = Cdate(Datos) End If End Sub ' Funcin que evala si el correctos devuelve ' TRUE , en caso contrario ' Parmetros ' Valor =valor que se debe ' Tipo = tipo a comprobar,

tipo de datos que se le pasan son correctos o no. Si son devuelve FALSE comprobar, de tipo String "N" --> Numrico, "F", tipo fecha

Function Comprobar_Tipo(Valor As String, Tipo As String) As Boolean Dim Valido As Boolean Valido = True Select Case Tipo ' Comprueba si es un valor numrico vlido Case "N" If Not IsNumeric(Valor) Then Valido = False End If ' Comprueba si es un valor fecha vlido Case "F" If Not IsDate(Valor) Then Valido = False End If End Select Comprobar_Tipo = Valido End Function

Centro de Formacin solucion.es

pg. 51

Importar y Exportar mdulos


Los ltimos tres ejemplos que hemos visto, como le hemos indicado, son procedimientos que pueden ser utilizados en multitud de ocasiones o situaciones, seria interesante tenerlos disponibles en cualquiera de las hojas que confeccionemos. Podra pensar en utilizar las opciones de copiar y pegar para pasar procedimientos de una hoja a otra, es un mtodo totalmente vlido y efectivo, pero le proponemos a continuacin otro mtodo ms "profesional", por llamarlo de otra manera, e igual de efectivo. Este mtodo consiste en guardar los procedimientos de un mdulo en un archivo aparte, es decir, independiente de cualquier hoja de clculo, luego, cuando en una nueva hoja necesite estas funciones, solo deber importar este archivo para incorporarlo. Exportar un mdulo. Guardar un mdulo en un archivo .BAS. Como ejemplo, abra la hoja donde puso los tres ltimos procedimientos. 1. Pase al editor de visual basic y seleccione el mdulo a exportar. 2. Active opcin de la barra de mens Archivo/ Exportar archivo. Aparece un cuadro de dilogo. 3. En cuadro de edicin Nombre de Archivo, teclee el nombre para el archivo donde se guardar el mdulo, por ejemplo "General.Bas", observe que .BAS es la extensin de estos archivos de mdulo. 4. Pulse sobre el botn Guardar. Importar un .BAS guardado a un archivo de Excel. 1. Pase al editor de visual basic y seleccione proyecto donde quiera importar el mdulo guardado en .BAS 2. Active opcin de la barra de mens Archivo/ importar archivo. Aparece un cuadro de dilogo. 3. Buscar y seleccionar el archivo .BAS a importar. Haga clic en aceptar. Crear y usar un archivo de complementos .XLA. Se pueden usar los archivos de complementos para guardar todos los mdulos de un archivo de Excel. La forma de hacerlo es guardar el archivo que contiene los mdulos como complemento: 1. 2. 3. 4. 5. Desde Excel, seleccione Archivo/Guardar como En el cuadro desplegable Tipo de archivo seleccione la ltima opcin Complemeto de Excel La ruta por defecto de Excel para guardar los complementos es: C:\Documents and Settings\NOMBRE_USUARIO\Datos de programa\Microsoft\AddIns Aunque puede seleccionar cualquier otra carpeta donde guardar el complemento. Haga clic en guardar.

Para que el complemento est activo y pueda ser utilizado debe agregarlo desde Excel: 1. En el men herramientas haga clic en la opcin complementos. 2. En el cuadro de dilogo seleccione y active el complemento deseado, si no aparece en la lista, utilice el botn examinar para localizarlo en el disco duro del pc.

Centro de Formacin solucion.es

pg. 52

Uso de las funciones desde Excel y desde VBA


A pesar de que el nmero de funciones incluidas en la hoja de clculo es bastante extenso, es muy probable que, en alguna ocasin, haya echado en falta una funcin determinada o quiera transformar en funcin alguna frmula que utiliza habitualmente. Veremos cmo definir nuevas funciones en Excel para utilizarlas en la hoja de clculo. Contemplaremos la posibilidad de disponer de un nmero de argumentos variable e incluso opcional, indicaremos cmo compartirlas con otros libros y las protegeremos para impedir su modificacin o copia.

Cmo definir una funcin personalizada en Excel Cuando lea estas lneas la sonda espacial Messenger ya estar rumbo a Mercurio. En su viaje sobrevolar Venus y el peso de la sonda ser diferente en los tres planetas (incluyendo la Tierra). Suponga que la masa de la sonda es de 1.200 kg y que le interesa realizar una tabla comparativa de su peso. Como la Messenger no habr llegado a su destino final hasta el 2011, le proponemos que cree las funciones pesoTierra, pesoMercurio y pesoVenus para calcular el peso en cada planeta. Sabemos que el peso (p) de la sonda es igual a su masa (m) multiplicada por la aceleracin de la gravedad del planeta (g). Tambin sabemos que esta aceleracin es de 9,78; 2,78 y 8,87 para la Tierra, Mercurio y Venus, respectivamente. Por tanto, las tres funciones constarn de un argumento, la masa, puesto que g es constante para cada planeta. Veamos cmo sera la primera funcin:
Function pesoTierra(masa As Double) As Double Dim gTierra As Double gTierra = 9.78 pesoTierra = masa * gTierra End Function

La primera instruccin se encarga de definir el nombre de la funcin, sus argumentos y el tipo de valor que devolver. En este caso slo hay un argumento (la masa), pero es posible que una funcin no tenga argumento o que tenga varios (separados por comas). Por ejemplo, una funcin genrica para calcular el peso podra ser peso(masa As Double, gravedad as Double). Observe que se indica el tipo de dato (Double) tanto en los argumentos como en la funcin y recuerde que debe escoger un tipo de dato adecuado a sus necesidades. La segunda instruccin utiliza Dim para reservar espacio para la variable gTierra de tipo Double que posteriormente almacenar el valor 9,78. Seguidamente calculamos el peso multiplicando la masa por la gravedad y asignndola al nombre de la funcin. Por ltimo, End Function da por terminada la definicin. Las dos funciones restantes son similares. Una vez escrito el cdigo, gurdelo y cirrelo mediante el men Archivo. Slo resta probar las funciones en la hoja de clculo. Por ejemplo, si en la celda A1 tiene la masa de la sonda (1.200) y en otra escribe la frmula =pesoTierra(A1) obtendr el valor 11.736. De igual manera =pesoMercurio(A1) y =pesoVenus(A1) devolvern respectivamente 3.336 y 10.644. Funcin personalizada con argumentos opcionales Continuando con el supuesto anterior, es probable que usted piense que es ms adecuado definir una frmula general para el peso en lugar de tener una para cada planeta. Precisamente eso es lo que vamos a hacer. La funcin contar con dos argumentos: la masa y el nombre del planeta; siendo este ltimo opcional, de tal forma que si se omite, tomar por defecto el peso en la Tierra. Por ejemplo, la frmula =PESO(1200, Mercurio) retornara el peso de una masa de 1.200 kg. en Mercurio, mientras que =PESO(1200) lo retornara de la Tierra.

Centro de Formacin solucion.es

pg. 53

En la definicin de la funcin, bastar con anteponer la palabra reservada Optional al nombre del argumento e indicar que es de tipo Variant (obligatoriamente) para conseguir que sea opcional. La funcin cuenta con cuatro partes bien diferenciadas: 1. Inicializar variables. Se define la variable gravedad y se inicia con el valor cero. 2. Averiguar si el parmetro opcional se ha introducido y actuar en consecuencia. La funcin IsMissing(nombreArgumento) devolver verdadero si falta el argumento o falso en caso contrario. Observe que utilizamos la funcin UCase para pasar a maysculas el nombre del planeta y as no tener problemas en la comprobacin del nombre (no es lo mismo tierra que Tierra o TIErra). 3. Seleccionar la gravedad en base al nombre del planeta. La funcin Select Case se encargar de ello. 4. Comprobar el valor de la gravedad. Si es cero indica que el nombre del planeta no corresponde con ninguno de los contemplados y devolveremos un mensaje de error. En caso contrario calcularemos el peso con la frmula habitual. Utilice el editor de Basic de su hoja de clculo y teclee el cdigo. Tras guardar los cambios y cerrar el editor ya podr verificar si la funcin responde adecuadamente. Observe que el tipo de dato que devuelve la funcin es Variant, ya que puede retornar el peso (un nmero) o bien un mensaje de error (una cadena de texto).
Function PESO(masa As Double, Optional planeta As Variant) As Variant 1 Inicializamos la variable gravedad Dim gravedad As Double gravedad = 0 2 - Verificamos si falta el parmetro planeta si falta hacemos que el planeta sea Tierra si no falta lo transformamos a maysculas If IsMissing(planeta) Then planeta = TIERRA Else planeta = UCase(planeta) End If 3 - Asignamos el valor de la gravedad en funcin del planeta Select Case planeta Case TIERRA gravedad = 9.78 Case MERCURIO gravedad = 2.78 Case VENUS gravedad = 8.87 End Select 4 - Si la gravedad es cero quiere decir que el nombre del planeta es incorrecto o no est contemplado. La funcin devolver error. En caso contrario calcular el peso If gravedad = 0 Then PESO = Error en el argumento Planeta Else PESO = masa * gravedad End If End Function

Funcin personalizada con argumentos variables En los dos trucos anteriores hemos visto cmo definir funciones con un nmero de argumentos determinado o con varios argumentos opcionales, pero qu ocurre si el nmero de argumentos puede ser variable? Piense en la funcin Suma: puede tener desde uno hasta treinta argumentos. Para conseguir esto hay que anteponer al nombre del argumento la palabra reservada ParamArray y dems definirlo de tipo Variant (obligatoriamente). Por ejemplo:

Centro de Formacin solucion.es

pg. 54

Function masaAluminio(ParamArray volumen() As Variant)

Almacenar los argumentos de la funcin en un array llamado volumen(). Fjese en que hemos omitido el tipo de dato que devuelve la funcin, ya que por defecto es Variant. Definido el argumento, es necesario averiguar el nmero de parmetros pasados a la funcin. De ello se encarga la funcin UBound(nombreArgumento). Por ejemplo, teniendo en cuenta la funcin anterior y dada la frmula =masaAluminio(3;6;34;6), entonces UBound(volumen()) devolver 4. Conocido el nmero de argumentos almacenados en el array, es fcil recorrerlos con un bucle For y tratarlos segn corresponda. Veamos el ejemplo siguiente: dados varios volmenes de aluminio, calcula su masa total conocida de antemano su densidad. La frmula que se va a aplicar es masa=densidad*volumenTotal.
Function masaAluminio(ParamArray volumen() As Variant) Inicializa las variables Dim dAluminio, volumenTotal As Double Dim n, x As Integer dAluminio = 2.7 densidad del aluminio volumenTotal = 0 Extrae el nmero de argumentos de la funcin n = UBound(volumen()) Calcula la suma total de volumen de aluminio For x = 0 To n volumenTotal = volumenTotal + volumen(x) Next Si no hay argumentos devuelve un error en caso contrario calcula la frmula If volumenTotal = 0 Then masaAluminio = Error Else masaAluminio = volumenTotal * dAluminio End If End Function

Queda para el lector comprobar que todos los argumentos sean numricos y devolver un error en caso contrario. Igual que en los trucos anteriores, debe escribir este cdigo en el editor de Basic y posteriormente puede probar la funcin creando una frmula en la hoja de clculo. Por ejemplo =masaAluminio(100;550;450;600) devolver 4.590. Utilizar una funcin personalizada desde otro libro Las funciones definidas anteriormente slo funcionarn en el libro donde las ha creado, as que deber utilizar lo visto anteriormente para exportarlas a modulos .BAS o guardarlas como complementos .XLA

Centro de Formacin solucion.es

pg. 55

PROGRAMACION VBA PARTICULARIDADES DE EXCEL


La historia de las hojas de clculo Excel
Hoy en da, Microsoft Excel domina el mercado de las hojas de clculo, obteniendo una cuota de mercado alrededor de 90%, una de las razones es la maleabilidad que le otorga al producto el que se pueda programar en VBA. Aunque este se usa tambin en otras aplicaciones de Office donde ms se integra habitualmente es aqu en EXCEL(salvo en proyectos de base de datos en access). Ejemplos de algunas versiones de Excel
Excel 95 Durante la siguiente dcada, nuevas versiones de Excel salieron a la luz, incorporando ms y ms funciones. El prximo gran salto fue Excel 95, entregado en el ao 1.995. Este fue la primera versin de 32 bits, y realmente fue la que marc el paso para el Excel actual. Excel 97 Excel 97 dio todava ms poder a programacin, y sta es muchas veces combinada con Windows NT. Excel 2000 Excel 2000 sali en el ao 1.999, todava ms orientada haca la web, y definitivamente tena una apariencia ms moderna que la del 97. Excel 2002 Excel 2002 se introdujo en el ao 2.001, y forma parte de la familia XP. Excel 2003 Posiblemente la versin de Excel ms extendido. Para la mayora de nosotros, Excel 2000 es ms que suficiente lo que se ha ido aadiendo a partir de Excel 2000 es en mayora funciones de ayuda. Claro, aparte de la introduccin a XML, que es algo muy importante. Excel 2007 El Office 2007 tiene un aspecto diferente, es decir un sistema nuevo de los mens. Han mejorado los grficos bastante. Sin embargo, la verdad es que Excel lleva ya 10 aos sin cambios ni novedades significativas.

Numeracin de las versiones de Excel


Microsoft tiene una numeracin de los productos Office, para todos los programas de esta suite ofimtica:
Numeracin 12 11 10 9 8 7 Versin Excel Excel 2007 Excel 2003 Excel 2002 XP Excel 2000 Excel 97 Excel 95

Un ejemplo de cmo utilizar esta numeracin es el objeto Application que trataremos en el prximo punto. Este objeto tiene una propiedad Version, que devuelve la versin Excel de la mquina.
Sub DevolverVersionExcel() Dim intVersionExcel as String intVersionExcel = Application.Version Msgbox intVersionExcel End sub

Tipos de archivo
El propio archivo .XLS, ej. Factura.xls. Es el contenedor tanto de todas las hojas de un libro, como de los mdulos de VBA. Tambin hay otros formatos de libros de Excel, de los que nos interesa conocer los siguientes:

Centro de Formacin solucion.es

pg. 56

Nombre Excel Workbook Excel Add-in (complementos) Template (plantillas)

Extensin .xls .xla .xlt

Hoja de clculo
El libro contiene 1 o ms hojas. Por defecto, Excel te da 3 hojas al abrir un libro nuevo. No obstante, podrs cambiar este nmero en Herramientas Opciones. Adems, la hoja puede presentar filas/columnas de dos maneras- A1 o L1C1 (Herramientas Opciones General). Estilo A1 R1C1 L1C1 Qu significa Columnas se expresan por letras. Filas por nmeros Columnas y filas se expresan por nmeros. Usado en VBA Columnas y filas se expresan por nmeros. Usado en las hojas de clculo Ejemplo A4, A$4:B$8 R4C1, R[4]C1, R4C1

Columnas Cada hoja contiene 256 columnas, una cifra no variable. Filas Cada hoja contiene 65.536 filas, y no se puede alterar este nmero. Y qu pasa si suprimimos unas 10 filas? Pues, Excel nos aadir 10 nuevas al final de la columna. Celdas Las intersecciones entre columnas y filas son las celdas. 256 col. X 65.536 lneas te dan 16.777.216 celdas en cada hoja. Es decir suficiente. Contenido de celdas

Una celda puede contener 3 tipos de datos.


Texto Nmeros (valores) Frmulas (ecuaciones o funciones propias de Excel/usuario)

Formato de celda Aparte del contenido, la celda tambin guarda un formato. El formato dice, por ejemplo, que el valor de la celda se va a poner en negrita y cursiva o como se ver un nmero determinado, cantidad de decimales, smbolos de moneda etc. La distincin entre valor y formato es muy importante que se tenga clara.

Centro de Formacin solucion.es

pg. 57

Objetos de Excel VBA


Funciones de VBA para Obtener datos de la aplicacin

El objeto Application de VBA nos da informacin del usuario/mquina. En este artculo presentaremos unas aplicaciones del un objeto muy bsico de Excel/VBA: Application. Este representa todo el conjunto del programa Excel y sus libros de trabajo. Propiedades del objeto Application El objeto Application tiene muchas propiedades. Hay unas que pueden ser interesantes para el programador de macros VBA de Excel.
Objeto Application. Propiedad UserName OrganizationName OperatingSystem Version ProductCode StandardFont StandardFontSize DecimalSeparator ActivePrinter DefaultFilePath UserLibraryPath Devuelve Nombre del usuario Nombre de la empresa Sistema operativo Versin de MS Excel Cdigo de MS Excel Fuente por defecto Tamao fuente por defecto Carcter separador de miles Impresora por defecto Ruta de acceso por defecto Ruta a carpeta Add-ins

Ejemplos prcticos del objeto Application de Excel

Presentar la impresora activa del usuario


Para presentar la impresora activa del usuario, en una caja de dilogo, pondramos:
Sub DevolverImpresoraActiva() Dim strImpresoraActiva as String strImpresoraActiva = Application.ActivePrinter Msgbox strImpresoraActiva End sub Todava ms cmodo: Sub DevolverImpresoraActiva2() Msgbox Application.ActivePrinter End sub

Crear lista extensa de informacin sobre la mquina del usuario


Abajo te presentamos una macro para presentar varios datos del usuario/maquina.
Sub Application_Data() 'dimensiones Dim strDataArray(10) As String Dim i, x As Integer 'recoger datos del objeto 'Application' strDataArray(0) = Application.UserName strDataArray(1) = Application.OrganizationName strDataArray(2) = Application.OperatingSystem strDataArray(3) = Application.Version strDataArray(4) = Application.ProductCode strDataArray(5) = Application.StandardFont strDataArray(6) = Application.StandardFontSize

Centro de Formacin solucion.es

pg. 58

strDataArray(7) = Application.DecimalSeparator strDataArray(8) = Application.ActivePrinter strDataArray(9) = Application.DefaultFilePath strDataArray(10) = Application.UserLibraryPath 'presentar los datos en celdas D3... x = 0 For i = 3 To 13 Cells(i, 4) = strDataArray(x) x = x + 1 Next i End Sub '----------------------------------------------------Sub SuprimirDatosEnceldas() 'suprimir datos antiguos Range(Cells(3, 4), Cells(13, 4)).ClearContents End Sub

Determinar idioma del usuario desde Excel VBA


Este marcado sirve para averiguar el idioma de Excel del usuario. La funcin Application.International de Excel VBA nos ayuda. Lo nico es que hay que saber los marcadores de telefona de los pases para descodficar la respuesta de la funcin.
Sub DeterminarPais() CodigoPais = Application.International(xlCountryCode) Select Case CodigoPais Case 1 MsgBox ("Hello") Case 34 MsgBox ("Hola") End Select End Sub

Centro de Formacin solucion.es

pg. 59

Funciones de VBA para trabajar con libros


Cerrar libro Excel (guardar cambios) ActiveWorkbook.Close Savechanges:=True ActiveWorkbook.Close(True)

Cerrar libro Excel (sin guardar cambios) ActiveWorkbook.Close(False) ActiveWorkbook.Close Savechanges:=False

Abrir libro Excel (ruta conocida) Workbooks.Open FileName:="C:\Trabajo\Informe.xls"

Abrir libro Excel ( usando un cuadro de dilogo) Sub abrir() On Error GoTo fallo MsgBox "Elija archivo para abrir." strArchivo = Application.GetOpenFilename Workbooks.OpenText Filename:=strArchivo If strArchivo = "" Then Exit Sub End If strArchivo = ActiveWindow.Caption fallo: Exit sub End sub

Devolver nombre del libro Excel strNombre = ActiveSheet.Parent.FullName MsgBox ActiveWorkbook.FullName

Centro de Formacin solucion.es

pg. 60

Funciones de VBA para acceder y modificar hojas


Obtener Nombre de la hoja activa Activesheet.Name

Asignar Nombre de la hoja activa Activesheet.Name = Mi hoja

Insertar hoja nueva (elegir posicin antes de la hoja x) ActiveWorkbook.Sheets.Add Before:=Worksheets("Informe1")

Insertar hoja nueva (Copiando datos de informe1 al final de todas las hojas) Sheets("Informe1").Copy After:=Worksheets(Worksheets.Count)

Mover una hoja Worksheets("informe5").Move After:=Worksheets("Informe4")

Ordenar hojas (orden alfabtico)


intNumeroHojas = ActiveWorkbook.Worksheets.Count For i = 1 To intNumeroHojas For j = i To intNumeroHojas If LCase(Worksheets(j).Name) < LCase(Worksheets(i).Name) Then Worksheets(j).Move Before:=Worksheets(i) End If Next j Next i

Suprimir todas las hojas con orden alfabtico mayor o igual que 'Informe'
Application.DisplayAlerts = False For i = 1 To Sheets.Count Sheets(i).Activate xxx = ActiveCell.Worksheet.Name If xxx >= "Informe" Then ActiveWindow.SelectedSheets.Delete End If Next Application.DisplayAlerts = True

Seleccionar primera hoja


ActiveWindow.ScrollWorkbookTabs Position:=xlFirst

Seleccionar ltima hoja


ActiveWindow.ScrollWorkbookTabs Position:=xlLast

Centro de Formacin solucion.es

pg. 61

Ejemplo con el evento despues de hacer doble clic en una hoja


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox ActiveSheet.Name ActiveSheet.Name = "hola" ActiveSheet.Name = "Informe 1" Worksheets("Informe 1").Activate Range("a1").Activate ActiveCell.Value = "Soy informe 1" ActiveWorkbook.Sheets.Add Before:=Worksheets("Informe 1") Sheets("Informe 1").Copy After:=Worksheets(Worksheets.Count) End Sub

Centro de Formacin solucion.es

pg. 62

Usar funciones de Excel desde VBA


Las funciones de Excel desde VBA se utilizan usando la misma sintaxis que en Excel pero lo que varia es su nombre, el nombre traducido al espaol no es vlido para ellas por lo que a continuacin se muestra como deben emplearse: Utilizar funciones Excel en VBA Tenemos un rango varSuma, el rango a sumar. Para sumar las celdas de este rango tenemos que llamar a la funcin SUM de Excel.
Application.WorksheetFunction.Sum(varSuma)

De esta manera puedes aplicar cualquier frmula de Excel en VBA, con tal de que empieces la lnea de cdigo con Application.WorksheetFunction... [ Ejemplo ] En este ejemplo el rango que nos interesa sumar son los valores correspondientes a "BB", es decir C8:C13.

Escribir la suma (en celda)


'el rango a sumar varSuma = Range(Cells(8, 3), Cells(13, 3)) 'sumar el rango Cells(1, 1) = Application.WorksheetFunction.Sum(varSuma)

Escribir la suma (en variable)


'el rango a sumar varSuma = Range(Cells(8, 3), Cells(13, 3)) 'sumar el rango SUMA = Application.WorksheetFunction.Sum(varSuma)

Centro de Formacin solucion.es

pg. 63

Acceder al formato de las celdas desde VBA


Excel pone a disposicin un montn de formatos. Abajo presentamos como modificar algunos de ellos a travs de macros Excel VBA. Formato del nmero
Set Area = Selection For Each Cell In Area z = Round(Cell, 2) Cell.Value = z Cell.NumberFormat = "#,##0.00" Next Cell

Formatear fuente
Cells.Select With Selection.Font .Name = "MS Sans Serif" .Size = 10 End With

Lneas de divisin
ActiveWindow.DisplayGridlines = False

Indice de colores
ActiveWorkbook.Colors(44) = RGB(236, 235, 194) 'verde

Colorear rango
Range("A1:B10").Interior.ColorIndex = 44

Cambiar entre estilos A1 / RC


Application.ReferenceStyle = xlA1Application.ReferenceStyle = xlR1C1

Centro de Formacin solucion.es

pg. 64

Copiar, pegar, y auto relleno desde VBA


Copiar y pegar un rango (opciones por defecto)
Sub copiarypegar() Range("D5:F19").Select Selection.Copy Range("H5:J19").Select ActiveSheet.Paste End Sub

Copiar y pegar un rango (concidiendo con el formato en destino)


Sub copiarformatodestino() Range("C5:E16").Select Selection.Copy Range("G5:I17").Select Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False End Sub

Usar el autorrelleno
Sub autorrelleno() Range("G9").Select ActiveCell.FormulaR1C1 = "1" Range("G9").Select Selection.AutoFill Destination:=Range("G9:G31"), Type:=xlFillDefault End Sub

NOTA: Para el uso de todas estas funciones especficas de excel no es necesario memorizar, ya que como vimos en temas anteriores puede utilizarse el grabador de macros de Excel para generr el cdigo y luego reutilizar este.

Centro de Formacin solucion.es

pg. 65

Funciones de VBA para fechas, horas y tratamiento de texto


Existen varias funciones tiles para el manejo de cadenas de caracteres (Strings). Estas funciones se utilizan para la evaluacin, manipulacin o conversin de cadenas de caracteres. Nmero de caracteres de una cadena Len(string | varname)

Conversin a minsculas o a maysculas LCase(x), UCase(x)

Conversin de cadenas a nmeros Val(string)

Conversin de nmeros a cadenas Str(n), CStr(n),

Extraccin de un n de caracteres de una cadena Mid(string, ini, n) string es la cadena, ini el carcter de inicio n el numero de caracteres a extraer Right(string, length), lenght indica el nmero de caracteres a extraer por la derecha de una cadena Left(string, length) lenght indica el nmero de caracteres a extraer por la izquierda de una cadena

Extraccin de sub-cadenas Split(string, [[delim], n]) devuelve un array con las n (-1 para todas) subcadenas separadas por delim (por defecto, el espacio)

Unin de sub-cadenas Join(string, [delim])

Comparacin de cadenas de caracteres strComp(str1, str2) devuelve -1, 0, 1 segn str1 sea menor, igual o mayor que str2 Es necesario tener presente que cuando se quieren comparar dos cadenas de caracteres, comparacin se realiza por defecto en funcin del cdigo ASCII asociado a cada letra . Esto significa que por ejemplo aa es posterior a casa debido a que la letra tiene un cdigo ASCII asociado superior a la letra s ( es el 164; s es el 115). Esto mismo ocurre con las vocales acentuadas. Si se desea conseguir una comparacin alfabtica lgica es necesario incluir al comienzo del modulo de cdigo la sentencia Option Compare Text (frente a Option Compare Binary establecida por defecto). La funcin strComp() admite un tercer argumento que permite especificar el tipo de comparacin (constantes vbBinaryCompare o vbTextCompare).

Hallar si una cadena es parte de otra InStr([n], str1, str2) devuelve la posicin de str2 en str1 (est contenida como sub-cadena) buscando a partir del carcter n

Centro de Formacin solucion.es

pg. 66

[ Ejemplos ]
MyDouble = 437.324 MyString = CStr(MyDouble) MyValue = Val("2457") MyValue = Val(" 2 45 7") MyValue = Val("24 and 57") AnyString = "Hello World" MyStr = Right(AnyString, 6) MyStr = Left(AnyString, 7) MyStr = Right(AnyString, 20) i = StrComp("casa", "caa") MyString = "Mid Function Demo" LastWord = Mid(MyString, 14, 4) MidWords = Mid(MyString, 5) ' ' ' ' ' ' ' ' ' MyDouble MyString Devuelve Devuelve Devuelve es un Double. contiene "437.324". 2457. 2457. 24.

Se define el string. Devuelve " World". Devuelve "Hello W". Devuelve "Hello World".

' Devuelve 1 por defecto y 1 con Option Compare Text ' Se crea un nuevo string. ' Devuelve "Demo". ' Devuelve "Function Demo".

Existe adems el operador de concatenacin & que puede ser utilizado con cadenas de caracteres. Se utiliza para poner una cadena a continuacin de otra. Por ejemplo: str1 = "My first string" 'Se inicializan los strings str2 = "My second string" TextoFinal = str1 & str2 'TextoFinal vale "My first stringMy second string" El operador "+" opera de forma anloga, pero su uso se desaconseja pues en ciertas ocasiones convierte las cadenas en nmeros y realiza la suma.

Centro de Formacin solucion.es

pg. 67

Avanzando, Tipos de datos Compuestos:


Vectores Los Vectores se utilizan para almacenar un conjunto de variables, que sean del mismo tipo de dato, y todas estas bajo un mismo nombre. Por ejemplo imaginemos que tenemos 20 variables de tipo String que almacenan nombres (nombre1, nombre2, etc..). Si yo ahora quisiera pasar todas estas cadenas a minsculas tendra que utilizar la funcin Lcase con cada variable: nombre1 = Lcase(nombre1), nombre2 = Lcase(nombre2), etc.. En cambio si utilizara un vector solucionara el problema Dim nombres(30) As String For x = 0 To 30 nombres(x) = LCase(nombres(x)) Next Siguiendo el ejemplo anterior: en vez de escribir la sentencia Lcase 30 veces para cada variable, hemos utilizado un vector llamado nombres con un nmero de ndice 30, es decir que almacena 30 datos de tipo String.

Declaracin de los vectores en el cdigo Para crear un vector se debe en primer lugar declararlo como cualquier otra variable, la nica diferencia es que debemos indicar la cantidad de elementos que contendr el vector, colocando el nmero de ndice entre parntesis. Por ejemplo: Lo siguiente crea un vector de 15 elementos o datos de tipo integer Dim miVector (1 to 15) as integer Esto crea un vector de 11 elementos o datos de tipo String Dim empleados (10) as String Como podemos ver en el primer ejemplo hemos declarado un vector llamado miVector y entre parntesis hemos declarado el rango de capacidad del mismo, es decir la cantidad de datos que podr contener. El primer nmero , el 1 , indica el lmite inferior del mismo, y el nmero 15 indica el lmite mximo del vector, conformando de esta manera un vector que podr almacenar 15 datos de tipo string. En el segundo ejemplo, declaramos un vector de 11 elementos de tipo string. Como pods ver hemos indicado solo un nmero que representa el valor mximo del mismo. Cabe aclarar que hemos puesto de ndice el nmero 10, pero en realidad el vector contiene 11 elementos ya que cuando NO indicamos el limite inferior, se asume que el mismo comienza desde el 0. Importante: los vectores se dividen en 2 grupos, los vectores y las matrices. Los vectores son vectores que contienen una sola dimensin y las matrices 2 o ms dimensiones. Acceder a los datos de un vector Para acceder a los datos de un vector o vector, debemos hacerlo mediante el ndice o nmero del elemento del mismo. Por ejemplo: Dim alumnos(1 To 4) As String alumnos(1) = "juan" alumnos(2) = "micaela" alumnos(3) = "mara" alumnos(4) = "ignacio"

Centro de Formacin solucion.es

pg. 68

Primero declaramos un vector llamado alumnos, de tipo string y que contendr 4 elementos. Luego le asignamos un valor de cadena como a cualquier otra variable de tipo string, pero con la diferencia que para referirnos al elemento utilizamos el n de ndice del mismo. Otro ejemplo: Dim paises(2) As String ' Llena el vector con datos paises(0) = "Argentina" paises(1) = "Per" paises(2) = "Brasil" ' Recorre los elementos del vector For x = 0 To 2 MsgBox "Nombre del pas : " & paises(x) Next x En este ltimo ejemplo, declaramos y creamos un vector de 3 elementos que contendr el nombre de 3 pases. Luego en un bucle For utilizamos la funcin MsgBox para mostrar los elementos del vector, pasndole como parmetro del ndice la variable x del bucle For Utilizar una estructura Type en un vector Como vimos, en un vector podemos almacenar datos de cualquier tipo pero no mezclarlos, es decir podemos crear vectores de tipo string, de tipo Integer etc,,, pero sin duda que lo mas importante y de mas utilidad a la hora de programar es la utilizacin de datos definidos por nosotros mediante una estructura Type. Por ejemplo: Option Explicit ' Estructura de dato para el vector Private Type agenda nombre As String apellido As String cpostal As Integer End Type

Sub Gestor_Agenda() ' Declaramos el vector Dim personas(1 To 3) As agenda ' Llenamos con datos para el elemento 1 del vector personas(1).nombre = "carlos" personas(1).apellido = "Martnez" personas(1).cpostal = 1900 ' Llenamos con datos para el elemento 2 del vector personas(2).nombre = "Hctor"

Centro de Formacin solucion.es

pg. 69

personas(2).apellido = "rosales" personas(2).cpostal = 1898 ' Llenamos con datos para el elemento 3 del vector personas(3).nombre = "Albert" personas(3).apellido = "Einstein" personas(3).cpostal = 1324 End Sub Para utilizar una estructura definida por nosotros en vectores o matrices, se hace de la forma habitual, con la diferencia que debemos declarar el vector utilizando el tipo de dato Type que hayamos creado, en este caso Dim personas (1 to 3) as agenda Las matrices Como se dijo anteriormente, las matrices son vectores de mas de 1 dimensin (2 o mas), a diferencia de los vectores que poseen una sola dimensin. Podemos imaginar una matriz bidimensional ( 2 dimensiones) , como una cuadrcula con filas y columnas, donde las filas representaran las coordenadas x y las columnas las coordenadas y. A una matriz de 3 dimensiones o tridimensional se la puede imaginar con las coordenadas x, y, z, y esta es ideal para representar figuras en el espacio por ejemplo. Las matrices se declaran en el cdigo de manera igual que los vectores, con la diferencia que debemos indicar mas subndices de acuerdo a la cantidad de dimensiones que posea la matriz. Por lo general no se suele utilizar matrices de mas de 3 dimensiones.. Ejemplo de matriz de 2 dimensiones Matriz bidimensionales de 6 x 8 (de 2 dimensiones). Dim personas (1 to 6, 1 to 8) as string Si luego quisiera acceder a los datos de la misma basta con referirnos a los subndices. Por ejemplo: personas personas personas personas personas personas personas personas personas (1, (2, (1, (1, (2, (4, (6, (6, (6, 1) 1) 7) 8) 2) 1) 2) 5) 8) = = = = = = = = = "Natalia" "pedro" "valeria" "jos" "carolina" "raquel" "eustaquio" "maria" "mariana"

El total de ndices posibles para almacenar datos o valores en el ejemplo anterior es de 48 datos, ya que si multiplicamos 6 x 8 nos da como total 48 valores posibles para utilizar en la matriz bidimensional. En este ejemplo creamos una matriz de 3 dimensiones de 3 x 3 x 3 Dim cubo (1 to 3, 1 to 3, 1 to 3) as integer

Centro de Formacin solucion.es

pg. 70

Para acceder a los datos sera exactamente de la misma manera pero debemos utilizar un ndice mas. Ejemplo: cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo cubo (1, (1, (1, (1, (1, (1, (1, (1, (1, (2, (2, (2, (2, (2, (2, (2, (2, (2, (3, (3, (3, (3, (3, (3, (3, (3, (3, 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3 , , , , , , , , , , , , , , , , , , , , , , , , , , , 1) 2) 3) 1) 2) 3) 1) 2) 3) 1) 2) 3) 1) 2) 3) 1) 2) 3) 1) 2) 3) 1) 2) 3) 1) 2) 3) = = = = = = = = = = = = = = = = = = = = = = = = = = = 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50

En el ejemplo anterior, que es un poco extenso, es para que veas todos los posibles valores que puedes almacenar en una matriz de 3 x 3 x 3, y que da como resultado un vector de 27 valores posibles. Vectores dinmicos Hasta ahora habamos visto solo vectores o vectores de tamao fijo, pero qu pasa cuando no sabemos el tamao o el largo de un vector y queremos que sea variable ?. Visual basic posee una sentencia o funcin que nos permite cambiar el largo de un vector en tiempo de ejecucin, dndonos as ms flexibilidad, y de esta manera no desperdiciar memoria y recursos de la pc creando vectores mas largos de lo que realmente necesitamos. Esta funcin se llama ReDim y ReDim Preserve, y un ejemplo de como aplicarla sera de la siguiente manera: [ Ejemplo de vectores y vectores dinmicos ] En lo siguiente, primero declaramos un vector de la forma como lo hacemos siempre con la diferencia de que en vez de colocar un tamao declaramos el vector solo con los parntesis: Dim alumnos() as string Ahora le establecemos un tamao, por ejemplo de 4 elementos y le agregamos valores: ReDim alumnos(1 To 4) As String alumnos(1) = "Luciano" alumnos(2) = "Esteban"

Centro de Formacin solucion.es

pg. 71

alumnos(3) = "Mariano" alumnos(4) = "Pedro"

Ahora para redimensionar el tamao del vector por ejemplo a 7 elementos, utilizamos la funcin ReDim Preserve, para preservar los 4 valores anteriores y le agregamos 3 valores mas: ReDim Preserve alumnos(1 To 7) alumnos(5) = "Karina" alumnos(6) = "Ral" alumnos(7) = "Romina" Nota: si utilizamos la sentencia ReDim, o mejor dicho si redimensionamos el vector sin utilizar la sentencia ReDim preserve, los valores que contena el vector anteriormente se perdern Eliminar o vaciar un vector Para eliminar un array, vector o vector, podemos utilizar Erase, por ejemplo: Erase Nombre_Del_Vector Funciones de VB para trabajar con Vectores - LBound y UBound Estas funciones son ideales para trabajar con vectores y matrices que han sido declaradas dinmicamente Lbound y Ubound nos devuelve un nmero de tipo Long que nos permite saber el lmite superior e inferior de un vector o una matriz. [ Ejemplo de UBound y LBound ] Private Sub matrices()

'Variables Para almacenar los lmites superior e inferior Dim LimiteInferior As Long Dim LimiteSuperior As Long 'Declaramos 3 matrices, de una dimensin, _ de dos dimensiones y de 3 Dim UnVector(1 To 520) As Integer Dim UnaMatriz(20, 5 To 100) As String Dim OtraMatriz(10, 20, 30) As Long ' Devuelve 1 LimiteInferior ' Devuelve 520 LimiteSuperior ' Devuelve 0 LimiteInferior ' Devuelve 20 LimiteSuperior ' Devuelve 5 LimiteInferior ' Devuelve 100 LimiteSuperior ' Devuelve 0 LimiteInferior ' Devuelve 10 LimiteSuperior ' Devuelve 0

= LBound(UnVector) = UBound(UnVector) = LBound(UnaMatriz, 1) = UBound(UnaMatriz, 1) = LBound(UnaMatriz, 2) = UBound(UnaMatriz, 2) = LBound(OtraMatriz, 1) = UBound(OtraMatriz, 1)

Centro de Formacin solucion.es

pg. 72

LimiteInferior = LBound(OtraMatriz, 2) ' Devuelve 20 LimiteSuperior = UBound(OtraMatriz, 2) ' Devuelve 0 LimiteInferior = LBound(OtraMatriz, 3) ' Devuelve 30 LimiteSuperior = UBound(OtraMatriz, 3)

End Sub

Como habrs visto en los ejemplos anteriores, para conocer los limites superiores e inferiores en los vectores, solo se debe pasar como parmetro a las funciones Lbound y Ubound, el nombre del vector con el cual queremos trabajar. En cambio en las matrices se aade un segundo parmetro en el cual debemos indicar el nmero de la dimensin en la cual queremos recuperar los valores. [ Ejemplo 2 de LBound y UBound ] Si deseamos recorrer todos los elementos de un vector o una matriz podemos hacerlo mediante un bucle For de la siguiente manera: For x = LBound(vector) To UBound(vector) MsgBox vector(x) Next x

Funcin Join, Split y Filter especficas de vectores de tipo string: Visual basic incorpora estas 3 funciones para trabajar solo con vectores. Estas funciones estn relacionadas con el tratamiento de las cadenas de caracteres. Funcin Join: Esta funcin se utiliza para unir en una sola variable el conjunto de subcadenas de un vector. Esta funcin tiene solo 2 parmetros y es muy fcil de usar. Ejemplo: Dim micadena as string Dim vector(1 To 3) As String vector(1) = "Carlos" vector(2) = "Pedro" vector(3) = "Juan" Ahora ejecutando Join, la variable micadena pasara a valer "Carlos-Pedro-Juan" micadena = join (vector, "-") Nota: En el primer parmetro de la funcin debemos indicar el vector en el cual trabajar, y en el segundo se debe indicar un delimitador de caracter para separar las cadenas. Si no especificamos ninguno, visual basic utilizar por defecto un espacio vaco o en blanco (" ") para separar cada subcadena. Funcin Split: Esta funcin hace el trabajo inverso de la funcin Join. Split se utiliza para rellenar un vector dinmico que contiene un nmero de subcadenas a partir de una cadena que le pasamos como parmetro a la funcin.

Centro de Formacin solucion.es

pg. 73

Para aclarar un poco un ejemplo:


Sub Dividir() 'Una variable para almacenar una cadena Dim Micadena As String 'Vector dinmico Dim Vector() As String 'Le damos un valor a la variable Micadena = "maria/natalia/romina" 'Ejecutamos la funcin Split Vector = Split(Micadena, "/") 'Ahora el vector dinmico pasara a contener los siguientes valores: Vector(0) = "mara" Vector(1) = "natalia" Vector(2) = "Romina" MsgBox Vector(0) MsgBox Vector(1) MsgBox Vector(2) End Sub

Nota: una cosa importante es que en el vector anterior no se ha declarado un rango, ya que la funcin devuelve un vector cuya cantidad de elementos se ignora, es decir no se conoce. Funcin Filter: La funcin Filter se utiliza para filtrar subcadenas de un vector string dependiendo de un determinado criterio de bsqueda. Los parmetros que lleva la funcin son los siguientes:
Filter (vector donde buscar, cadena a buscar, valor booleano que indica si incluir o excluir la cadena)

Ejemplo:
' Vector Dim Alumnos(1 To 4) As String ' Vector dinmico para almacenar el resultado Dim Resultado() As String Alumnos(1) Alumnos(2) Alumnos(3) Alumnos(4) = = = = "Luciano" "Lucas" "juan" "Natalia"

' Ejecutamos Filter Resultado = Filter(Alumnos, "Lu", True) ' Ahora el vector dinmico "resultado" pasa a contener MsgBox Resultado(0), vbInformation ' Luciano MsgBox Resultado(1), vbInformation ' Lucas

Centro de Formacin solucion.es

pg. 74

Control de errores en Visual Basic


On Error Resume Next La instruccin On Error Resume Next especifica que, en caso de que se produzca un error en tiempo de ejecucin, el control pase a la instruccin inmediatamente siguiente a aqulla en que se haya producido el error. En ese momento, contina la ejecucin. On Error Resume Next permite colocar las rutinas de control de errores en los lugares donde se prevea que pueden producirse, en lugar de transferir el control a otro punto del procedimiento. On Error Goto [Etiqueta] [Etiqueta]: sentencia Exit Sub La instruccin On Error Goto especifica que, en caso de que se produzca un error en tiempo de ejecucin, el control pase a la instruccin inmediatamente siguiente a la etiqueta definida. En ese momento, contina la ejecucin. On Error goto permite colocar las rutinas de control de errores al final del procedimiento o funcin para evaluatr el error y especificar el tipo. Ejemplo ya empleado en el manual del control de errores: Sub abrir() On Error GoTo fallo MsgBox "Elija archivo para abrir." strArchivo = Application.GetOpenFilename Workbooks.OpenText Filename:=strArchivo If strArchivo = "" Then Exit Sub End If strArchivo = ActiveWindow.Caption fallo: Exit sub End sub

Centro de Formacin solucion.es

pg. 75

Controles en la hoja de clculo.


En este tema estudiaremos como insertar controles (botones, cuadros de texto, cuadros de lista, botones de radio, etc. ) dentro de una hoja de clculo Seguramente es ms habitual utilizar este tipo de controles dentro de formularios y a travs de ellos gestionar datos de una o varias hojas, sin embargo resulta conveniente muchas veces incluir directamente estos controles dentro de una misma hoja, sobre todo cuando slo se requiere procesos simples como elegir datos de una lista o activar una macro desde un botn, etc. Ms adelante veremos como hacerlo en los formularios. Una Aplicacin como Ejemplo Para ver el funcionamiento de los distintos controles, construiremos una pequea aplicacin que nos sirva para gestionar una pequea tabla de registros, bsicamente extraer datos que cumplan una determinada condicin. La mayora de funciones que aplicaremos pueden hacerse directamente desde las utilidades del men Datos/ Filtro avanzado que lleva incorporado el propio Excel pero creemos que ser un buen ejemplo para ver las posibilidades de los controles. Mostrar la barra de herramientas para cuadros de control. Obviamente para insertar controles en la hoja deber tener activada la barra de controles. Active Ver/Barras de Herramientas/ Cuadro de Controles. Cuadro de texto y Botn. Lo primero que haremos es algo muy sencillo, simplemente copiaremos en Hoja2, los datos correspondientes a los registros de Hoja1 cuyos datos correspondientes a la columna Nombre coincidan con el que teclearemos en una cuadro de texto que insertaremos en Hoja2. Los datos se copiaran a partir de la celda A16. El botn simplemente servir para invocar la macro que copiar los datos. Insertar el cuadro de texto. Slo tiene que seleccionar el elemento de la barra de controles y dibujarlo sobre la hoja (Hoja 2 en nuestro ejemplo, procure que coja ms o menos el rango correspondiente a las celdas C2 y D2. Insertar una etiqueta. Las etiquetas sirven bsicamente para acompaar los controles con texto descriptivo. Seleccione el botn y dibuje en la hoja el rectngulo para insertar la etiqueta, pngalo al lado del control cuadro de texto. Insertar un Botn. Los botones se utilizan bsicamente para invocar las macros que realizarn las acciones. No es el nico control que puede invocar macros, cualquiera de los controles puede invocarla, pero es el ms habitual. Cambiar las propiedades de los objetos. A continuacin desplegaremos la ventana de propiedades para cambiar algunas de los objetos acabados de incrustar. Debe estar en modo diseo, el botn debe estar activado. Cambiar el texto del control Label. Propiedad Caption. 1. Seleccione el control Etiqueta. 2. Pulse sobre el botn de la barra de controles, se activa la ventana de Propiedades. 3. En la propiedad Caption, cambien el texto Label1 por Datos a Buscar. 4. Ajuste la posicin y el tamao del control. Cambiar el nombre del control Cuadro de Texto. Propiedad Name. No es necesario cambiar el nombre de los controles pero si muy conveniente, tenga en cuenta que a travs de los nombres de un control ser como se refiera a ellos a travs de las macros. Siempre es mejor llamar

Centro de Formacin solucion.es

pg. 76

a un control por un nombre descriptivo que por Text1 o Command1, etc. Al control cuadro de texto le pondremos el nombre Datos_Buscar. 1. Seleccione el control Cuadro de Texto. 2. Si no tiene activada la ventana de propiedades, actvela. 3. En la propiedad Name, cambie el text1 por Datos_Buscar. 4. Cambie la propiedad Captin del Botn por Copiar Datos y su propiedad Name por Copiar_Datos
(debe poner el guin bajo ya que la propiedad Name no permite espacios en blanco).

Establecer la accin de copiar datos cuando se pulse el botn. A continuacin crearemos la macro que ser invocada cuando se pulse el botn. La macro simplemente debe buscar en la columna A de la lista de Hoja1 el nombre que coincida con el tecleado en el cuadro de texto y luego copiarlo hacia Hoja2 a partir de la casilla A16. La macro controlar que haya algo en el cuadro de texto. Se copiaran todas las coincidencias, es decir si hay dos nombres Ramn se copiarn los dos. Si no hay ninguna coincidencia se mostrar un mensaje avisando de ello. Los eventos. Cuando se programan controles bien sea directamente en la hoja como estamos haciendo ahora o desde un formulario, debe tener en cuenta los eventos. Un evento en cuando ocurre algo sobre un objeto, en entornos Windows constantemente se estn produciendo eventos. Clicks con el ratn sobre un control, teclear sobre un cuadro de texto, etc. provocan eventos que son recogidos por el sistema. Programar un evento significa hacer que se ejecuten determinadas instrucciones cuando ocurra dicho evento. En el caso que nos ocupa ahora, haremos que las acciones necesarias para copiar los datos se ejecuten cuando se haga un clic sobre el botn Copiar_Datos. En general, todos los controles son capaces de capturar diferentes eventos. El sistema de eventos es bastante ms complejo de lo que estudiaremos aqu, nosotros simplemente tendremos en cuenta que evento debemos elegir para lanzar la ejecucin de determinado cdigo. Veamos en la siguiente seccin como asociar el cdigo necesario para copiar datos cuando ocurre el evento click (`pulsar el botn y soltarlo) sobre el botn Copiar_Datos. Escribir cdigo para el evento Click del Botn. Deber estar en modo Diseo, asegrese que el botn est pulsado. 1. Haga doble click sobre el botn, observe que se activa automticamente la ventana de Visual Basic y aparece un esqueleto de funcin Sub Copiar_Datos_Click() End Sub Es lo que se llama procedimiento de evento, es decir, este procedimiento est asociado al evento Click del Botn Copiar_Datos, observe que el procedimiento lleva un nombre compuesto por el nombre del control "Copiar_Datos", un guin bajo y el nombre del evento "Click", en general todos los procedimientos de evento se nombra de esta forma, NombreDeControl_NombreDeEvento Observe la lista de la parte superior derecha, la que tiene el elemento Click. Es la lista de eventos, si la despliega ver que adems del elemento Click aparecen unos cuantos ms DblClick (Doble Click) Gotfocus (Coger el foco), etc. todos ellos son eventos programables del control botn, es decir, podemos incluir cdigo que se ejecutar cuando ocurren dichos eventos. Por otra parte, todos los controles tienen un evento "por defecto", dicho de otra forma, cuando se programa un evento del control casi siempre ser ese. En el caso de nuestro botn (y de todos los botones), el evento por defecto es Click, observe que lo habitual es que queramos que el cdigo se ejecute cuando se hace click sobre el botn, no cuando este coge el foco o cuando el puntero de ratn pasa sobre l, etc. El evento por defecto de un control es el que aparece cuando, en modo diseo, se hace doble clic sobre l, obviamente este se puede cambiar, por el que ms nos convenga.

Centro de Formacin solucion.es

pg. 77

2. Teclear el cdigo para llevar a cabo las acciones. Recuerde que lo que se desea hacer es copiar hacia hoja2 todos los nombres que coincidan con el que est en el cuadro de texto. El cdigo ser el que sigue, observe los comentarios.
Option Explicit ' Numero de columnas(campos) de las que consta cada registro fila Const Num_Columnas = 7 Private Sub Copiar_Datos_Click() Dim r1 As Range, r2 As Range Dim encontrado As Boolean ' Si el cuadro de texto est vaco, no se busca nada If Len(Datos_Buscar.Value) = 0 Then MsgBox ("No hay datos que buscar") Else ' Borrar los datos actuales Call borrar_datos ' Activar Casilla A16 de Hoja2 y referenciarla con r2, Es la casilla donde irn 'los datos en caso que se encuentren Worksheets(2).Range("A16").Activate Set r2 = ActiveCell ' Activar casilla A2 de Hoja1 y referenciarla con r1 Worksheets(1).Activate Worksheets(1).Range("A2").Activate ' Recorrer todo el rango de datos de Hoja1 encontrado = False Do While Not IsEmpty(ActiveCell) ' Si la casilla activa = Datos_Buscados If ActiveCell.Value = Datos_Buscar.Text Then encontrado = True ' Referenciar con r1 la celda donde estn os datos Set r1 = ActiveCell ' Copiar los datos Call Copiar_Datos_Hojas(r1, r2) ' Referenciar con r2 la casilla donde se copiaran los prximos datos Set r2 = r2.Offset(1, 0) End If ActiveCell.Offset(1, 0).Activate Loop Worksheets(2).Activate If encontrado Then MsgBox ("Datos Copiados") Else MsgBox ("Ninguna coincidencia") End If End If End Sub

' Procedimiento para borrar los datos de Hoja2 se llama antes de proceder a la nueva ' copia Private Sub borrar_datos() Dim i As Integer Worksheets(2).Range("A16").Activate Do While Not IsEmpty(ActiveCell) For i = 0 To Num_Columnas - 1 ActiveCell.Offset(0, i).Value = "" Next i ActiveCell.Offset(1, 0).Activate Loop End Sub

Centro de Formacin solucion.es

pg. 78

' ' ' '

Procedimiento para copiar los datos de Hoja1 a Hoja3 Parmetros. r1 = Celda Origen r2 = Celda Destino

Private Sub Copiar_Datos_Hojas(r1 As Range, r2 As Range) Dim i As Integer Dim Datos As Variant ' Recorrer las columnas del registro y copiar celda a celda For i = 0 To Num_Columnas - 1 Datos = r1.Offset(0, i).Value r2.Offset(0, i).Value = Datos Next i End Sub

Cuadros Combinados (ComboBox). Con lo hecho hasta ahora podemos extraer de la tabla los registros cuyo nombre coincida con el tecleado en el cuadro de texto. A continuacin haremos que se pueda escoger el campo, es decir, podremos extraer coincidencias del Nombre, los Apellidos, la Ciudad, etc. Para ello incluiremos un cuadro combinado que permita escoger en que campo o columna tiene que buscarse la coincidencia. La lista, por supuesto, mostrar los nombres de las columnas. Incluya un cuadro combinado en Hoja2 y pngale por nombre (propiedad Name). Lista_Campos Propiedad ListFillRange. Con esta propiedad deberemos definir los elementos que debe mostrar la lista, debe especificarse el rango que contiene los elementos a mostrar, el rango debe ser una columna (o dos, o tres, etc.). En nuestro caso el rango ser J1:J7 de Hoja2 (Observe que en este rango estarn especificados los nombres de las columnas). Propiedad LinKedCell. En esta propiedad debe especificar en que celda debe copiarse el elemento seleccionado de la lista. En esta lista no utilizaremos esta propiedad. Cuidado con esta propiedad, tenga en cuenta que los elementos de la lista son tratados como datos de tipo String aunque contenga nmeros o fechas, por lo que en estos casos, a veces ser necesario aplicar funciones de conversin de datos antes que el dato se copie en la hoja. Por ejemplo, si alguna vez construye una lista con nmeros ver que el dato seleccionado se alinea a la derecha, si son fechas, no se muestra con el formato correspondiente. Propiedad ListIndex. Mediante esta propiedad podremos saber que elemento de la lista es el seleccionado por su nmero de orden. Es decir, si est seleccionado el primero, ListIndex valdr 0, si est seleccionado el segundo valdr 1, etc. Si no hay ningn elemento seleccionado valdr -1. Tenga en cuenta que esta propiedad slo est disponible en tiempo de ejecucin, es decir la podremos leer mientras est funcionando el programa, no se puede establecer en modo diseo, observe que no aparece en la ventana propiedades del cuadro combinado. Bien, ya sabemos como funcionan las propiedades que utilizaremos para hacer que se extraigan de la tabla los elementos que coincidan con el valor del cuadro de texto y cuya columna o campo sea el seleccionado de la lista, veamos como quedar la macro. En primer lugar cree un procedimiento llamado Proceder donde deber copiar todo el cdigo que ahora est en Copiar_Datos. Debemos hacer esto porque antes de proceder se deben hacer ciertas comprobaciones que ya iremos viendo conforme avanzamos, por el momento la comprobacin a hacer es la de ver sobre que campo o columna se deben buscar las coincidencias con los datos tecleados en el cuadro de texto. La funcin Copiar_Datos quedar de la forma siguiente.

Centro de Formacin solucion.es

pg. 79

Private Sub Copiar_Datos_Click() Dim i As Integer ' Recoger el elemento seleccionado de la lista i = Lista_Campos.ListIndex ' Si i < 0 es que no hay ningn elemento seleccionado. If i < 0 Then MsgBox ("Debe Seleccionar un campo de la lista") Else ' Llamar a proceder para iniciar la copia. Call Proceder(i) End If End Sub

La cabecera de la funcin proceder quedar de la forma siguiente.


' Procedimiento Proceder ' Inicia la copia de los datos coincidentes ' Parmetros: ' Columna = Elementos seleccionado de la lista que coincidir con la columna sobre la que se ' debe buscar Private Sub Proceder(Columna As Integer) .....

Ahora, dentro del procedimiento Proceder cambie la lnea


If ActiveCell.Value = Datos_Buscar.Text Then

Por
If ActiveCell.Offset(0, Columna).Value = Datos_Buscar.Text Then

Explicacin del proceso. Cuando se selecciona un elemento de la lista, su propiedad ListIndex es igual al orden que ocupa dicho elemento en la lista, supongamos que escogemos Ciudad, ListIndex valdr 2. Este valor se pasa a Proceder y es recogido por el parmetro Columna. Ahora observe la lnea
If ActiveCell.Offset(0, Columna).Value = Datos_Buscar.Text Then

Es decir la coincidencia con el valor del cuadro de texto Datos_Buscar se busca respecto a la casilla que est a la derecha ( offset ) de la activa, tantas columnas como las expresadas por el valor de la variable Columna . Observe que en este caso la casilla activa siempre corresponde a una de la columna A, si la variable Columna vale 2 la coincidencia se buscar respecto al valor de la columna C (2 ms hacia la derecha) y que coincide con la columna correspondiente a la Ciudad. Segunda Lista. Ahora crearemos una lista donde sea posible escoger la relacin de comparacin. Hasta ahora la extraccin se realizaba con aquellos elementos iguales al valor entrado en el cuadro de texto Datos_Buscar, esta segunda lista permitir escoger si los elementos a extraer deben ser Iguales, Menores, Mayores, Menores Iguales o Mayores Iguales que el valor de Datos_Buscar. Para ello debe construir una segunda lista con las propiedades siguientes. Name = Lista_Comparacin. ListFillRange = L1:L5 Observe que en este rango estn los valores correspondientes a la operacin relacional que se desea realizar (Igual, Menor, etc.) Obviamente deberemos modificar las funciones para realizar las operaciones con respecto al elemento seleccionado en el cuadro de lista Lista_Comparacin. Dejaremos el procedimiento Proceder de la forma siguiente y crearemos una funcin que haga las comparaciones, esta funcin a la que hemos llamado Comparar devuelvae el valor True si el resultado de la comparacin es Cierto y False si es falso.

Centro de Formacin solucion.es

pg. 80

' ' ' '

Procedimiento Proceder Inicia la copia de los datos coincidentes Parmetros: Columna = Elementos seleccionado de la lista que coincidir con la columna sobre la que se debe buscar

Private Sub Proceder(Columna As Integer) Dim r1 As Range, r2 As Range Dim encontrado As Boolean Dim Valor_Comparacion As Boolean ' Si el cuadro de texto est vaco, no se busca nada If Len(Datos_Buscar.Value) = 0 Then MsgBox ("No hay datos que buscar") Else ' Borrar los datos actuales Call borrar_datos ' Activar Casilla A16 de Hoja2 y referenciarla con r2' casilla donde se copiarn ' los datos en caso que se encuentren Worksheets(2).Range("A16").Activate Set r2 = ActiveCell ' Activar casilla B4 de Hoja1 y referenciarla con r1 Worksheets(1).Activate Worksheets(1).Range("B4").Activate encontrado = False ' Recorrer todo el rango de datos de Hoja1 Do While Not IsEmpty(ActiveCell) Valor_Comparacion = Comparar(ActiveCell.Offset(0, Columna).Value, _ Datos_Buscar.Value, Lista_Comparacion.ListIndex) If Valor_Comparacion = True Then encontrado = True ' Referenciar con r1 la celda donde estn os datos Set r1 = ActiveCell ' Copiar los datos Call Copiar_Datos_Hojas(r1, r2) ' Referenciar con r2 la casilla donde se copiaran los prximos datos Set r2 = r2.Offset(1, 0) End If ActiveCell.Offset(1, 0).Activate Loop Worksheets(2).Activate If encontrado Then MsgBox ("Datos Copiados Correctamente") Else MsgBox ("Ninguna coincidencia, no se copiaron datos") End If End If End Sub ' ' ' ' ' ' Funcin que compara dos valores con un operador relacional =, >, <, etc. La funcin devuelve True o False en funcin de la comparacin. Parmetros. Valor1 y Valor2 = Valores que se comparan Signo = variable que sirve para escoger el operador relacional en funcin de su valor, ver estructura Select Case

Private Function Comparar(Valor1 As Variant, Valor2 As Variant, Operador As Integer) As Boolean Dim q As Boolean Select Case Operador Case 0: q = Valor1 = Valor2 Case 1:

Centro de Formacin solucion.es

pg. 81

q = Case 2: q = Case 3: q = Case 4: q = Case 5: q = End Select

Valor1 > Valor2 Valor1 < Valor2 Valor1 >= Valor2 Valor1 <= Valor2 Valor1 <> Valor2

Comparar = q End Function

Observe la lnea que llama a la funcin Comparar,


Valor_Comparacion = Comparar(ActiveCell.Offset(0, Columna).Value, _ Datos_Buscar.Value, Lista_Comparacion.ListIndex)

ActiveCell.Offset(0,Columna) sern los valores que se compararn con el valor del cuadro de texto. Datos_Buscar.value es el valor del cuadro de texto. Lista_Comparacin.ListIndex devuelve el ndice del elemento seleccionado de la lista, observe como se utiliza este valor en la estructura Select Case de Comparar para determinar que operador utilizar. Pero todo esto no funcionar del todo bien. Pruebe lo siguiente. En el cuadro de texto escriba Madrid ( o simplemente M). Seleccione de la lista de Campos Ciudad. Seleccione de la lista de operadores Mayor. Pulse sobre el botn y observe que se copian todos los registros cuyo campo Ciudad sea superior a Madrid (o a la M). Hasta aqu todo correcto. Ahora pruebe lo siguiente. En el cuadro de texto escriba 100000, seleccione de la lista de Campos Cantidad, seleccione de la lista de operadores Mayor. Pulse sobre el botn y observe que no se copia nada a pesar que en cantidad hay registros con el valor superior a 100000. Recuerde que los valores de un cuadro de texto son siempre datos tipo String, entonces en este caso estarn comparndose valores String (los del cuadro de texto) con valores numricos, (los recogidos de la columna Cantidad). Tenga en cuenta siempre esta circunstancia cuando trabaje con elementos de formulario. Vea la seccin siguiente donde se solucionar este problema y de paso se ver como construir una lista con ms de una columna. Listas con ms de una columna. Para solucionar el problema del apartado anterior utilizaremos una segunda columna cuyos elementos indicarn el tipo de datos del campo. Observe el rango K1:K7 de Hoja2, las letras significan lo siguiente T campo tipo texto o string, N campo Numrico, F campo fecha. Para incluir esta segunda columna en la lista deber cambiar las propiedades siguientes. ListFillRange = J1:K7 ColumnCount = 2 (Indicamos el nmero de columnas de la lista. Adems especificaremos el ancho de cada columna mediante la propiedad, ColumnWidths, 4pt;0pt Debe separar el ancho de cada columna mediante un punto y coma.Observe que la segunda columna no se mostrar debido a que hemos especificado el ancho a 0. ColumnBound, 1 significa que el dato que recoger la propiedad Value corresponde al elemento seleccionado de la primera columna. Si desea recoger datos le la segunda columna deber utilizar la propiedad Column(Numero de Columna, Indice del elemento seleccionado) Las columnas empiezan a numerarse a partir de la 0.

Centro de Formacin solucion.es

pg. 82

La funcin Comparar y su correspondiente llamada quedarn de la forma siguiente. Observe que se han incluido variables que recogen los valores de Lista_Comparacin y Lista_Campos, simplemente lo hemos hecho para que quede ms claro. La llamada:
Do While Not IsEmpty(ActiveCell) ' Recoger el Signo de comparacin Signo = Lista_Comparacion.ListIndex ' Recoger el tipo de datos Tipo_Datos = Lista_Campos.Column(1, Columna) Valor_Comparacion = Comparar(ActiveCell.Offset(0, Columna).Value, _ Datos_Buscar.Value, Signo, Tipo_Datos) ..

La funcin Comparar:
Private Function Comparar(Valor1 As Variant, Valor2 As Variant, Operador As Integer, Tipo As String) As Boolean Dim q As Boolean ' Conversin del tipo de datos de las variables Select Case Tipo Case "N": ' Convertir a nmero Valor2 = Val(Valor2) Case "F": ' Convertir a Fecha Valor2 = CDate(Valor2) End Select Select Case Operador Case 0: q = Valor1 = Valor2 Case 1: q = Valor1 > Valor2 Case 2: q = Valor1 < Valor2 Case 3: q = Valor1 >= Valor2 Case 4: q = Valor1 <= Valor2 Case 5: q = Valor1 <> Valor2 End Select Comparar = q End Function

Control Numrico. Inserte un control de nmero y pngale por nombre (propiedad Name) Numero. Establezca su propiedad Orientation a fmOrientatiomVertical para que se alinee verticalmente. Este control se utiliza normalmente para aumentar y disminuir valores numricos de un cuadro de texto, aunque por supuesto puede utilizarse para otras funciones. Utilizaremos un control de este tipo para aumentar los valores del Cuadro de Texto Datos_Buscar pero slo si el campo seleccionado de Lista_Campos es de tipo numrico. Para ello activaremos este control nicamente cuando el campo seleccionado sea de este tipo. Para activar o desactivar un control se utiliza la propiedad Enabled, si est a true el control estar activado y sino estar desactivado. Observe que la accin de activar o desactivar el control de nmero deberemos hacerlo cuando se seleccione un elemento de Lista_Campos. Es decir el cdigo deberemos insertarlo en el evento Change (cambio) de Lista_Campos. Haga doble clic sobre el elemento Lista_Campos para desplegar su procedimiento de evento. El cdigo para controlar la activacin del control es el que sigue.

Centro de Formacin solucion.es

pg. 83

Private Sub Lista_Campos_Change() Dim i As Integer Dim Tipo_Datos As String i = Lista_Campos.ListIndex If i >= 0 Then Tipo_Datos = Lista_Campos.Column(1, i) If Tipo_Datos = "N" Then Numero.Enabled = True Else Numero.Enabled = False End If End If End Sub

Establecer los valores del control de nmero. Para establecer los valores que puede devolver un control de nmero se deben modificar las propiedades siguientes. Max, establece el valor mximo que puede tener el control. Min, establece el valor mnimo que puede tener el control. Smallchange, establece el incremento o decremento para la propiedad value cada vez que se pulse sobre alguno de los dos botones. Estos valores se pueden establecer en tiempo de diseo, pero lo que haremos a continuacin ser establecerlos en tiempo de ejecucin dependiendo del campo que se seleccione en Lista_Campos. Estableceremos los valores siguientes. Para campo Edad. Max = 99 Min = 18 SmallChange = 1 Para campo cantidad. Max = 500.000 Min = 10.000 SmallChange = 1.000 Deberemos modificar el cdigo del procedimiento de evento Lista_Campos_Change de la forma siguiente.
Private Sub Lista_Campos_Change() Dim i As Integer Dim Tipo_Datos As String i = Lista_Campos.ListIndex If i >= 0 Then Tipo_Datos = Lista_Campos.Column(1, i) If Tipo_Datos = "N" Then Numero.Enabled = True If Lista_Campos.Value = "Edad" Then Numero.Min = 18 Numero.Max = 99 Numero.SmallChange = 1 Datos_Buscar.Value = 0 Numero.Value=0 End If If Lista_Campos.Value = "Cantidad" Then Numero.Min = 10000 Numero.Max = 500000 Numero.SmallChange = 1000 Datos_Buscar.Value= 0 Numero.Value=0 End If Else

Centro de Formacin solucion.es

pg. 84

Numero.Enabled = False EndIf End If End Sub

Y para terminar ya slo debemos codificar el evento Change del control de nmero para que el Cuadro de texto vaya incrementando o decrementando su valor cada vez que se haga clic sobre el control.
Private Sub Numero_Change() Datos_Buscar.Value = Numero.Value End Sub

Pero adems debemos hacer que cuando se cambie el valor del cuadro de texto tambin se cambie el del control de nmero de forma que cuando se pulse sobre l, incremente o decremente a partir del valor que hay en el cuadro de texto. Si no se hace as, el incremento o decremento se har en funcin del valor que tenga el control de nmero no el que est en el cuadro de texto. Modificaremos el evento Change del cuadro de texto. Observe que se controla que slo se ejecute la accin si el control de nmero est activado, adems se debe controlar tambin el valor mximo y mnimo que puede contener el cuadro de texto, si no se hiciera as se generara un error al poner un valor mayor o menor que los definidos en las propiedades Max y Min del control de nmero.
Private Sub Datos_Buscar_Change() ' Si el numero de control est activado If Numero.Enabled Then ' No permite coger valores superiores a la propiedad Max If Val(Datos_Buscar.Value) > Numero.Max Then MsgBox ("Valor demasiado grande") Datos_Buscar.Value = Numero.Max Else ' No permite coger valores inferiores a la propiedad Min If Val(Datos_Buscar.Value) < Numero.Min Then MsgBox ("Valor demasiado pequeo") Datos_Buscar.Value = Numero.Min Else Numero.Value = Val(Datos_Buscar.Value) End If End If End If End Sub

Antes de proceder con el siguiente control djenos remarcar que la programacin de controles implica que muchas veces unos dependan de otros por lo que debe ser extremadamente cuidadoso en la elaboracin del cdigo de los eventos. Observe las ltimas operaciones que hemos realizado debido a la interdependencia de dos controles. Casillas de verificacin (CheckBox) . Estos controles se suelen utilizar para activar o desactivar la ejecucin de determinadas acciones. Casi siempre implican una estructura condicional a la hora de hacer alguna cosa.
Si las casilla est activada Entonces Acciones .... Fin Si

A continuacin utilizaremos una casilla de verificacin que si est activada provocar que los datos tipo texto se conviertan a mayscula antes de copiarse, se utilizar la funcin Ucase. Simplemente se deber comprobar que la casilla est activada y si lo est proceder a la conversin (slo si el dato es tipo texto). Inserte un control casilla de verificacin. Establezca las siguientes propiedades. Name, Mayusculas. Captin, Maysculas. Para comprobar si la casilla est activada o no simplemente debe mirarse su propiedad Value. Si vale trae es que est activada, sino valdr False.

Centro de Formacin solucion.es

pg. 85

Vea como quedar el procedimiento Copiar_Datos_Hojas, observe que adems de comprobar que la casilla est activada se utiliza la funcin TypeName para comprobar si los datos que se van a copiar son del tipo String, si no lo fueran, la funcin Ucase provocara un error. TypeName(Expresin) devuelve una cadena que indica el tipo de datos de la expresin.
Private Sub Copiar_Datos_Hojas(r1 As Range, r2 As Range) Dim i As Integer Dim Datos As Variant ' recorrer las columnas del registro y copiar celda a celda For i = 0 To Num_Columnas - 1 ' Si la casilla Maysculas est activada y el tipo de datos es String If Mayusculas.Value = True And TypeName(r1.Offset(0, i).Value) = "String" Then Datos = UCase(r1.Offset(0, i).Value) Else Datos = r1.Offset(0, i).Value End If r2.Offset(0, i).Value = Datos Next i End Sub

Botones de Opcin (Option Button). Los botones de opcin se utilizan para elegir una nica opcin entre una serie de ellas, es decir, de un grupo de opciones slo permitirn que se escoja una. De la misma forma que las casillas de verificacin, casi siempre implican una estructura condicional para comprobar cual de ellas est activada. El botn activado tendr su propiedad Value igual a true. Como ejemplo de su utilizacin crearemos dos botones de opcin que sirvan para que a la hora de copiar datos hacia la hoja, se copie slo los valores de Nombre y Apellidos o todos como hasta ahora. Incluya dos botones de opcin y establezca las siguientes propiedades. Botn1. Name, Todo. Caption, Todo. Botn2. Name, Solo_Nombre. Caption, Nombre y Apellidos. Si est activado el primer botn debern copiarse todos los datos mientras que si est activado el segundo solo se copiarn el Nombre y los Apellidos. El procedimiento Copiar_Datos_Hojas quedar de la forma siguiente.
Private Sub Copiar_Datos_Hojas(r1 As Range, r2 As Range) Dim i As Integer Dim Datos As Variant Dim Final As Integer ' Si Botn Todo Activado, se copian todas las columnas If Todo.Value = True Then Final = Num_Columnas - 1 Else ' Slo se copian las dos primera columnas Final = 1 End If ' recorrer las columnas del registro y copiar celda a celda For i = 0 To Final ' Si la casilla Maysculas est activada y el tipo de datos es String If Mayusculas.Value = True And TypeName(r1.Offset(0, i).Value) = "String" Then Datos = UCase(r1.Offset(0, i).Value) Else Datos = r1.Offset(0, i).Value End If r2.Offset(0, i).Value = Datos Next i End Sub

Centro de Formacin solucion.es

pg. 86

Y aqu terminamos el estudio de cmo se pueden utilizar los controles de formulario dentro de una hoja de clculo. Recordarle para terminar que debe ser extremadamente cuidadoso con el cdigo que utilice en los procedimientos de evento sobre todo si los controles se interrelacionan entre ellos. El siguiente Listado incluye todo el cdigo que se ha utilizado.
Option Explicit ' Numero de columnas(campos) de las que consta cada registro Const Num_Columnas = 7 Private Sub Copiar_Datos_Click() Dim i As Integer Dim x As Integer ' Recoger el elemento seleccionado de la lista i = Lista_Campos.ListIndex ' Si i < 0 no est seleccionado ningn elemento If i < 0 Then MsgBox ("Debe Seleccionar un campo de la lista") Else x = Lista_Comparacion.ListIndex If x < 0 Then MsgBox ("Debe Seleccionar uno operador de Comparacin") Else ' llamar a proceder Call Proceder(i) End If End If End Sub ' Procedimiento Proceder ' Inicia la copia de los datos coincidentes ' Parmetros: ' Columna = Elementos seleccionado de la lista que coincidir ' con la columna sobre la que se debe buscar Private Sub Proceder(Columna As Integer) Dim Dim Dim Dim Dim r1 As Range, r2 As Range encontrado As Boolean Valor_Comparacion As Boolean Signo As Integer Tipo_Datos As String

' Si el cuadro de texto est vaco, no se busca nada If Len(Datos_Buscar.Value) = 0 Then MsgBox ("No hay nada en el cuadro Datos a Buscar") Else ' Borrar los datos actuales Call borrar_datos ' Activar Casilla A16 de Hoja2 y referenciarla con r2 ' Es la casilla donde se copiarn los datos en caso que se encuentren Worksheets(2).Range("A16").Activate Set r2 = ActiveCell ' Activar casilla B4 de Hoja1 y referenciarla con r1 Worksheets(1).Activate Worksheets(1).Range("B4").Activate ' Recorrer todo el rango de datos de Hoja1 encontrado = False Do While Not IsEmpty(ActiveCell) ' Recoger el Signo de comparacin Signo = Lista_Comparacion.ListIndex ' recoger el tipo de datos Tipo_Datos = Lista_Campos.Column(1, Columna) Valor_Comparacion = Comparar(ActiveCell.Offset(0, Columna).Value, _ Datos_Buscar.Value, Signo, Tipo_Datos) If Valor_Comparacion = True Then encontrado = True ' Referenciar con r1 la celda donde estn os datos Set r1 = ActiveCell ' Copiar los datos Call Copiar_Datos_Hojas(r1, r2) ' Referenciar con r2 la casilla donde se copiaran los prximos datos Set r2 = r2.Offset(1, 0) End If

Centro de Formacin solucion.es

pg. 87

ActiveCell.Offset(1, 0).Activate Loop Worksheets(2).Activate If encontrado Then MsgBox ("Datos Copiados") Else MsgBox ("Ninguna coincidencia") End If End If End Sub ' Funcin que compara dos valores con un operador relacional =, >, <, etc. ' La funcin devuelve True o False en funcin de la comparacin. ' Parmetros. ' Valor1 y Valor2 = Valores que se comparan ' Signo = variable que sirve para escoger el operador relacional ' en funcin de su valor, ver estructura Select Case Private Function Comparar(Valor1 As Variant, Valor2 As Variant, Operador As Integer, Tipo As String) As Boolean Dim q As Boolean Select Case Tipo Case "N": ' Convertir a nmero Valor2 = Val(Valor2) Case "F": ' Convertir a Fecha Valor2 = CDate(Valor2) End Select Select Case Operador Case 0: q = Valor1 = Valor2 Case 1: q = Valor1 > Valor2 Case 2: q = Valor1 < Valor2 Case 3: q = Valor1 >= Valor2 Case 4: q = Valor1 <= Valor2 Case 5: q = Valor1 <> Valor2 End Select Comparar = q End Function ' Procedimiento para borrar los datos de Hoja2 se llama antes de proceder a la nueva ' copia Private Sub borrar_datos() Dim i As Integer Worksheets(2).Range("A16").Activate Do While Not IsEmpty(ActiveCell) For i = 0 To Num_Columnas - 1 ActiveCell.Offset(0, i).Value = "" Next i ActiveCell.Offset(1, 0).Activate Loop End Sub ' Procedimiento para copiar los datos de Hoja1 a Hoja3 ' Parmetros. ' r1 = Celda Origen ' r2 = Celda Destino Private Sub Copiar_Datos_Hojas(r1 As Range, r2 As Range) Dim i As Integer Dim Datos As Variant Dim Final As Integer ' Si Botn Todo Activado, se copian todas las columnas

Centro de Formacin solucion.es

pg. 88

If Todo.Value = True Then Final = Num_Columnas - 1 Else ' Slo se copian las dos primera columnas Final = 1 End If ' recorrer las columnas del registro y copiar celda a celda For i = 0 To Final ' Si la casilla Maysculas est activada y el tipo de datos es String If Mayusculas.Value = True And TypeName(r1.Offset(0, i).Value) = "String" Then Datos = UCase(r1.Offset(0, i).Value) Else Datos = r1.Offset(0, i).Value End If r2.Offset(0, i).Value = Datos Next i End Sub

Private Sub Datos_Buscar_Change() ' Si el numero de control est activado If Numero.Enabled Then ' No permite coger valores superiores a la propiedad Max If Val(Datos_Buscar.Value) > Numero.Max Then MsgBox ("Valor demasiado grande") Datos_Buscar.Value = Numero.Max Else ' No permite coger valores inferiores a la propiedad Min If Val(Datos_Buscar.Value) < Numero.Min Then MsgBox ("Valor demasiado pequeo") Datos_Buscar.Value = Numero.Min Else Numero.Value = Val(Datos_Buscar.Value) End If End If End If End Sub

Private Sub Lista_Campos_Change() Dim i As Integer Dim Tipo_Datos As String i = Lista_Campos.ListIndex If i >= 0 Then Tipo_Datos = Lista_Campos.Column(1, i) If Tipo_Datos = "N" Then Numero.Enabled = True If Lista_Campos.Value = "Edad" Then Numero.Min = 18 Numero.Max = 99 Numero.SmallChange = 1 Datos_Buscar.Value = 0 Numero.Value=0 End If If Lista_Campos.Value = "Cantidad" Then Numero.Min = 10000 Numero.Max = 500000 Numero.SmallChange = 1000 Datos_Buscar .Value= 0 Numero.Value=0 End If Else Numero.Enabled = False End If End If End Sub Private Sub Numero_Change() Datos_Buscar.Value = Numero.Value End Sub

Centro de Formacin solucion.es

pg. 89

Formularios.
Creando formularios y programndolos Ahora te veremos que es un formulario y como programarlo, bueno un formulario podemos definirlo como una ventana vaca en un principio, en la que vamos aadiendo los controles que necesitemos para que desempee una o varias funciones y estos controles responden a eventos que nosotros determinamos y programamos. Todo esto se encuentra dentro de Visual Basic para Aplicaciones. A continuacin como crear un formulario: 1. 2. Presione La Teclas Alt + F11, para entrar al editor de Visual Basic. Active las siguientes opciones si no lo estn ya: 1. Clic en el Men Ver y elija la opcin Explorador de Proyectos 2. Clic en el Men ver y elija la opcin Ventana Propiedades Del Men Insertar elija la Opcin UserForm. Esto inserta el Formulario que programaremos con controles. En el Explorador de Proyecto se observar que se inserto el UserForm.

1.

Tambin cuando haga clic en el Formulario USERFORM1 se debe de activar el Cuadro de Herramientas, si no se activa haga clic en el Men Ver y elija la opcin Cuadro de Herramientas. 1. Elija del Cuadro de Herramientas el Control Etiqueta el que tiene la A y Arrastre dibujando en el Formulario USERFORM1 la etiqueta. Quedara el nombre Label1, despus de un clic en la etiqueta dibujada y podr modificar el texto y pondremos ah Nombre. Si por error da doble clic en la etiqueta y lo manda a la pantalla de programacin de la etiqueta, solo de doble clic en UserForm1 que se encuentra en el Explorador de Proyecto. Elija del Cuadro de Herramientas el control Cuadro de Texto el que tiene ab y arrastre dibujando en el formulario USERFORM1 el cuadro de texto a un lado de la etiqueta que dice Nombre. El cuadro de texto debe de estar vaco y su nombre ser Textbox1, el nombre solo aparecer en el control. Haga los dos pasos anteriores igualmente poniendo Direccin en la Label2 y Telfono en la Label3 y tambin dibjeles su Textbox. Esto quedara parecido a la imagen.

2.

3.

Centro de Formacin solucion.es

pg. 90

Las propiedades de los controles En la barra de propiedades prodemos ver la caractersticas del control seleccionado en un momento determinado, estas propiedades se puede modificar en tiempo de diseo, auque la mayora tambien son accesibles en tiempo de ejecucin. Es frecuente que haya controles que tengan propiedades solo modificables en tiempo de ejecucin, por lo que estas no aparecern el el cuadro de propiedades.

Invocar a un formulario Para hacer est utilizaremos el mtodo Show del objeto formulario por ejemplo UserForm1.Show, esto se puede hacer desde cualquier procedimiento o funcin del cdigo VBA. Cerrar un formulario Para cerrar el formulario se utiliza la palabra reservada Unload seguida del nombre del formulario, por ejemplo para el formulario anterior sera unload Userform1. Ocultar temporalmente un formulario Se ultiliza el mtodo hide, UserForm1.hide. Es parecido a cerrarle, de hecho el efecto de cara al usuario es el mismo que cerrandolo pero al volverlo a mostrar con show el formulario mantiene los datos anteriores y sus variables. Sin embarco con unloadme al volverlo a Mostar el formulario debe reiniciarse por completo.

Centro de Formacin solucion.es

pg. 91

Controles ActiveX stos controles tambin son llamados comnmente como "botones", aunque tcnicamente se denominan Controles ActiveX. Los Controles ActiveX son objetos grficos que se colocan en un formulario (userforms) o en una determinada posicin de la hoja de trabajo, como ya hemos podido comprobar, con el objetivo de mostrar, seleccionar o introducir (capturar) datos, para la realizacin de una accin determinada (ej. ejecucin de una macro) o para facilitar la lectura de un formulario. Estos objetos pueden consistir por ejemplo en cuadros de texto, cuadros de lista (combobox), botones de opciones, casillas de verificacin, botones de comandos, barras de desplazamiento u otros elementos. Estos controles tienen propiedades propias y comunes, en esta seccin veremos aquellas ms importantes, as como tambin algunos ejemplos prcticos sobre el uso de estos controles. Al igual que en el caso de las macros, los controles tambin pueden ser programados a travs de VBA, pero no profundizaremos demasiado en este punto. Tipos o Clases de Controles En este apartado mostraremos los principales tipos de controles que existen, indicando en cada caso sus principales caractersticas y actividades para las cuales pueden ser utilizados. Le recomendamos que inserte la barra de controles que posee Excel, ya que esto le permitir trabajar de forma mucho ms expedita. Para esto vaya al men Ver/Barra de Herramientas/Cuadro de Controles. Con el objetivo de que esta barra no interfiera en su rea de trabajo, pude incorporarla en el contexto de las barras de herramientas tradicionales. Con el nico objetivo de darle un mayor grado de interactividad a este apartado, hemos incluido algunos controles de ejemplo (reales no imgenes). Como comprender, stos "controles de ejemplo" han sido generados con un software dedicado a la construccin de pginas web y que es distinto a Excel, razn por la cual es posible que su visualizacin pueda diferir un poco del aspecto que presentan normalmente en Excel, pero en general tendrn los mismos comportamientos y funciones.

Cuadro de Texto Un Cuadro de Texto nos permite capturar informacin de la persona que lo esta utilizando, la cual puede ser numrica, alfabtica o alfanumrica. Este tipo de control tambin tiene la opcin de ser configurado como campo para el ingreso de "claves", por lo que automticamente ir reemplazando lo que vayamos ingresando por asteriscos (*).

Centro de Formacin solucion.es

pg. 92

Botn de Comando Este tipo de control es uno de los ms conocidos. Entre otras cosas, este control nos permite por ejemplo la ejecucin de una macro, o marcar el inicio de la realizacin de una determinada actividad previamente asignada o programada.

Casilla de Verificacin Una casilla de verificacin es utilizada normalmente para capturar informacin previamente estructurada. Normalmente se presentan en grupos y es posible seleccionar ms de una opcin. Tal como se puede apreciar en nuestro ejemplo, el usuario podr elegir uno o ms de los distintos deportes propuestos.

Botn de Opcin Un botn de opcin en general presenta las mismas caractersticas que un grupo de casillas de verificacin, slo que en este caso no es posible seleccionar ms de una opcin. En nuestro ejemplo, el usuario slo podr elegir uno de los distintos deportes propuestos. Cuadro Combinado Futbol Voleibol Tenis Natacin El cuadro combinado o ComboBox en general cumple las mismas funciones que los dos controles anteriormente explicados. Su utilizacin es recomendable cuando la lista de opciones es bastante extensa. Inclusive puede ser configurado para que mostrar un cierto nmero de opciones solamente, debiendo desplazarse el usuario con la barra de desplazamiento que se generar automticamente para buscar las otras opciones no visualizadas. Cuadro de Lista

Un cuadro de lista contiene una lista de los elementos que pueden ser seleccionados. En trminos generales es prcticamente lo mismo que un cuadro combinado, slo que no posee el men desplegable, sino que es necesario desplazarse a travs de l con el cursor. Botn o Control de Nmero

Este control puede ser usado para aumentar o disminuir el valor de un determinado parmetro o celda vinculada. Cuenta con dos flechas, una hacia arriba y otra hacia abajo, o una hacia la derecha y otra hacia la izquierda. Al presionar alguna de ellas aumentar o disminuir el valor segn corresponda. En el siguiente apartado, cuando se analicen las propiedades, veremos como puede configurarse el valor en que ir cambiando el valor tras cada clic.

Centro de Formacin solucion.es

pg. 93

Botn de Alternar

Este botn puede ser utilizado para que el usuario seleccione o no una determinada caracterstica, ya que este control tiene la ventaja de que una vez seleccionado permanece seleccionado, devolviendo el valor de Verdadero o Falso segn corresponda. Este botn adems puede ser vinculado a una determinada celda, en la cual devolver el valor lgico anteriormente mencionado (verdadero o falso). En el siguiente apartado analizaremos las principales propiedades que presentan estos controles, y posteriormente, en los siguientes apartados daremos algunos ejemplos de su uso. Respecto a esto ltimo, tenga en cuenta que en esta seccin solo entregaremos ejemplos bsicos del uso de los controles, esto puesto que en la seccin donde se analizarn lo userforms sern utilizados ejemplos ms globales y completos. Principales Propiedades En este apartado analizaremos las principales propiedades que son comunes a la mayora de los controles, as como tambin aquellas que puede que sean exclusivas de uno u otro, pero que debido a su relevancia creemos que es necesario analizar. Tal como sealamos anteriormente, es muy usual que los controles sean configurados mayoritariamente a travs de VBA. Sin embargo, el objetivo de este curso no es profundizar demasiado en este lenguaje (VBA), sino por el contrario entregar una gua prctica, til y muy fcil de implementar para un usuario no familiarizado con la programacin. Por esta razn, en general nos referiremos slo a aquella parte de la propiedad que puede ser configurada eminentemente a travs de Excel y slo cuando sea necesario nos remitiremos al Editor de Visual Basic. Cuadro de Propiedades Una vez que hemos insertado cualquier control, debemos hacer clic con el botn derecho del mouse sobre dicho control, esto para que nos aparezca el cuadro de dilogo de propiedades de dicho control. Este cuadro de dilogo a su vez tiene en el extremo superior un cuadro combinando o combobox, el cual nos permitir configurar las propiedades de algn otro control que tengamos en el libro actual sin necesidad de estar seleccionando ste previamente. Adems, nos entrega dos opciones para la visualizacin de las propiedades. La primera de ellas en forma alfabtica y la segunda por categoras. Esta ltima nos ser ms til la primera vez que estemos configurando un control, puesto que nos ser ms fcil encontrar las distintas propiedades a modificar. En cambio si ya hemos configurado nuestro control, y deseamos cambiar un nico parmetro, quiz nos resulte ms cmodo trabajar con el modo alfabtico.

Centro de Formacin solucion.es

pg. 94

Otro aspecto a tener en cuenta es el denominado Modo Diseo, esto es, la instancia durante la cual pueden ser modificados cuantas veces sea necesario los distintos controles de nuestro libro. El modo diseo se encuentra activado cuando el icono adjunto se encuentra resaltado, para activarlo slo hace falta hacer clic sobre l. Para salir del modo diseo, bastar con volver ha hacer clic en este mismo icono. Cabe aclarar que cuando estamos en el modo diseo los distintos controles no estarn operativos, por lo que ser necesario salir de este modo para poder utilizar estos controles.

Principales Propiedades A continuacin explicaremos las principales propiedades con que usted se podr encontrar a la hora de configurar un control. En general se entregarn los conceptos ms importantes de cada una de ellas. Si usted desea profundizar en el tema, puede hacerlo directamente a travs de la Ayuda de Excel sin mayores inconvenientes, eso si, le recomendamos acceder a la ayuda que trae el Editor de Visual Basic, por ser esta ms especfica.

LinkedCell Esta es quizs la propiedad que ms utilizar, esta propiedad se refiere a la celda que estar vinculada con el control en cuestin. En algunos casos servir para que el control muestre el contenido de dicha celda, aunque en la mayora de los casos ser el control el que condicione el contenido de dicha celda. Esta celda por ejemplo puede ser utilizada con controles como los cuadros de lista (simples o combinados), los cuadros de texto , los botones de control de nmero o los botones de alternar , por nombrar slo algunos. Para configurar el control, slo ser necesario introducir el valor o mejor dicho la posicin de la celda que se desea vincular. Recomendamos hacerlo en trminos absolutos, por ej. " B19 ". Esto es, la celda producida por la concurrencia de la columna " B " y la Fila " 19 ".

ListFillRange Esta propiedad se utilizar en el caso de que estuviramos configurando un cuadro de lista simple o uno combinado. Esta propiedad le indicar al control la lista de opciones que mostrar dicho control, para lo

Centro de Formacin solucion.es

pg. 95

cual puede hacer referencia a un rango de celdas (ej. A2:B5 ) o al nombre de una determinada rea previamente guardada (ej. mes ). Como podr apreciar, cuando hemos vinculado un rango de celdas hemos incluido ms de una columna, esto es por que tanto los cuadros de listas simples como los combinados, aunque por lo general muestran slo la primera columna, almacenan la informacin de las restantes columnas. Esto ser de mucha ayuda cuando por ejemplo queramos asignarle un valor distinto a las distintas posibilidades que nos muestre el control.

BoundColumn Siguiendo con el ejemplo anterior, sta propiedad le permitir configurar que columna del rango de celdas vinculado al cuadro de lista (simple o combinado) ser utilizada para buscar el valor que ser almacenado en el control, una vez que se ha elegido entre una de las opciones desplegadas en el control. Obviamente se almacenar el valor correspondiente a la fila que fue seleccionada. Por defecto esta configurado en "1", esto es, almacenar el mismo valor de la opcin seleccionada. Si por ejemplo, adems tenemos vinculado el cuadro de lista a una celda (LinkedCell), en esta celda ser mostrado el valor almacenado por el control.

ListRow Esta propiedad es prcticamente exclusiva de los cuadros de lista (ListBox y ComoBox) y sirve para indicar el nmero de filas u opciones que sern mostradas por el control. Si el nmero de opciones es considerable, ser recomendable utilizar esta propiedad, la cual por defecto toma el valor de "8". En el caso de que el nmero de opciones sea mayor al nmero que sern mostradas, el cuadro de lista generar automticamente una barra de desplazamiento.

Font Esta propiedad sirve para configurar las fuentes de los textos que aparecern en el control, sean estos correspondientes a las opciones desplegadas, al nombre visible del control (en el caso de un botn) o como ser mostrada la informacin introducida en un cuadro de texto. Al hacer clic en esta propiedad se desplegar un cuadro de dialogo que lo guiar en la configuracin, el cual sigue los estndares de Excel o Windows, por lo que no profundizaremos en su contenido.

Value Esta propiedad denota el Valor que tendr el control. Segn sea la interaccin que tenga el control, el valor de ste cambiar. Por ejemplo en el caso de un botn de alternar, la propiedad value toma los valores "VERDADERO" o "FALSO" segn se trate. En la caso de un botn de control de nmero, la propiedad value tomar el valor de las secuencia respectiva.

(Name) Esta propiedad denota le nombre del control, por defecto Excel le asigna un nombre compuesto por el tipo de control mas un correlativo, por ejemplo "CommandButton1". Esto servir posteriormente para identificar dicho control y para configurarlo por ejemplo a travs de macros o a travs de VBA.

Centro de Formacin solucion.es

pg. 96

Caption Esta propiedad podramos decir que especifica el nombre de fantasa o comercial de control, esto es, el nombre con que el usuario de la planilla lo ver. Esta propiedad es normalmente utilizada por los botones de comando. Por defecto el valor de caption ser igual que el de name, aunque esto es perfectamente modificable. Esta propiedad por ejemplo es til cuando le asignamos una macro a un control, ya que con ella podremos darle al control un nombre visible de referencia a la actividad que realizar la macro que ser activar con dicho control.

Min, Max, SmallChange Estas tres propiedades son utilizadas por un control de nmero, respectivamente indican el valor mnimo del control, el mximo y el valor en que ste ir cambiando (incremento o decremento, segn sea el caso) cada vez que se haga clic sobre cualquiera de las flechas de este control. El valor de propiedad SmallChange puede ser cualquier nmero entero, aunque el intervalo de valores recomendado es desde 32767 a +32767. El valor predeterminado es 1. En general estas son las principales propiedades con las cuales podr encontrarse cuando este configurando sus controles. Existen otras que tambin son comunes, las cuales consideramos que no son tan relevantes, como aquellas que dicen relacin con posicin del control, la posibilidad de que sea impreso o no al imprimir una determinada hoja o el formato del mouse al desplazarse sobre el control. Una vez que hemos mostrado la mayora de los tipos de controles existentes y hemos comentando varias de sus propiedades, procederemos a continuacin a desarrollar algunos ejemplos de su utilizacin.

Ejercicios con Formularios Para aprender mejor las posibilidades que ofrece el uso de formularios vamos a desarrollar junto con el docente del curso, los siguientes ejercicios prcticos.

1.

La tpica ventana de calendario para rellenar fechas tanto en la hoja de clculo como en controles de formulario. Una ventana que nos permita seleccionar de una lista las lineas de una hoja de calulo que se usarn para imprimir fichas. Un formulario que permite seleccionar como se procesan las celdas seleccionadas, convertir a maysculas o a minusculas. Un formulario que nos permita recuperar las filas de una lista de personas una a una y debajo podamos ver los detalles de los cursos que han recibido cada uno.

2.

3.

4.

Centro de Formacin solucion.es

pg. 97

ANOTACIONES:

Centro de Formacin solucion.es

pg. 98

You might also like