Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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):
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
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:
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.
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.
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.
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.
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.
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
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.
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.
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
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).
pg. 10
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).
pg. 11
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"
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.
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
Por Ejemplo:
Set R= ActiveSheet.Range("A1:B10")
Set Hoja = ActiveSheet
Set Hoja = WorkSheets(1)
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.
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
End Sub
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
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%
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.
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
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
pg. 18
=
=
=
=
Producto
Precio
Cantidad
Total
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
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.
Observe que en el ejemplo anterior todas las instrucciones if evalan la misma variable. El programa
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
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) /
ActiveSheet.Range("A1").Value
ActiveSheet.Range("A2").Value
ActiveSheet.Range("A3").Value
ActiveSheet.Range("A4").Value
=
=
=
=
Nota1
Nota2
Nota3
Media
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
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
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
pg. 24
End Sub
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)
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.
pg. 26
Los valores que puede devolver la funcin msgbox en funcin del botn que pulse el usuario se muestran
en la tabla siguiente.
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()
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.
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
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.
pg. 29
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.
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
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
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.
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.
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.
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
[ 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.
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
pg. 36
** 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.
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.
pg. 38
[ 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.
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.
pg. 40
Sub Ejemplo_32()
Dim
Dim
Dim
Dim
Nombre As String
Ciudad As String
Edad As Integer
fecha As Date
pg. 41
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
'
'
'
'
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.
pg. 42
Sub Ejemplo_33()
End Sub
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
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
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
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.
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
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
'
'
'
'
'
[ 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
Endif
End Sub
'
'
'
'
'
'
'
pg. 47
[ 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
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
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
'
'
'
'
'
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,
pg. 51
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.
pg. 52
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.
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
pg. 54
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
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.
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:
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
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
A1
R1C1
L1C1
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
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.
pg. 57
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
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
pg. 59
ActiveWorkbook.Close(True)
ActiveWorkbook.Close Savechanges:=False
MsgBox ActiveWorkbook.FullName
pg. 60
Insertar hoja nueva (Copiando datos de informe1 al final de todas las hojas)
Sheets("Informe1").Copy After:=Worksheets(Worksheets.Count)
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
pg. 61
pg. 62
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.
pg. 63
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
pg. 64
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.
pg. 65
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])
pg. 66
[ Ejemplos ]
MyDouble = 437.324
MyString = CStr(MyDouble)
MyValue = Val("2457")
MyValue = Val(" 2 45 7")
MyValue = Val("24 and 57")
'
'
'
'
'
MyDouble
MyString
Devuelve
Devuelve
Devuelve
'
'
'
'
Se define el string.
Devuelve " World".
Devuelve "Hello W".
Devuelve "Hello World".
i = StrComp("casa", "caa")
es un Double.
contiene "437.324".
2457.
2457.
24.
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.
pg. 67
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:
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"
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
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"
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()
= LBound(UnVector)
= UBound(UnVector)
= LBound(UnaMatriz, 1)
= UBound(UnaMatriz, 1)
= LBound(UnaMatriz, 2)
= UBound(UnaMatriz, 2)
= LBound(OtraMatriz, 1)
= UBound(OtraMatriz, 1)
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
pg. 73
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"
pg. 74
pg. 75
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).
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
pg. 78
'
'
'
'
pg. 79
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.
pg. 80
'
'
'
'
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
pg. 81
q =
Case 2:
q =
Case 3:
q =
Case 4:
q =
Case 5:
q =
End Select
Comparar = q
End Function
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.
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.
pg. 83
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.
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
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
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
pg. 88
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.
1.
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.
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.
2.
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.
3.
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.
pg. 90
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.
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 (*).
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.
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.
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
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.
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.
1.
La tpica ventana de calendario para rellenar fechas tanto en la hoja de clculo como en
controles de formulario.
2.
Una ventana que nos permita seleccionar de una lista las lineas de una hoja de calulo
que se usarn para imprimir fichas.
3.
4.
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.
pg. 97
ANOTACIONES:
pg. 98