Análisis de Datos
Análisis de Datos
Análisis de Datos
Los escenarios
6 AGOSTO, 2012 1 COMENTARIO
A veces es necesario observar los datos, las operaciones y los resultados desde diversos ngulos. Excel
cuenta con una herramienta, que nos facilita esta tarea: el administrador de escenarios. Herramienta de
anlisis que permite evaluar distintas estrategias, entendiendo por escenario un conjunto de valores que se
utilizan para prever los resultados de un modelo de hoja de clculo.
El funcionamiento en Excel 2010 es similar a la versin 2003. Supongamos los datos de nuestro ejemplo,
donde habamos creado esos escenarios adjuntndole un botn de comando con cdigo VBA. Con la
herramienta Escenarios diseamos los mismos sin necesidad de cdigo.
Supongamos que tenemos los datos iniciales:
Para guardar esta presentacin de datos como un escenario posible en 2003, hacemos clic en Herramientas
>Escenarios y desplegamos la caja de dialogo de escenario.
En 2010 en Datos>Anlisis Y si > Administrador de escenarios. Con ello desplegamos la caja de dilogo de
Escenarios:
Clic en Agregar, y nos saldr otra ventana en donde escogeremos un nombre para nuestro
escenario. En esta ventana se muestra el valor actual de la celda cambiante y preguntando qu nuevo
valor se desea introducir en la misma. Cuando introduzca un valor podr pulsar el botn Agregar para
continuar creando otros escenarios, o bien Aceptar para terminar y regresar al cuadro de dilogo
Administrador de escenarios.
De forma predeterminada, las herramientas de VBA estn ocultas. Es necesario completar los pasos
siguientes para cambiar la configuracin en las opciones de Excel para acceder a la ficha Programador.
Los iconos utilizados para grabar y reproducir macros VBA en el grupo de cdigo en la ficha del desarrollador:
Herramientas bsicas II
25 JULIO, 2012 DEJA UN COMENTARIO
2.
3.
4.
Aparecer la ficha:
5. Desmarcar Bloqueada.
Desactivar la casilla Bloqueada y Hacer clic sobre el botn Aceptar.
Si se activa la casilla Oculta, lo que se pretende es que la frmula o el valor de la celda no se pueda visualizar
en la barra de frmulas.
Seleccionar la pestaa Revisar.
Hacer clic sobre el botn Proteger hoja que se encuentra en la seccin Cambios.
Aparecer el cuadro de dilogo Proteger.
Dejar activada la casilla Proteger hoja y contenido de celdas bloqueadas para proteger el contenido de las
celdas de la hoja activa.
Activar las opciones deseadas de la casilla Permitir a los usuarios de esta hoja de clculo para que no tenga
efecto la proteccin para la modificacin seleccionada y desactivarla para tener en cuenta la proteccin.
Si queremos asignar una contrasea para que solamente pueda desproteger la hoja la persona que sepa la
contrasea, escribirla en el recuadro Contrasea.
Hacer clic sobre el botn Aceptar.
Las opciones que vienen seleccionadas por defecto son Seleccionar celdas bloqueadas, lo que nos permite
situarnos en las celdas que protejamos pero no nos permitir realizar ninguna modificacin en ellas, y
seleccionar celdas desbloqueadas, que nos permitir situarnos y modificar aquellas celdas que no
protejamos. La lista de acciones que podemos realizar a pesar de que protejamos las celdas son, como se
puede ver en la ventana de la imagen, muchas ms (cambiar formato de celdas, de filas, de columnas,
etctera)..
2. Si deseamos introducir una contrasea para desactivar posteriormente la proteccin debemos escribirla en
el recuadro Contrasea para desproteger la hoja.
3. Pulsamos Aceptar tras seleccionar las opciones deseadas y ya est. Si a continuacin intentamos escribir o
borrar cualquier contenido de cualquier celda, excel no nos dejar y nos presentar un mensaje como el que
sigue:
Para proteger celdas concretas de una hoja debemos seguir los siguientes pasos:
A) Seleccionamos las celdas que NO deseamos proteger, es decir, las entradas de datos.
B) Vamos al men Formato/Celdas y seleccionamos la ltima pestaa de la ventana:
C) Desactivamos la opcin Bloqueada y pulsamos Aceptar. Al volver a la hoja todava no ha ocurrido nada. Si
prueba a escribir en las celdas que, por ejemplo, contienen frmulas ver que puede hacerlo sin problema.
D) Vamos al men Herramientas/Proteger/Proteger hoja y pulsamos directamenteAceptar. A partir de este
momento slo podr modificar las celdas de entradas de datos, mientras que sus frmulas y resto de celdas
vacas no podrn ser modificadas.
Hipervnculos y comentarios
Los hipervnculos no cambian demasiado respecto a la versin 2003. Supongamos que deseamos establecer
un hipervnculo a la pgina de Movistar desde el rea del grfico. Slo debemos seleccionar el mismo (clic en
el borde del mismo) seguidamente Men>insertar>Hipervnculo o directamente con Ctrl+Alt+k. Nos saldr la
misma pantalla que en la versin 2003. Slo insertar la direccin URL y listo.
Con el fin de proporcionar informacin al usuario se puede agregar en las celdas que deseemos un
comentario que aparecer como texto emergente al pasar el puntero por la celda en cuestin. Por ejemplo en
la celda F2 insertamos el comentario el IVA puede variar > Revisar / Comentarios / Nuevo comentario. Para
modificar o eliminar un comentario abrimos el men contextual desde la celda en cuestin.
Insertar funcin
Excel dispone de un gran nmero de funciones, la versin 2003 contaba con 329 y la versin 2010 unas 340
ms o menos.
En la primera versin de Microsoft Excel 2.010 se modificaron los nombres de algunas funciones. Luego,
mediante el SP1 (Service Pack 1) se volvieron a los nombres originales. Estos cambios no afectan la
compatibilidad entre las distintas versiones de Excel (la conversin de los nombres se hace
automticamente). A continuacin mostramos una tabla donde se ven las funciones que cambiaron de
nombre:
Para insertar una funcin se procede igual que en la versin 2003, podemos hacerlo desde la misma barra
para insertar frmulas pinchando en fx con lo que se nos abre el asistente. La segunda forma es a travs de la
pestaa Frmulas. Si vamos a trabajar con operaciones comunes como autosuma, promedio, etc tambin
contamos con la herramienta directa en la cinta de opciones dentro del grupo Modificar.
En la celda c29 hemos procedido a insertar la funcin promedio. Y desde la cinta de opciones se ha
seleccionado nmero desplegando la flechita hacia abajo para colocar slo dos decimales. En G9 se ha
procedido a insertar la siguiente funcin lgica =SI(F5<0;RECESION;) . Para colocar el formato condicional
hemos seleccionado el tem en el icono estilos. Esos estilos adems se pueden editar simplemente
desplegando la pestaa:
Buscar objetivo
Sin duda una de las mejores utilidades que tiene Excel, la funcin Buscar objetivo, nos facilita averiguar el
valor de la variable que determina un resultado en una ecuacin sencilla. En el siguiente ejemplo
analizaremos su aplicacin en Excel 2010.
Supongamos que deseamos conocer el importe peridico a satisfacer para amortizar un prstamo de 4500
al 1,5 mensual. Para ello podemos disear una tabla como la siguiente:
En la celda B9 hemos insertado una cantidad aleatoria, en este caso 200, como cuota inicial. Despus hemos
calculado los intereses en base al saldo pendiente de amortizar, o sea en C9 hemos insertado =E8*$b$5/100 ;
y la amortizacin es la parte de la cuota que resta una vez descontados los intereses es decir en D9>=$B$9C9.
Con esto ya tendramos la segunda lnea del cuadro de amortizacin. Rellenamos hacia abajo hasta alcanzar
las 12 mensualidades.
Evidentemente y como podr comprobar, con esa cuota en el perodo 12 nos quedara todava un saldo
pendiente de 2772,04 . Bien aqu es cuando entra en juego nuestra funcin Buscar Objetivo.
Nos posicionamos en la celda E20 y seleccionamos Datos>Anlisis Y si> Buscar Objetivo. En la ventana
emergente insertaremos los datos tal y como aparecen en la imagen:
Es decir definimos la celda en donde se refleja el ltimo saldo pendiente con el valor cero, ya que al final de
los 12 perodos deseamos tener amortizado el prstamo, para cambiar la cuota a abonar es decir. Dicho de
otra forma a cunto debe ascender el importe peridico para devolver el prstamo en 12 cuotas.
Evidentemente que podemos utilizar otra funcin financiera ms prctica como puede
ser Pago, (por ejemplo en E3 podemos insertar =PAGO(B5/100;B4;B3)) lo que nos dara el mismo resultado.
Imaginemos un envasador de caf que presenta los siguientes datos en su cuenta analtica:
Margen inicial->15 %
IVA inicial>7 %
Con esos datos de partida planteamos un escenario inicial, y otros tres alternativos. En el escenario inicial
haciendo clic en el botn correspondiente nos debe presentar cules seran los resultados de aplicar una
subida de 1 punto en el IVA (del 7 al 8%). Los datos de las celdas D22, D23, D24 y D26, son iniciales y fijos.
En E22 y E24 se ha aplicado un incremento del coste del 1% por el impacto del IVA soportado. En H25 e I25
se presenta el precio final inicial, y el precio final revisado con el IVA al 8%.
Para ello se ha procedido a redondear este ltimo dato con la funcin correspondiente (celda I25):
=REDONDEAR.MAS(((E22+E23+E24)*(1+E26))*(1+G22);1)
Como podr observarse en el ejemplo una subida de 1 punto en el IVA llevara un desplazamiento de
incremento del precio en un 8,69%. evidentemente ello supondra un aumento del beneficio
marginal potencial , que no real dado el menor nivel de demanda que supondra un encarecimiento del
producto. Por ello se plantea en el ejemplo otro escenario denominado Escenario Costes en el que se plantea
la posibilidad de mantener los mismos precios, reduciendo los costes directos. Para ello se ha insertado otro
botn mediante la Vista Programador. Esta opcin es posible que no est presente en la cinta de opciones,
para insertarla en la misma seleccionamos Inicio>Opciones>Personalizar vista de opciones (en la ventana de
la derecha marcamos Programador) y aceptamos.
A continuacin y una vez que tenemos disponible la vista Programador hacemos clic en ella y desplegamos el
botn Insertar Controles. A diferencia de la versin 2003 estos controles vienen recopilados en dos grupos, los
de formulario y los Active x. Seleccionaremos un botn de comando de este segundo grupo, y
lo insertamos en nuestra hoja. Para cambiar el nombre, con el botn secundario seleccionamos Objeto botn
de comando->Modificar o bien a travs de Propiedades -> Caption ; para cambiar el color del botn de igual
forma que en VBA 2003 Propiedades ->BackColor.
El siguiente paso es insertar el cdigo asociado al evento clic. Para este Escenario Inicial solo queremos que
se presenten los valores de partida, lo podemos hacer mediante una matriz o simplemente uno a uno:
Private Sub CommandButton1_Click()
Range(D22) = 13.95
Range(D23) = 0.75
Range(D24) = 0.25
Range(D26) = 0.15
Range(E22) = 15.07
Range(E23) = 0.75
Range(e26) = 0.15
End Sub
Una vez insertado el cdigo volvemos a Excel e insertamos el siguiente botn Escenario Costes que nos va a
permitir replantear los costes directos en funcin del objetivo de mantener el precio final. El cdigo asociado al
evento clic en este caso sera:
Private Sub CommandButton2_Click()
buscamos el objetivo de aguantar el precio final
para mantener mrgenes reducimos costes directos
Range(E22) = 15.07
Range(e24) = 0.26
Range(e26) = 0.15
Desplegamos la ventana Estilo de formato y seleccionamos Conjunto de iconos. Para escoger a su vez el tipo
de icono abrimos el desplegable Estilo de icono para seleccionar el que deseemos.
El siguiente paso ser establecer la regla como tal, en nuestro caso marcamos que el icono sea verde en la
celda E23 cuando el valor sea mayor que el de la celda D23, desplegando como tipo nmero. Con el resto
procedemos de forma similar.
FILED UNDER BUSCAR OBJETIVO, ENTENDER VBA TAGGED WITH BUSCAR OBJETIVO, FUNCIONES, VBA
Herramientas bsicas I
23 JULIO, 2012 DEJA UN COMENTARIO
La nueva interfaz es sustancialmente diferente con respecto a 2003. Lo que todo el mundo se
pregunta Perodnde estn las cosas?. Todo ha cambiado, tanto los mens como algunos procedimientos.
Empezando por la barra de men lo primero que nos encontramos es el botn de office en la versin 2007 y la
pestaa Archivo en la versin 2010. Dicho botn nos da acceso a las opciones Nuevo,Abrir,Guardar, Guardar
como, imprimir etc.
Si deseamos crear un nuevo libro botn office>Nuevo (2007) o Archivo-Libro blanco-Crear (2010). Por
ejemplo crearemos un libro nuevo que lo llamar PRUEBA1. Este libro los guardar en el directorio que
desee, haciendo notar que en estas versiones existen varias opciones para guardar un libro de Excel. Como
libro de Excel con la extensin .xlsx (.xls en versin 2003). O como Libro de Excel habilitado para
macros (con extensin .xlsm).
Como recordar Excel 2003 no distingua, cuando se guardaban, libros con macros de libros sin macros. De
hecho cuando intentbamos abrir un libro con macros nos avisaba e incluso nos impeda actuar sobre los
objetos VB si no bajbamos el nivel de seguridad. Este tratamiento en cuanto a la seguridad no ha cambiado
ni en 2007 ni en 2010. No obstante para poder trabajar con libros de extensin .xlsm debemos habilitar la
seguridad de la siguiente manera:
Programador> Seguridad de macros / Habilitar todas las macros-.
En Excel 2010 debemos ir a Archivo>Opciones>Centro de confianza>Clic en configuracin de centro de
confianza>Configuracin de macros. Marcamos
Habilitar todas las macros
Con un pequeo ejemplo podemos ir tomando contacto con la nueva interfaz, por ejemplo imaginemos que
queremos hacer un pequeo grfico para comparar tarifas de telefona mvil. Una vez iniciado Excel,
introducimos los datos de la misma manera a como lo haramos en la versin 2003.
La introduccin de las frmulas no vara, como tampoco lo hace las referencias absolutas y relativas. Es decir
podemos anclarr las celdas que nos interesa con el signo $.
Una vez rellenada la hoja con los datos, podemos insertar un grfico. En principio el icono para insertar
grficos no est presente en la cinta de opciones. A diferencia de la versin 2003, en 2007 y 2010 tenemos la
posibilidad de personalizar nuestro entorno de trabajo. Es cierto que en la versin 2003 existe la posibilidad de
establecer una barra de herramientas personalizada, a la que incluso le podamos poner nuestros propios
iconos con el pequeo editor que incorpora, pero esta funcin se hace ms presente y necesaria en las
versiones 2007/10.
Para ello haciendo clic en Archivo/Botn office, buscamos barra de herramientas de acceso rpido o bien
desplegando en el icono siguiente:
Desplegamos Comandos ms utilizados y escogemos por ejemplo en este caso Crear grfico.
Si no queremos insertar esta herramienta como acceso rpido iremos a Men>Insertar>Grficos. Aqu
escogemos el tipo que precisemos para representar los datos. En el ejemplo seleccionamos primero el rea
de datos (en este caso A1:E42), seguidamente Insertar><grfico dispersincon lneas suavizadas
Bueno con esto nos habr insertado un grfico ms o menos como este:
Para comenzar tenemos en la leyenda 4 series cuando slo tiene que haber 3. Vamos a eliminar la Serie 1,
haciendo clic sobre Serie 1 botn derecho y eliminar serie. A continuacin necesitamos cambiar los
respectivos nombres de las series, hacemos clic en el grfico y despus en seleccionar datos nos saldr una
ventana como esta:
Y tal como se seala en la imagen clic en editar y cambiamos el nombre a las series.
Si se fija bien podr observar como se activan las diferentes herramientas para los grficos. Si selecciona la
pestaa Presentacin acceder a las opciones de Ttulo de grfico, Etiquetas, etc.
Los minigrficos
Los minigrficos , son una de las grandes novedades visuales con las que nos sorprende Excel 2010. Se
tratan de pequeos grficos incrustados en el fondo de una celda de tal forma que complementan la
informacin contenida en las celdas de al lado. Estos minigrficos suelen utilizarse para ver de un solo
vistazo, tendencias o resultados sin tener que estudiar grandes tablas de nmeros.
En el ejemplo de referencia:
1.
2.
3.
Le aparecer una nueva ventana para seleccionar el rango de datos seleccione C12:E12.
4.
Clic en Aceptar.
Para eliminar un minigrfico, nos posicionamos en la celda donde se encuentra ubicado y con el botn
derecho seleccionamos Minigrfico> Borrar minigrfico.
FILED UNDER SIN CATEGORA TAGGED WITH MINIGRFICOS
Las barras de error son una herramienta que permite mostrar el rango del desvo estndar de una medicin
experimental. Para ver comprender mejor su uso y forma de aplicacin analicemos el siguiente ejemplo.
Supongamos que tenemos la siguiente tabla de datos:
Error X
Error Y
4,80
2,87
0,79
0,80
5,10
4,00
1,09
3,20
2,55
6,01
2,33
2,31
4,00
6,78
0,07
2,01
3,90
1,00
0,08
3,00
Para agregar barras de error a un grafico, seleccionamos una de las series de datos y abrimos el men de
formato de series de datos (clic en cualquier botn azul).
Se nos abrir un cuadro de dilogo que cuenta con una pestaa para definir las barras de error de X y otra
para definir las de Y.
En el cuadro de definiciones podemos elegir entre la presentacin de la barra (ninguna, por exceso, por
defecto o ambas) y la cuanta del error.
Por ejemplo si definimos un error del 25% para cada punto en la ventanilla de Porcentaje y elegimos la opcin
Ambas en Presentar, veremos algo como esto:
Excel ha agregado una lnea a ambos lados de cada punto, que representan una desviacin del 25% de este
punto. Pruebe a modificar el grfico agregando el mismo error al valor de las Y.
Si desea variar el formato de las barras lo puede hacer desde el men tramas.
FILED UNDER SIN CATEGORA TAGGED WITH BARRAS
La funcin CARACTER en Excel regresa un carcter especfico para un nmero entero que ha sido
proporcionado como argumento. Un PC tiene un juego de caracteres con un nmero entero asignado y es
precisamente ese nmero el que debemos proporcionar como argumento.
Reglas de validacin
25 NOVIEMBRE, 2011 DEJA UN COMENTARIO
Las reglas de validacin nos permiten especificar el formato para un rango de celdas, restringiendo por
ejemplo la entrada de datos no deseados, sean textos, campos vacos o nmeros. La forma de activar dichas
reglas, recordemos, es desde la barra de men, desplegamos datos y posteriormente validacin.
En este artculo se describe cmo configurar la validacin de datos, incluidos los tipos de datos que se
pueden validar y los mensajes que se pueden mostrar, adems de proporcionar un libro que se puede
descargar para obtener ejemplos de validacin que se pueden modificar y utilizar en hojas de clculo propias.
Con VBA tambin es posible crear reglas de validacin. En el siguiente ejemplo vamos a desarrollar una
macro que nos impide dejar vaca la celda A1 y ademas slo nos va a permitir introducir valores comprendidos
entre 5 y 10.
Utilizaremos una estructura With _ end with. Y comenzamos seleccionando el rango a validar, en el ejemplo el
A1:
With Range(a1).Validation
Validation es una propiedad con los mtodos siguientes:
xlValidateDate(para fechas)
Formula2
.Delete
.Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:=5, Formula2:=10
.IgnoreBlank = True
.InCellDropdown = True
para que nos salga una ventanita antes de introducir los datos
.InputTitle = Nmero entre 5 y 10
el ttulo de la ventanita
.ErrorTitle = Error en los datos
los mensajes emergentes
.InputMessage = Slo se admiten valores entre 5 y 10
.ErrorMessage = Slo nmeros entre 5 y 10
.ShowInput = True
.ShowError = True
End With
End Sub
Habr observado que existe una primera sentencia .Delete, con ello nos aseguramos de que no existe una
regla de validacin o condicin previa que nos anule la regla en ejecucin. De hecho si elimina esa lnea de
cdigo observar que se origina un error.
FILED UNDER SIN CATEGORA
Adems de las funciones bsicas ya vistas anteriormente, Excel cuenta con otras que pueden resultar de gran
ayuda al recontar celdas vacas u ocupadas:
CONTARSI: cuenta las celdas en el rango que coinciden con una condicin dada. Por ejemplo si
quisiramos saber cuntos valores dentro del rango B2:B12 (al que yo he llamado DATOS) son mayores a
50 escribira en la barra de frmulas =CONTAR.SI(DATOS;>50
CONTARA:Cuenta el nmero de celdas que no estn vacas y los valores que hay en la lista de
argumentos. Ojo a diferencia de la funcin CONTAR , esta cuenta cualquier cosa sea nmero, letras o
carcteres.
Bien estas funciones nos ayudan a contar celdas con o sin datos, pero qu ocurre si quisiramos contar
celdas con un determinado color de fondo. Veamos:
Seleccionamos men Edicin Buscar (Ctrl+B)
Hacemos clic en la flecha Formato
Seleccionamos Elegir formato de celda
Seleccionamos la celda con formato. En nuestro caso, la A2 que es la que tiene el fondo amarillo
Para comenzar repasaremos las funciones bsicas que ostenta Excel para clculos estadsticos. Para ello
inicie un nuevo libro Excel y en la primera hoja inserte los datos siguientes:
Vaya a men>insertar>funcin.
En seleccionar categoras, escoga Estadsticas y Promedio, que es la funcin que nos devuelve la
media aritmtica de los datos escogidos.
Otra forma rpida es seleccionar el rango de celdas A1:A13 y desplegar el signo sumatorio de la barra de
mens, seleccionando la misma funcin promedio.
Para practicar en A14 inserte la funcin mediana , en A15 la moda y en A16 la desviacin estndar.
Para la media
A veces cuando trabajamos en Excel se producen errores que la aplicacin muestra con una serie de
mensajes. Los ms comunes son los siguientes:
TIPO DE
ERROR
DESCRIPCION
#VALUE!
Se ha introducido un
tipo de argumento
u operador errneo.
#NAME!
Excel no reconoce
el texto en una
frmula
#DIV/0
Se est intentando
dividir entre cero
Cuando se trata de introducir texto en una frmula que requiere un nmero o valores lgicos.
Cuando se introduce una referencia a una celda , una frmula o una funcin como una array
constante.
VBA dispone dentro de su categoria de objetos de uno de especial aplicacin para el tratamiento de errores: el
objeto Err(). Este permite alamacenar informacin en tiempo de ejecucin sobre los errores que puedan
presentarse apareciendo cuando se realice una operacin no vlida. Los atributos o propiedades se
especifican por quien genera el error. Veamos una descripcin de cada uno:
PROPIEDADES
Description
(Propiedad)
Erl (Propiedad)
HelpContext
(Propiedad)
HelpFile
(Propiedad)
LastDLLError
(Propiedad)
Number
(Propiedad)
Source
(Propiedad)
Mtodos
METODOS
Clear
(Mtodo)
Raise
(Mtodo)
Veamos un ejemplo del mismo, en l vamos a generar un error por desbordamiento en tiempo de ejecucin y
despus vamos a presentar el mensaje correspondiente:
Sub ejemplo_error()
Dim Msg As String
Si se presenta un error construimos un mensaje informativo del mismo
On Error Resume Next
Err.Clear borramos cualquier objeto error
Err.Raise (6) generamos un error por desbordamiento
comprobamos que se ha dado el error y presentamos el mensaje
If Err.Number <> 0 Then
Msg = Error & Str(Err.Number) & ha sido generado por _
& Err.Source & Err.Description
MsgBox Msg, vbCritical, Error
End If
End Sub
En el ejemplo ha podido ver el uso del evento Clear se utiliza para borrar explcitamente el objeto Err una vez
que se ha controlado un error, como ocurre cuando se usa el control diferido de errores con On Error Resume
Next. Yel evento Raise genera un error en tiempo de ejecucin.
Como ya dije en la primera parte de este captulo, se nos pueden presentar diversos tipos de errores. Hemos
podido analizar algunas tcnicas que nos facilita el manejo de los mismos. Pero a la hora de programar el
editor VBA nos aporta otras herramientas que nos ayudan cuando estamos programando a depurar nuestro
cdigo. Recordemos que al principio establecimos los cuatro tipos fundamentales de error que se pueden dar:
de sintxis
de compilacin
de ejecucin
de lgica
Los errores de sintxis se detectan directamente a medida que se introduce el cdigo. VBA tiene una
herramienta de comprobacin de sintxis que viene activada por defecto. No obstante para activarlo vaya a
Herramientas>Opciones>ficha editor>Comprobacin de sintxis automtica. Los errores de sintxis que no se
corrigan provocan un error de ompilacin.
Los errores de compilacin dijimos que se generan cuando se compila el programa, es decir, cuando se
traduce a lenguaje mquina el cdigo que hemos escrito.
Cuando Excel trata de ejecutar un cdigo y detecta un procedimiento, una instruccin o una operacin invlida
se produce un error de ejecucin, por ejemplo cuando estamos haciendo una llamada a una Hoja 4 siendo
que esta no existe.
Los ms complicados de detectar seran los errores de lgica, entre otros aquellos imputables al propio
programador. Para entendernos aquellos insertos en nuestro propio algoritmo que da lugar a errores
inesperados. Para este tipo de error VBA dispone de una herramienta de depuracin que permiten la
ejecucin del cdigo paso a paso comprobando los procedimientos y valores de las variables. Para acceder a
la misma puede activarla desde la barra de men>Ver>barra de Herramientas>Depuracin.
Una vez que la active le saldr una barra de herramientas con unos iconos: las cuatro primeras leidas de
izquierda a derecha ya las conoce, fijmonos en el icono de una mano alternar punto de interrupcin. En
ocasiones, puede interesar poner en ejecucin un programa e interrumpirlo en una lnea especfica. Esto es
posible mediante los llamados puntos de interrupcin, que se adjuntan a la lnea especfica en la cual se
desea detener la ejecucin. De este modo, cuando el curso de ejecucin del programa llegue a la lnea, ste
se detendr, es decir, la lnea con punto de interrupcin quedar pendiente y sin ejecutar; en ese momento, la
aplicacin donde se ha creado el mdulo pasa de Modo Ejecucin a Modo Interrupcin.
Tras la interrupcin, se podr las siguientes acciones:
evaluar las variables que estn siendo utilizadas a travs de la ventana Inspeccin
ver el curso exacto de ejecucin del cdigo, es decir, la secuencia de acciones que se realizan
Ms a la derecha de la barra encontr una serie de iconos que activan diversas ventanas, una de ellas es
laventana Locales que nos muestra todas las variables y parmetros involucrados en una funcin o
procedimiento.
La ventana Inmediato se utiliza en tiempo de diseo para depurar y evaluar expresiones, ejecutar
instrucciones, imprimir valores de variables, etc. Permite escribir expresiones que el lenguaje de programacin
evala o ejecuta durante la depuracin.
FILED UNDER CONTROL DE ERRORES
En el presente apartado vamos a abordar un acuestin no trivial, y que nos puede reportar ciertos beneficios
al realizar nuestros programas. Los errores son casi inevitables, aun planificando bien nuestro cdigo
podemos cometer errores de diseo, de sintxis, de compilacin o lgicos.
Si VBA encuentra un error y no hemos insertado un cdigo de comprobacin de error, el programa se detiene
y el usuario se encontrar con un mensaje embarazoso: Continuar,Finalizar o Depurar. Si este error se nos
presenta a nosotros en el momento en que estamos probando nuestro cdigo, o es un programa realizado por
nosotros mismos, al seleccionar la opcin de depurar se nos va a presentar la ventana de cdigo con una
lnea en amarillo en donde se resalta la localizacin del error. Podemos por tanto detener la ejecucin del
programa, corregir el error y ejecutarlo de nuevo.
Pero qu ocurrira si estos errores se le presenta a un usuario que no tiene porque saber de programacin.
Tenemos por tanto que establecer una estrategia para interceptar los errores. Para comenzar vamos a tratar
el siguiente ejemplo:
Introduzca el mdulo siguiente:
Sub division()
Dim x, y, z As Double
x = InputBox(Introduzca el dividendo, DIVISION)
y = InputBox(Introduzca el divisor, DIVISION)
z=x/y
MsfBox x & dividido entre & y & es igual a & z
End Sub
Ver que he marcado en negrita el mensaje de respuesta, en el que intencionadamente he introducido un
primer error de sintxis. El mensaje que le aparecer cuando lo intente ejecutar es ERROR DE
COMPILACION! NO SE ENCUENTRA SUB O FUNCTION. Es decir que cuando VBA compila (traduce a
lenguaje mquina) el cdigo que le hemos insertado, no lo entiende.
Corrja el error y ejectelo de nuevo.
Ahora en tiempo de ejecucin cuando el programa le solicite introducir el divisor, introduzca un cero.
Afortunadamente ese error VBA ha sido capaz de interpretarlo. Est dentro de la lista de errores
interceptables.
Inserte ahora debajo de la declaracin de variables la siguiente lnea:
On error resume next
Ejecute de nuevo el cdigo y observar que le arrojar la divisin entre 0, como solucin cero. O sea que con
esta sentencia le indicamos a VBA que en caso de que encuentre algn error lo ignore y contine ejecutando
el cdigo.
Es fcil pensar que con esta lnea se resuelve todos los problemas pero realmente no es as tan slo se
enmascara, con lo que si no se hace nada para corregir la causa del error, se podrn generar futuros errores.
Vamos a crear por tanto unas lneas de cdigo para manejar los errores. Una opcin bastante usada es
introducir una condicin con el bucle DoWhile, por ejemplo:
Sub obtenernumeros()
Dim hecho As Boolean
Dim divisor, dividendo, division As Double
hecho = False
Do While Not divisor <> 0
dividendo = InputBox(Introduzca el dividendo, DIVISION)
divisor = InputBox(Introduzca el divisor, DIVISION)
Loop
division = Format(dividendo / divisor, #0.00)
MsgBox division
End Sub
Con ello forzamos sin ms que hasta que se introduzca una cifra distinta de cero como divisor. Una manera
ms directa es crear una funcin personalizada para la operacin en s, y hacer una llamada a la misma
desde un procedimiento. De esa forma para la funcin podramos escribir el siguiente cdigo:
Function dividir(dividendo, divisor) As Boolean
declaramos las variables
Dim msg As String
Dim resultado As Double
Resume: se le dice a VBA que contine la ejecucin del programa desde la misma sentencia donde
se produjo el error.
Resume Next: a partir de la primera sentencia ejecutable que encuentre despus de la lnea que
provoc el error.
Mdulos de clases
2 OCTUBRE, 2011 1 COMENTARIO
Excel cuenta con muchos objetos disponibles, aunque puede llegar el momento en que sea ms prctico para
el usuario crear su propio objeto. Estos se crean usando un mdulo de clase asignndoles propiedades y
mtodos personalizados.
En el siguiente ejemplo que vamos a desarrollar deseamos aplicar un descuento a los clientes que sean de
Londres. Evidentemente que esto se puede hacer de forma mucho ms fcil sin necesidad de ninguna lnea
de cdigo, pero nos resulta til para explicar de forma clara el concepto que estamos desarrollando.
Desde VBA seleccione Insertar>Mdulo de clase. Es importante tener en cuenta:
Como necesitamos que estas variables sean accesibles para el mdulo estndar le hemos declarado Public.
El siguiente cdigo crea un mtodo descuento que permite calcular el descuento aplicable:
Public Function descuento() As Double
descuento = importeventa * ratio
End Function
Ahora mediante un mdulo estndar procederemos al clculo de los descuentos de los datos que se han
insertado en la hoja 1:
Declaramos una la variable para hacer uso de nuestro objeto personalizado y otra para hacer el recorrido por
las filas:
Option Explicit
Dim cliente As clsCliente
Dim fila As Byte
A continuacin establecemos la variable en un nuevo objeto:
Set cliente = New clsCliente
A partir de aqu recogemos los valores de las diferentes propiedades:
With cliente
For fila = 2 To 6
.localidad = Cells(fila, 2).Value
.ratio = 0.1
.importeventa = Cells(fila, 3).Value
E introducimos un bucle condicional:
If cliente.localidad = Londres Then
Cells(fila, 5).Value = cliente.descuento
Cells(fila, 4).Value = 10 %
Cells(fila, 6).Value = Cells(fila, 3).Value Cells(fila, 5).Value
End If
Todo el cdigo del mdulo junto con los cierres correspondientes:
Sub descuento_clientes()
Set cliente = New clsCliente
With cliente
For fila = 2 To 6
Como continuacin de posts anteriores, en esta ocasin vamos a analizar como establecer una conexin
entre Excel y una base de datos Oracle, que nos permita hacer una consulta devolviendo los datos a Excel.
Ya coment que son diversas las tareas que se pueden efectuar entre una base de datos y Excel. As que
para tener un primer contacto y repasar las diferencias que existen entre unos SGBD y otros, he preferido no
adentrarme demasiado en otro tipo de operaciones.
Como hacamos en otras macros, es necesario como paso previo tener activadas las referencias oportunas:
Microsoft ActiveX Data Objects 2.x. Este ejemplo ha sido desarrollado con la versin Oracle Database
Express Edition. Para ello he creado una pequea tabla EMPLEADOS con tres campos ID, NOMBRE y
EDAD.
Veamos el cdigo:
Sub excel_oracle()
Definiendo las variables para la conexin, reordset, columnaumnas y filas
Dim conexion As ADODB.Connection
Dim rs As ADODB.Recordset
columna = 0
En la primera fila:los nombres de las columnas
Do While columna < rs.Fields.Count
Cells(1, columna + 1) = rs.Fields(columna).Name
columna = columna + 1
Loop
Ahora los datos obtenidos de la seleccin
fila = 1
Do While Not rs.EOF
fila = fila + 1
columna = 0
Do While columna < rs.Fields.Count
Cells(fila, columna + 1) = rs.Fields(columna).Value
columna = columna + 1
Loop
rs.MoveNext
Loop
End Sub
El fragmento de cdigo referente a la conexin, nos marca los parmetros que se precisan para realizar la
misma: el usuario (en este caso system) , la contrasea (root) el origen de los datos (la base de datos XE) y el
proveedor OLEDB de Microsoft para Oracle que es MSDAORA.1.
Despus lanzamos la orden SQL y presentamos los datos con dos bucles, uno para la cabecera, y otro para
los datos. Y aqu el resultado:
Como continuacin del post anterior, en este vamos a tratar la conexin de Excel con el gestor de bases de
datosMySQL. Las operaciones que se pueden realizar entre una hoja Excel y una base de datos pueden ser
variadas,tanto como para trabajar un tutorial aparte. No obstante se pueden abordar las principales:
En el post anterior trat de como crear una base de datos en Access, con sus tablas y campos; y el volcado
posterior de datos de Excel hacia Access. Ms adelante ir tratando el resto de operaciones que podemos
efectuar entre los dos programas de Microsoft, mediante VBA.
Por ahora vamos a analizar como hacer operaciones con MySQL.
Si lo analizan bien, casi siempre efectumos los mismos pasos:
1.
Debemos crear el espacio de trabajo, donde debemos especificar a Excel el motor que se precisa
para hacer la conexin al gestor de bases de datos.
2.
Tenemos que marcar las referencias especficas para que Excel la carge y la tenga disponible en su
biblioteca.
3.
la conexin
servidor
usuario
contrasea
Una vez tratado los datos, es decir ejecutada la peticin, cerrarmos la conexin y vaciamos las variables
objeto.
Bien en el caso que nos ocupa y, atendiendo al primer punto, debemos cargar la referencia a la
librera Microsoft Active X Data Objects 2.x .
Lo ms probable es que no tenga descargado los drivers para la conexin con MySQL. Para ello vaya a esta
direccin MySQL ODBC 3.51 Driver. Le aconsejo que escoga Windows (x86, 32-bit), MSI Installer
Connector-ODBC para 32-bit y en caso de 64 Windows (x86, 64-bit), MSI Installer Connector-ODBC. Una
vez descargadodoble clic en el MSI y escoga instalacin tpica.Una vez terminada la instalacin, puede
verificar la misma en Panel de Control>Herramientas Administrativas>Orgenes de datos ODBC. Clic en la
pestaa Drivers y bsquelo en la lista:
A continuacin le expongo comentado el cdigo para volcar los datos de una base de datos de MySQL a
Excel. En el ejemplo la base que se ha empleado se llama directorio y la tabla example. Se ha utilizado un
servidor local, con lo que la direccin del host es la 127.0.0.1. Para poder practicar le aconsejo que inserte
una nueva base de datos, sino tiene una ya creada, con una tabla y unos pocos datos.
Para empezar y como paso previo cargamos la referencia a la librera Microsoft Active X Data Objects 2.x
Se presupone instalado el driver MySQL ODBC 3.51
Comenzando
Sub excelMySQL()
variable para la conexin
Dim conexion As New ADODB.Connection
idem para el nombre del servidor en este caso estoy empleando una versin en local
Dim miservidor As String
ahora la base de datos en este caso se llama directorio y la tabla example
Dim bd As String
variables para usuario y contrasea (no la creo porque no la tengo en el servidor, en otro caso hay que
crearla
Dim user As String
variables para la tabla que tiene slo tres campos
Dim i As Long, tabla, nombre, edad, consulta As String
el recordset
Dim rs As ADODB.Recordset
Estableciendo la conexin
miservidor = 127.0.0.1
bd = directorio
user = root
Set conexion = New ADODB.Connection con esto utilizamos la conexin indicada ms arriba
conexion.Open DRIVER={MySQL ODBC 3.51 Driver} _
& ;SERVER= & miservidor _
& ;DATABASE= & bd _
& ;UID= & user _
& ;OPTION=16427
Set rs = Nothing
conexion.Close
Set conexion = Nothing
On Error GoTo 0
End Sub
Habr podido observar una lnea : rs.Open consulta, conexion, adOpenStatic. Quisiera comentarla un
poco. El objeto Recordset es el interface entre los datos obtenidos de nuestras consultas sobre
las tablas y nuestras pginas excel. Representa una tabla organizada en filas (registros) y
columnas (campos). La propiedades y mtodos de Recordsets pasan por entender el
funcionamiento de otros dos objetos claves:
El cursor o puntero que nos permite desplazarnos por los registros del recordset. Dependiendo del tipo
elegido determinaremos los desplazamientos y cambios realizables en los datos.
El tipo de cursor lo definiremos mediante la propiedad CursorType, los posibles valores son:
El otro objeto es el cierre o tipo de bloqueo que efectuaremos en la base de datos cuando modifiquemos un
recordset, a fin de evitar que dos o mas usuarios accedan a modificar un mismo registro a la vez.
El tipo de cierre lo definiremos mediante la propiedad LockType, los posibles valores son:
Por ltimo habr podido observar el parmetro : & ;OPTION=16427. Esto nos asegura que los valores
numricos de tipo large son interpretados correctamente por Excel.
FILED UNDER EXCEL Y BASES DE DATOS TAGGED WITH MYSQL
En este post voy a intentar explicar como utilizar objetos para crear bases de datos, introducir datos,
modificar su contenido o crear consultas, mediante VBA Excel.
Excel ya lleva incorporada una serie de funciones para trabajar con bases de datos, que gestionan mltiples
tareas para el usuario. Si queremos, no obstante, automatizar y potenciar estas tareas debemos hacer uso de
VBA.
Antes que nada es necesario aclarar algunos conceptos claves.
Las aplicaciones utilizan unos mecanismos para conectarse a bases de datos (en adelante BD). Son
los ActiveXData Objects (ADO),.
Con ADO, un programa puede leer, insertar, editar, o borrar, la informacin contenida dentro de la base de
datos. Adems, se puede manipular la propia base para crear nuevas tablas, como tambin alterar o eliminar
las ya existentes, entre otras cosas.
ADO sustituy a DAO y a RDO (para BD remotas) que eran los sistemas previos que se usaban.
La ltima versin de ADO, creada por Microsoft, se llama ADO.NET, y se usa en los entornos de
programacin de la plataforma .NET, de Microsoft, para manejar bases de datos tanto en Windows como en la
Web mediante ASP.NET, que es la nueva versin del ASP para la plataforma.NET.
Comenzaremos para aquellos que trabajan con versiones antiguas de BD, trabajando con DAO.
Para utilizar los objetos de acceso a datos, lo primero que debemos hacer es crear una referencia a estos
objetos. Para ello recuerde dentro del editor VBA vamos a Herramientas-Referencias-Microsoft DAO 3.6
Object Library.
Cuando cargamos esta referencia se crea un primer objeto del que se derivan los dems con los que vamos a
trabajar: DBEngine, a partir del mismo obtendremos los espacios de trabajo (Workspace) donde se
encontrarn cada una de las BD (database).
Una vez creada la BD obtendremos las TableDef por cada tabla que creemos con sus respectivos campos
(Fields) y el ndice de referencia de cada tabla (Index).
Al objeto de poder realizar los ejemplos sera conveniente que cree una carpeta por ejemplo C:\VisualExcel.
Supongamos que tenemos un libro con unos datos del que vamos a crear una base de datos. Podramos
insertar un botn Crear BD e insertarle el cdigo siguiente:
Private Sub CommandButton1_Click()
Dim bd As Database
Set bd = CreateDatabase(C:\VisualExcel\bd1.mdb, dbLangGeneral)
End Sub
Si no tiene activada la referencia comprobar que no en la seleccin del tipo de variable objeto, no le aparece
la opcin Database y por lo tanto tendr un error.
Con el mtodo CreateDatabase escribimos como argumentos la ruta y el nombre del fichero a crear. Si no
escribimos nada en la extensin tomar el tipo por defecto que es Acces mdb.
Si en vez de crear manualmente la carpeta desea automatizarlo debera crear los procedimientos para
verificar la ruta / archivo y en su caso crear la BD. Veamos:
Procedimiento para crear la carpeta
Sub NuevaCarpeta(ruta As String, nombrecpt As String)
Verificamos que el directorio existe
If Dir(ruta, vbDirectory + vbHidden) <> Then
comprobamos que en dicha ruta no existe ya una carpeta con el mismo nombre aunque est oculta
If Dir(ruta & \ & nombrecpt, vbDirectory + vbHidden) = Then
si todo es correcto la creamos en la ruta y con el nombre especificados
MkDir ruta & \ & nombrecpt
mensaje:
Revise las funciones Medir y Dir, que realmente son comandos de MS-DOS adaptados a VBA.
Bien hemos creado la BD pero como comprobar est vaca. Por lo tanto hemos de crear las tablas, los
campos y los ndices.
Para las tablas emplearemos el TableDef y para los campos Field como tipos.
Para crear los campos, al igual que en Access debemos indicar el nombre y su tipo.
Para crear la tabla emplearemos :
Set td= bd.CreateTableDef(Nombre_para_la_tabla)
Y para los campos, algo similar:
Set fldnombre= td.CreateField(Nombre,dbTex,8) es decir el nombre del campo, el tipo segn Access y su
longitud.
Por ltimo escribiramos las sentencias para aadir los campos a la tabla, y la tabla a la base de datos.
Veamos como queda todo junto:
Private Sub CommandButton1_Click()
Dim bd As Database
Dim td As TableDef
Dim fldalias, fldnombre, fldapellidos, flddireccion, fldpoblacion, fldtelefono, fldnacimiento As Field
On Error Resume Next
creando la carpeta de ejemplo
NuevaCarpeta C:\, VisualExcel
creando la base de datos
Set bd = CreateDatabase(C:\VisualExcel\bd1.mdb, dbLangGeneral)
ahora la tabla
Set td = bd.CreateTableDef(MiTabla)
creando los campos
Set fldalias = td.CreateField(Alias, dbText, 8)
Set fldnombre = td.CreateField(Nombre, dbText, 30)
Set fldapellidos = td.CreateField(Apellidos, dbText, 50)
Set flddireccion = td.CreateField(Direccion, dbText, 50)
Set fldpoblacion = td.CreateField(Poblacion, dbText, 50)
Set fldtelefono = td.CreateField(Telefono, dbInteger, 9)
Set fldnacimiento = td.CreateField(Fecha_nacimiento, dbDate)
aadiendo los campos a la tabla
td.Fields.Append fldalias
td.Fields.Append fldnombre
td.Fields.Append fldapellidos
td.Fields.Append flddireccion
td.Fields.Append fldpoblacion
td.Fields.Append fldtelefono
td.Fields.Append fldnacimiento
aadiendo la tabla
bd.TableDefs.Append td
End Sub
Si abre ACCESS ver que se ha creado la base de datos, con la tabla y los campos correspondientes.
Tambin comprobar que lo ha hecho en modo Access 2000.
Una forma alternativa y ms cmoda podra ser crear los campos con un bucle Withwend. En el ejemplo
siguiente podr ver cmo adems creamos un campo autoincrementable:
Creando la base de datos
Sub base_datos()
creamos las variables objeto para el espacio de trabajo
Dim ws As Workspace
la base de datos a la que llamar bd
Dim bd As Database
y la nica tabla de la bd que se llamara td
Dim td As TableDef
para los campos uno por cada columna
Dim id, apellidos, nombre, direccion, pob, tel As Field
creando los objetos
Set ws = DBEngine.Workspaces(0)
Set bd = ws.CreateDatabase(C:\mi_bd, dbLangGeneral)
Set td = bd.CreateTableDef(MiTabla)
necesito crear un campo contador para ello lo creo aparte de los otros
Set id = td.CreateField(Id, dbLong)
id.Attributes = dbAutoIncrField
td.Fields.Append id
creando y aadiendo el resto de campos de una sla vez
With td.Fields
.Append td.CreateField(Alias, dbText, 30)
.Append td.CreateField(apellidos, dbText, 30)
.Append td.CreateField(nombre, dbText, 30)
.Append td.CreateField(direccin, dbText, 50)
.Append td.CreateField(poblacin, dbText, 30)
.Append td.CreateField(tel, dbLong)
End With
aadiendo la tabla a la base de datos
bd.TableDefs.Append td
If Error = Then
MsgBox Base de datos creada
End If
End Sub
Bien hasta ahora lo que hemos hecho es crear la base, las tablas etc Pero todava no hemos volcado los
datos a Access. Veamos como podriamos hacerlo:
Exportando los datos con DAO
Sub exportar_datos()
Dim bd As Database, rs As Recordset, r As Long, x As Long, td As TableDef
La Shell de Windows
23 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
La SHELL de Windows es la interfaz grfica de Microsoft Windows. Es donde se recoge toda la interfaz del
usuario: el escritorio, la barra de tareas, explorador, etc.
Cuando usamos el sistema operativo como usuarios finales, trabajamos generalmente con aplicaciones, bien
para navergar en internet, para redactar documentos, para hacer clculos, etc.
Los programadores ,por contra, tienen necesidades ms avanzadas que los usuarios finales . Los
programadores necesitan para compilar y ejecutar programas y automatizar tareas repetitivas.
La mayora de los usuarios estamos familiarizados con la interfaz grfica de usuario o GUI. La mayora de los
entornos GUI muestran un escritorio que se rellena con ventanas , iconos y mens . Se utiliza
un puntero (dirigido por un ratn o trackball) para seleccionar los elementos en el escritorio. Estas interfaces
son a veces llamados WIMP interfaces, despus de las primeras letras de las palabras W_ indow, i_ con, m_
enu, y p_ ointer.
La otra interfaz de usuario es la shell de comandos . Un intrprete de comandos no es ms que una ventana
sin ningn tipo de decoracin grfica. Los comandos se muestran como texto. No hay ningn icono, y se
puede usar el ratn slo en circunstancias limitadas.
Uuna consola de comandos no es una buena interfaz de usuario para los usuarios ocasionales. Sin embargo,
los usuarios experimentados encuentran que el shell de comandos, es indispensable para muchas tareas.
Vamos a ir poco a poco viendo cmo podemos agilizar nuestras macros implementando comandos de la shell
de Windows wn nuestros cdigos.
Por ejemplo en la siguiente macro vamos a crear un botn al que le vamos a asociar el cdigo para abrir el
bloc de notas:
1.
2.
3.
4.
En tiempo de diseo haga doble click sobre el mismo e inserte entre Private Sub
CommandButton1_Click() y End Sub el cdigo
Dim RetVal
RetVal = Shell(C:\Archivos de programa\Windows NT\Accesorios\Wordpad.exe, 1)
AppActivate RetVal
Salga del modo diseo (clic en el icono escuadra ) vaya a excel y haga clic en el botn. Si lo ha hecho
correctamente se le abrir el bloc de notas.
Analizando el cdigo, lo primero que hemos hecho es declara una variable tipo variant para recoger el nmero
que identifica la tarea del programa que ejecuta la funcin Shell.
Esta funcin tiene adems los argumentos siguientes:
vbHide
vbNormalFocus
vbMinimizedFocus
vbMaximizedFocus
vbNormalNoFocus
vbMinimizedNoFocus
Excel y WebMail
21 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
Como continuacin a la interoperatividad de Excel con los servicios de correos, en el presente post tratar de
explicar como podemos mandar un libro, una hoja o un pequeo texto escrito en una hoja excel, usando
correo webmail.
La primera macro nos va acomprobar el sistema de correo WebMail que tenemos instalado o si no tenemos
ninguno:
Sub sistema_decorreo_instalado()
Select Case Application.MailSystem
Case xlMAPI
MsgBox Est utilizando Microsoft Mail
Case xlPowerTalk
MsgBox El sistema de correos es PowerTalk
Case xlNoMailSystem
MsgBox No tiene ningn sistema de correos instalado
End Select
End Sub
En principio establecemos un flujo de control (Select Case) que va a verificar que clientes de correos tenemos
en el equipo, y esto lo hacemos con la propiedad Application.MailSystem, esta es de slo lectura y soporta
tres constantes xlMAPI que verifica si estamos usando un Internet Message Access Protocol (IMAP) , si
usamos el sistema de comandoz por voz de Microsoft PowerTalk o no tenemos nada instalado.
A continuacin vamos a ver como podramos enviar una copia de la hoja activa por correo webmail, en mi
caso utilizando WebMail de Microsoft 2011:
Sub EnviarHojaPorCorreoElectrnico()
ActiveSheet.Copy
ActiveWorkbook.SendMail Recipients:=fulanito@loquesea.com, Subject:=Envo de hoja de Excel
ActiveWorkbook.Close savechanges:=False
End Sub
Bueno como podr ver no tiene mucha complicacin, hemos utilizado el mtodo SendMail Recipients (algo as
como enviar correo al buzn) y poco ms.
Supongamos que ahora tenemos una hoja con un texto escrito, y desamos enviar ese texto en concreto.
Supongamos que en la celda E1 hemos escrito la direccin del destinatario y en la E2 la del remitente. Aqu
va el cdigo:
Function EnviarMails_CDO() As Boolean
Creo la variable de objeto CDO
Dim Email As CDO.Message
Dim Autentificacion As Boolean
ahora doy vida al objeto
Set Email = New CDO.Message
indicamos los datos del servidor:
Email.Configuration.Fields(cdoSMTPServer) = smtp.gmail.com
Email.Configuration.Fields(cdoSendUsingMethod) = 2
indicamos el nro de puerto. por defecto es el 25, pero gmail usa el 465. hay otro
Email.Configuration.Fields.Item _
(http://schemas.microsoft.com/cdo/configuration/smtpserverport”) = CLng(465)
aqui dejamos en claro si el servidor que usamos requiere o n autentificacin.
1=requiere, 0=no requiere. Para gmail, entonces, 1
Email.Configuration.Fields.Item(http://schemas.microsoft.com/cdo/” & _
configuration/smtpauthenticate) = Abs(1)
segundos para el tiempo maximo de espera. aconsejo no modificarlo:
Email.Configuration.Fields.Item _
(http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout”) = 30
aqui defino como True (verdadera) a la autentificacin para el envo de mails.
Autentificacion = True
ahora configuramos las opciones de login de gmail:
If Autentificacion Then
nombre de usuario
Email.Configuration.Fields.Item _
(http://schemas.microsoft.com/cdo/configuration/sendusername”) = fulanito@gmail.com
contrasea
Email.Configuration.Fields.Item _
(http://schemas.microsoft.com/cdo/configuration/sendpassword”) = micontrasea de correo
destinatario etc. Y para ello debemos indicarle donde puede encontrar la informacin pertinente. Bien pues de
la misma manera que a veces precisamos acudir a una biblioteca a buscar informacin de un tema en
concreto, aqu hacemos lo mismo. Por ello en primer lugar debemos abrir la biblioteca de objetos CDO ,
biblioteca donde se encuentra las referencias que el sistema necesita sobre las interfaces de los programas
de correos. Eso es lo que hacemos con la lnea:
Email.Configuration.Fields.Item _
(http://schemas.microsoft.com/cdo/configuration/sendusername”)
y siguientes.
En muchos casos no es necesario especificar esas lneas ya que CDO utilizara por defecto el gestor de
correo incluido en la mquina.
Siguiendo con los ejemplos, en la siguiente macro vamos mandar las celdas que seleccionemos de una hoja:
Este procedimeinto enva las celdas seleccionadas en el cuerpo del mensaje
Seleccione unas cuantas celdas antes de enviar el mensaje
Sub CDO_enviando_un_rango()
Dim rng As Range
Dim iMsg As Object
Dim iConf As Object
Dim Flds As Variant
Set iMsg = CreateObject(CDO.Message)
Set iConf = CreateObject(CDO.Configuration)
iConf.Load -1
.ScreenUpdating = False
End With
With iMsg
Set .Configuration = iConf
.To = fulanito@gmail.com
.CC =
.BCC =
.From = FULANITO <fulanito@gmail.com>
.Subject = Esto es una prueba
.HTMLBody = RangetoHTML(rng)
.Send
End With
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
Hay que prestar especial cuidado con los firewalls e incluso con los antivirus. Debe verificar que no le estn
bloqueando las salidas.
En esta macro utilizamos una funcin VBA propia de Outlook pero que se traslada mediante CDO a Excel
:HTMLBody = RangetoHTML(rng) es decir es una funcin que convierte a cdigo HTML el rango que hayamos
seleccionado.
FILED UNDER TRABAJANDO CON WEBMAIL TAGGED WITH GMAIL
EXCEL Y OUTLOOK
20 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
En el presente post vamos a examinar como trabajar conjuntamente con Outlook y Excel, implementando
cdigos en VBA. Si bien en la actualidad son cada vez ms los usuarios de servicios de clouding y por ende
correo web, todava los clientes mail ocupan un espacio de uso nada despreciable en muchos ordenadores.
Para automatizar Outlook, primero debe tener acceso a la modelo de objetos de Outlook. Es decir, para
manipular objetos de Outlook, primero debe ser capaz de verlos. En general hay dos maneras de exponer
un modelo de objetos para su aplicacin Excel, conocido como el enlace anticipado y el enlace OLB.
Enlace se refiere a la exposicin del modelo de objetos del cliente a la aplicacin host. En nuestro caso,
eso significa que la exposicin del modelo de objetos de Outlook para nuestra aplicacin en VBA para Excel,
el modelo de objetos de Outlook se almacena en un OLB (biblioteca de objetos) de archivos.
Para poder tener acceso a la librera de objetos de Outlook procederemos de la misma forma que con Word.
Abra el edito VBA y desde la barra de mens Herramientas>Referencias>Microsoft Outlook x.0 (donde x.0
puede ser desde el 9.0 al 14.0, para los ejmplos de este post utilizaremos 14.0).
Vamos a utilizar una macro para ver si se ha establecido correctamente la referencia al objeto. Si todo va bien,
se debe de arrancar Outlook y nos saldr un MsgBox confirmndolo:
Sub probando_referencia()
Dim outlookApp As Outlook.Application
Aunque en posteriores posts tratar el tema de los errores, a fin de poder tener un listado de errores
previsibles en ejecucin desde el editor pulse F1 (ayuda) y busque
Errores interceptables, podr ver y analizar diferentes tipos de errores con el nmero que VBA le asocia.
Algo ms complicado sera automatizar el envo de e-mails desde Excel utilizando Outlook. Bueno para el
nivel de este blogg_curso quizs es algo avanzado, pero intente leer los comentarios y comprender el cdigo:
Sub mandar_rango_por_correo()
declaramos las variables
el rango de origen Source
Dim Source As Range
el libro a enviar como miLibro
Dim miLibro As Workbook
Dim wb As Workbook
nombre de la ruta del fichero temporal
Dim TempFilePath As String
nombre del fichero temporal
Dim TempFileName As String
variables de apoyo para la extensin y formato de fichero
Dim FileExtStr As String
Dim FileFormatNum As Long
variables para crear los objetos aplicacin y correo
Dim OutApp As Object
Dim OutMail As Object
inicializamos las variables
Set Source = Nothing
si hay error salta a la linea siguiente
On Error Resume Next
seleccionamos el rango
Set Source = Range(A1:K50).SpecialCells(xlCellTypeVisible)
desactivamos cualquier controlador de errores
On Error GoTo 0
If Source Is Nothing Then
MsgBox El origen no es un rango o la hoja est protegida. & _
Por favor corrgalo , vbOKOnly
Exit Sub
End If
aceleramos la ejecucin del cdigo
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
aadimos un nuevo libro con una sola hoja en el mismo
de esa forma mandamos una copia del original
Set wb = ActiveWorkbook
Set miLibro = Workbooks.Add(xlWorksheet)
copiamos el origen
Source.Copy
With miLibro.Sheets(1) ahora en la hoja 1
.Cells(1).PasteSpecial Paste:=8 pego el ancho de la columna (a 8)
.Cells(1).PasteSpecial Paste:=xlPasteValues pego los valores
.Cells(1).PasteSpecial Paste:=xlPasteFormats pego el formato
.Cells(1).Select
Application.CutCopyMode = False
End With
utilizo la funcin Environ para recoger una variable de Windows y asigno el nombre
TempFilePath = Environ$(temp) & \
TempFileName = Selection de & wb.Name & _
& Format(Now, dd-mmm-yy h-mm-ss)
segn la versin coloco la extensin del fichero
If Val(Application.Version) < 12 Then
Caso de Excel 2000 2003 .xls
FileExtStr = .xls: FileFormatNum = -4143
Else
Caso de Excel 2007 2010.
FileExtStr = .xlsx: FileFormatNum = 51
End If
entrando con Outlook
Set OutApp = CreateObject(Outlook.Application)
Set OutMail = OutApp.CreateItem(0)
salvo mi fichero
With miLibro
.SaveAs TempFilePath & TempFileName & FileExtStr, _
FileFormat:=FileFormatNum
On Error Resume Next
With OutMail
rellenando los datos del envo
.To = enriquecabell@gmail.com
.CC =
.BCC =
.Subject = Libro de prueba
.Body = Bueno aqu va adjunto el fichero
.Attachments.Add miLibro.FullName
.Send
End With
On Error GoTo 0
.Close SaveChanges:=False
End With
ya como no lo necesitamos nos cargamos los ficheros temporales
Kill TempFilePath & TempFileName & FileExtStr
vaciando variables
Set OutMail = Nothing
Set OutApp = Nothing
poniendo la casa en orden
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub
FILED UNDER EXCEL Y OUTLOOK TAGGED WITH OUTLOOK
Excel y Word
18 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
Todas las aplicaciones Office de Microsoft utillizan el mismo lenguaje VBA; la diferencia entre ellos es su
modelo de objeto. esto facilita que cualquier el acceso entre ellas siempre y cuando estn instaladas.
Para el caso que nos ocupa, cmo acceder a Word mediante excel, precisamos acceder a la biblioteca de
objetos de Word:
biblioteca de objetos
Un archivo con una extensin de nombre de archivo .OLB que proporciona a los controladores de
Automatizacin OLE (como Visual Basic) informacin sobre los objetos de Automatizacin OLE disponibles.
Puede utilizar elExaminador de objetos para examinar el contenido de una biblioteca de objetos y obtener
informacin sobre los objetos que proporciona.
Para acceder a dicha biblioteca podemos hacerlo de dos formas:
Vinculacin previa
El cdigo se ejecuta ms rpido, ya que se realiza una referencia al objeto antes de que se escriba el cdigo.
Para ello debemos aadir la biblioteca a la aplicacin caso de que no est disponible. Para ello:
1.
Seleccionar Herramientas>Referencias.
2.
3.
Clic en Aceptar.
Si no se encuentra la biblioteca es que Word no est instalado. Si encuentra otra versin es que hay otra
versin diferente de Word instalada.
Veamos un ejemplo de cmo abrir un documento Word desde Excel denominado testWord.doc y que lo
tenemos en C:\ existente :
Sub prueba_dos_word()
Cramos una variable para la aplicacin y otro para el documento
Dim wdApp As Word.Application
Dim wdDoc As Document
En el presente post vamos a reproducir un ejemplo prctico de Microsoft de como tratar con datos XML en
Excel.
1.
2.
Agregar una asignacin a una hoja de clculo y a continuacin la llenar con los datos importados.
Cuando aparezca el cuadro de dilogo Abrir XML, haga clic en Utilizar el panel de tareas Origen XML y
enAceptar.
2.
3.
4.
Agregue la asignacin
1.
2.
3.
4.
5.
Guarde el archivo. Esto agregar la asignacin al archivo y enlazar los datos del archivo de origen a
la asignacin.
Ahora ya podr
Seleccionar cualquiera de las celdas asignadas. En el men Datos, elija XML y, a continuacin, haga
clic enImportar.
Use la lista Buscar en para localizar el archivo de ejemplo y haga clic en Importar.
Excel rellenar los campos asignados. Observe que Excel aplica automticamente el formato de lista XML a
los elementos repetitivos (en este caso, los elementos de gasto) en la asignacin.
FILED UNDER XML
XML y Excel
16 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
Una de las ventajas a partir de la versin 2003 de Excel es la mejora en la gestin de datos XML.
XML es un sistema estndar de codificacin de informacin. Los programas que utilizan el formato XML
pueden intercambiar fcilmente sus datos, ya que responden a una misma lgica interna.
Los documentos XML son ficheros de texto que contienen la informacin organizada en forma de rbol: cada
rama puede tener unos atributos propios y servir de base para otras ramas. Adems, los documentos XML se
pueden transformar (por ejemplo, a formato HTML, para mostrar la informacin en una pgina web), o
combinar: un tronco con todas sus ramas puede pasar a ser una rama de otro rbol mayor. Un ejemplo de
documento XML abreviado podra ser:
<juegos>
etiqueta raiz.
Alfabeto
Cmo consigue Excel leer correctamente los datos: existen dos tipos adicionales de archivo que mejoran a los
archivos XML.
Los archivos XSD son archivos de esquema que definen la relacin entre los datos y los requisitos de
validacin de los mismos. Los archivos XSL se denominan transformaciones o soluciones. Una transformacin
define cmo se deberan mapear los campos en el archivo XML en su documento.
Convertir HTML a EXCEL y viceversa con XML
Podemos guardar cualquier archivo xls en formato xlm. Los grficos y los cdigos vba no obstante se
perdern, no as los formatos.
Para abrir un archivo XML:
Sub Abrir_XML()
Dim oWX As Workbook
Set oWX = Workbooks.OpenXML(c:\ejemplo.xml)
End Sub
Dado que la mayora de objetos tienen diversas propiedades, a veces, necesitaremos efectuar varias
acciones sobre un mismo objeto. Si tenemos un objeto con un nombre demasiado largo, a veces, resulta
engorroso tener que escribir una y otra vez dicho nombre para asociarle el mtodo o propiedad que desamos
asignar. A fin de facilitar un poco las cosas VBA nos ofrece utilizar la estructura WithEnd With.
Por ejemplo imagine que deseamos poner una fila entera en negrita, doble subrayado, fuente grande y color
especial, el cdigo prodra ser el siguiente:
Range(A1:K1).Select
Selection.Font.Bold=True
Selection.Font.Size=12
Selection.Font.ColorIndex=5
Selection.Font.Underline=xlUnderlineStyleDoubleAccounting
Podemos reescribirlo con la sintxis expuesta teniendo en cuenta que todo lo que hace referencia al objeto en
s empieza con un punto:
With Range (A1:K1).Font
.Bold=True
.Size=12
.ColorIndex=5
.Underline=xlUnderlineStyleDoubleAccounting
End With
FILED UNDER OBJETOS TAGGED WITH OBJETOS
Un cuadro de lista y un cuadro combinado son controles similares pero con ligeras diferencias y sirven para
permitir al usuario elegir entre varios elementos o insertar el valor que desee en una lista.
Por ejemplo:
Cuadro de lista. Muestra una lista de uno o ms elementos de texto de entre los cuales puede elegir el
usuario.
Ejemplo:
El control CheckBox, o casilla de verificacin, permite elegir una opcin (activada/desactivada, True/False)
que el usuario puede establecer o anular haciendo click.
Si un control CheckBox es dependiente de un origen de datos, al cambiar el valor, ste cambia el valor de su
origen. Un control CheckBox deshabilitado muestra el valor actual, pero est atenuado y no permite realizar
cambios al valor desde la interfaz de usuario.
La propiedad predeterminada de un control CheckBox es Value.
El evento predeterminado de un control CheckBox es Clic.
Control CheckBox. Ejemplo de las propiedades Enabled y Locked
El siguiente ejemplo demuestra las propiedades Enabled y Locked y cmo se complementan entre s. Este
ejemplo expone cada propiedad independientemente con un control CheckBox, para que observe los valores
individuales y combinados. Este ejemplo tambin incluye un segundo control TextBox para que pueda cortar y
pegar informacin entre los controles TextBox y comprueba las actividades admitidas por los valores de estas
propiedades.
Nota Puede copiar la seleccin al Portapapeles utilizando CTRL+C y pegar utilizando CTRL+V.
Para utilizar este ejemplo, copie este cdigo de ejemplo en la parte Declaraciones de un formulario.
Asegrese de que el formulario contiene:
Formularios (Frame)
9 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
Es un contenedor de otros controles. Los agrupa para que resulten facilmente identificables para el usuario.
Para agrupar controles, en primer lugar trace el control Frame y, a continuacin, meta los controles dentro de
Frame. De este modo podr mover al mismo tiempo el Frame y los controles que contiene. Si traza un control
fuera del Frame y, a continuacin, intenta moverlo dentro de ste, el control se colocar sobre el Frame, pero
no pertenecer a el. Es decir, si es un OptionButton este se comportar como si estuviese fuera del Frame,
aunque fsicamente est dentro de el.
Crear un formulario
8 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
Para crear un formulario personalizado abriremos el editor VBA e iremos a insertar->UserForm. Ver como
en la ventana de cdigo aparee ahora un pequeo formulario vaco y aparece el cuadro de herramientas.
A la derecha poedr ver la ventana de propiedades. No obstante si no la visualiza pulse f4 o vaya a men>ver->ventana de propiedades. Tambin puede pulsar sobre el icono correspondiente en la barra de mens.
En dicha ventana podr ver las propiedades inherentes al objeto form, siendo las que ms le ineterese las
siguientes:
Name->indica el nombre con el que vamos a identificar el objeto. Generalmente suele emplearse cualquier
nombre significativo con el prefijo frm. Por ejemplo frmempleados
Caption->el nombre que va a visualizar el objeto en el caso del formulario arriba a la izquierda.
Border/ ->Back Color-> los colores de los bordes y el fondo.
Font->con que tipo de fuente se va a escribir en el formulario.
Enable-> por defecto a true si inicialmente queremos programar que el objeto no se vea debemos cambiarlo
a false.
En el formulario podemos mediante arrastrar y soltar colocar diferentes controles desde la caja de
herramientas o cuadro de controles. Aqu tenemos una lista de los principales controles:
Para definir la posicin de un control, hay que modificar las propiedades left y top que nos indican la distancia
entre el control y la esquina superior izquierda del formulario.
Para una explicacin multimedia de como crear un formulario en VBA Excel puedes ver este vdeo .
FILED UNDER FORMULARIOS TAGGED WITH FORMS
Formularios
7 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
Los formularios en general son documentos impresos o en lnea diseados con un formato y estructura
estndar que facilita la captura, la organizacin y la edicin de la informacin.
Los formularios contienen controles, objetos que muestran datos o hacen que sea ms fcil para los usuarios
entrar o editar los datos, realizar una accin o seleccionar una opcin. En general, los controles facilitan el uso
de los formularios. Algunos ejemplos de controles comunes son los cuadros de lista, los botones de opcin y
los botones de comando. Los controles tambin pueden ejecutar macros asignadas y responder a eventos,
tales como clics del mouse, mediante la ejecucin de cdigo de VBA.
Nombre
del botn
Ejemplo
Etiqueta
Descripcin
Identifica el propsito de una celda
o un cuadro de texto, o muestra
texto descriptivo (como ttulos,
leyendas, imgenes) o breves
instrucciones.
Cuadro de
grupo
Botn
Casilla de
verificacin
Botn de opcin
Cuadro de lista
Cuadro
combinado
Barra de
desplazamiento
Un cuadro de lista de
seleccin nica permite
solamente una eleccin. En este
caso, un cuadro de lista se
asemeja a un grupo de botones
de opcin, a excepcin de que un
cuadro de lista puede controlar
un gran nmero de elementos de
manera ms eficiente.
Un cuadro de lista de
seleccin mltiple permite una
eleccin o elecciones contiguas
(adyacentes).
Un cuadro de lista de
seleccin extendida permite una
eleccin, elecciones y no
contiguas, o inconexas.
desplazamiento. Generalmente, el
usuario tambin puede escribir un
valor de texto directamente en un
cuadro de texto o una celda
asociados.
Control de
nmero
El objeto Range
5 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
Dentro de la colecin de objetos de Excel y tal como haba expuesto anteriormente Range es casi la unidad
bsica con la que podemos trabajar. Y digo casi porque dentro de Range podemos encontrar un objeto como
es Cells (celdas). A qu nos referimos cuando hablamos de Range:
A un conjunto de celdas.
Variant opcional. El nmero de filas (positivo, negativo o cero) que indica el desplazamiento del
rango. Los valores positivos desplazan hacia abajo y los negativos, hacia arriba. El valor predeterminado es 0.
ColumnOffset
desplazamiento del rango. Los valores positivos desplazan a la derecha y los negativos, hacia la izquierda. El
valor predeterminado es 0.
ActiveCell.Offset(0,0)->nos determina la posicin actual
Ejemplo:
Sub ejemplo()
ejemplos del empleo de range y cells
escribo Hola en varias celdas de la hoja 2
Worksheets(Hoja2).Range(A1:B5) = Hola
lo mismo pero en celdas discontinuas
Worksheets(1).Range(F1, G5) = Hi
ahora en la hoja 2
Worksheets(Hoja2).Range(J1, K3, H5) = AAA
ActiveCell.Offset(2, 2) = Me desplazo
End Sub
Si establece una variable de objeto para un objeto Range, puede manipular fcilmente el rango
utilizando el nombre de la variable.
El siguiente procedimiento crea la variable de objeto miRango y, a continuacin, asigna la variable al rango
A1:D5 de la Hoja1 del libro activo. Las instrucciones posteriores modifican las propiedades del rango,
sustituyendo el nombre de la variable por el objeto del rango.
Sub Aleatorio()
Dim miRango As Range
Set miRango = Worksheets(Hoja1).Range(A1:D5)
miRango.Formula = =ALEATORIO()
miRango.Font.Bold = True
End Sub
Utilice la funcin Array para identificar un grupo de hojas. El siguiente ejemplo selecciona tres hojas del libro
activo.
Sub Varias()
Worksheets(Array(Hoja1, Hoja2, Hoja4)).Select
End Sub
Utilice la propiedad Rows o Columns para trabajar con filas o columnas enteras. Estas propiedades devuelven
un objeto Range que representa un rango de celdas. En el siguiente ejemplo, Rows(1) devuelve la fila uno de
la Hoja1. A continuacin, la propiedad Bold del objeto Font del rango se establece en True.
Sub FilaNegrita()
Worksheets(Hoja1).Rows(1).Font.Bold = True
End Sub
La siguiente tabla muestra algunas referencias de fila y columna, utilizando las propiedades Rows y Columns.
Referencia Significado
Rows(1) Fila uno
Rows Todas las filas de la hoja de clculo
Columns(1) Columna uno
Columns(A) Columna uno
Columns Todas las columnas de la hoja de clculo
Para trabajar con varias filas o columnas al mismo tiempo, cree una variable de objeto y utilice el mtodo
Union, combinando varias llamadas a la propiedad Rows o Columns. El siguiente ejemplo cambia a negrita el
formato de las filas uno, tres y cinco de la hoja de clculo uno del libro activo.
Sub VariasFilas()
Worksheets(Hoja1).Activate
Dim miUnin As Range
Set miUnin = Union(Rows(1), Rows(3), Rows(5))
miUnin.Font.Bold = True
End Sub
Mtodo abreviado para hacer referencia a rangos
Podemos utilizar tambin corchetes cuando hacemos referencias a rangos. Utilizando corchetes, as:
En vez de Range(D5) podemos utilizar [D5]
El objeto WorkSheet(hoja)
3 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
El objeto Worksheets representa a las hojas de un libro de Excel. El acceso al mismo puede ser:
Workbooks(Libro1).Worksheets(Hoja1)
Workbooks(Libro2).Worksheets(Hoja1)
Propiedades: a excepcin de name todas son de lectura.
.Name>Nombre de la hoja.
.Used Range>Devuelve un objeto range con el rango de la hoja que tiene datos.
.Activate>activa la hoja
.Delete>Borra la hoja.
El objeto APPLICATION
1 SEPTIEMBRE, 2011 DEJA UN COMENTARIO
El objeto Application representa la aplicacin completa Microsoft Excel. Como todo objeto tiene una serie
depropiedades :
Propiedad
Devuelve
Application.
UserName
OrganizationName
Nombre de la empresa
OperatingSystem
Sistema operativo
Version
Versin de MS Excel
ProductCode
Cdigo de MS Excel
StandardFont
StandardFontSize
DecimalSeparator
ActivePrinter
DefaultFilePath
UserLibraryPath
Ejemplo de macros del objeto Application: en el siguiente ejemplo listamos algunas de las propiedades
descritas.
Sub ejemplo()
Dim i As Byte
Dim primero, ultimo As Variant
Dim uno, dos, tres, cuatro, cinco As String
Dim matriz
uno = Application.UserName
dos = Application.OperatingSystem
tres = Application.ActiveWorkbook.Name
cuatro = Application.Version
cinco = Application.LibraryPath
matriz = Array(uno, dos, tres, cuatro, cinco)
For i = 1 To 5
Cells(i, 1) = matriz(i)
Next
End Sub
Los eventos del objeto Application se suelen dar generlamente al crear o abrir un libro, cuando cambia una
hoja, o se crea o modifica una tabla dinmica.
NewWorkbookSheetActivate
SheetBeforeDoubleClick
SheetBeforeRightClick
SheetCalculate
SheetChange
SheetDeactivate
SheetFollowHyperlink
SheetSelectionChange
SheetPivotTableUpdate
WindowActivate
WindowDeactivate
WindowResizeWorkbookActivate
WorkbookAddinInstall
WorkbookAddinUninstall
WorkbookBeforeClose
WorkbookBeforePrint
WorkbookBeforeSave
WorkbookDeactivate
WorkbookNewSheet
WorkbookOpen
WorkbookPivotTableCloseConnection
WorkbookPivotTableOpenConnection
Tal vez haya escuchado hablar de programacin estructurada, modular,( algo menos ) lgica, funcional,
concurrente, y la que vamos a tratar a continuacin la POO (programacin orientada a objetos).
La programacin estructurada es un tipo de programacin que usa una lgica secuencial en su estructura,
con estructuras de control, secuenciales y repetitivas. Es una forma de programar que tiene sus ventajas e
inconvenientes, pero que, siendo profusamente utilizado en los aos 60 se ha quedado un pco corto a la hora
de cubrir las necesidades de aplicaciones grficas.
No es objeto de este post entrar a describir los otros tipos de programacin, ya que VBA es un lenguaje
orientado a objetos, y por ello nos vamos a centrar en l.
Un objeto, diccionario en mano, es cualquier cosa perceptible por uno o ms sentidos, especialmente algo
que se puede ver y sentir.
Para VBA entendamos que un objeto es cualquier cosa dentro de la aplicacin que puede manipularse de
alguna forma.
Al igual que un vehculo, que como tal es un objeto, dentro del mismo existen otros objetos tales como las
ruedas, las puertas, los retrovisores. Tanto el objeto vehculo como sus objetos inherentes tienen una serie
de propiedades, como modelo, color, motorLos mtodos del coche definen que podemos hacer con l:
frenar, girar,
Los eventos del vehculo nos dice las cosas que le ocurren, si dejamos las luces encendidas y salimos un
pitido nos avisa del hecho, etc.
Si analiza un poco lo descrito observar que existe una organizacin intrnseca en el modelo orientado a
objetos. Es decir se da una jerarqua desde los niveles superiores (ms genricos) hasta los niveles inferiores
ms especficos.
Algunas propiedades tambin realizan la funcin de objetos. Por ejemplo el objeto Application tiene una
propiedad ActiveWindow (nombre de la ventana activa) que a su vez en s misma es un objeto. Esto puede
dar lugar a confunsiones en la sintxis. Por ejemplo:
Application.ActiveWindow.ActiveCell.Font.Italic
Puede abreviarse y quedara as:
ActiveCell.Font.Italic
FILED UNDER OBJETOS TAGGED WITH OBJETOS
A lo largo de los diferentes ejemplos que he ido insertando, he ido adelantando en la prctica algunos
conceptos que, no he expuesto en profundidad. En el presente post, tratar de explicar las posibles
configuraciones que tiene los cuadros de entrada (inputbox) y de mensajes (message-box/MsgBox).
Los primeros permiten introducir datos por teclado. Su sintxis es la siguiente:
InputBox([prompt],[Title],[Default],{xpos],[ypos],[help file,context])
Default :Valor por defecto mostrado en el cuadro de dialogo
Type :Opcional. Expresin numrica que es el nmero de contexto de Ayuda asignado por el autor al tema de
Ayuda correspondiente.El tipo de dato devuelto como se ve en la siguiente tabla.
codigo > SIGNIFICADO
prompt
buttons
title
helpfile
Valores
El argumento buttons tiene estos valores:
VbOKOnly
VbOKCancel
VbAbortRetryIgnore
Muestra los
botones Anular, Reintentar e Ignorar.
VbYesNoCancel
VbYesNo
VbRetryCancel
Muestra los
botones Reintentar y Cancelar.
VbCritical
16
VbQuestion
32
VbExclamation
48
VbInformation
64
VbDefaultButton1
VbDefaultButton2
256
VbDefaultButton3
512
VbDefaultButton4
768
VbApplicationModal
VbSystemModal
4096
VbMsgBoxHelpButton
16384
VbMsgBoxSetForeground
65536
VbMsgBoxRight
524288
VbMsgBoxRtlReading
1048576
Ejemplo:
Sub ejemplo()
Dim pregunta, res1, res2, res3 As String
pregunta = InputBox(Cmo te llamas?, Bienvenido)
res1 = MsgBox(Hola & pregunta, vbExclamation, Bienvenido)
res2 = MsgBox(Hola & pregunta, 64, Bienvenido)
res3 = MsgBox(Hola & pregunta, 64 + vbMsgBoxRight, Bienvenido)
End Sub
Pruebe con las diferentes combinaciones a la hora de programar sus cuadros. Lo interesante es preparar
unos cuantos que fcilmente puede implementar en sus programas.
FILED UNDER FUNCIONES TAGGED WITH FUNCIONES
Existen una gran variedad de funciones de conversin en VBA aunque en la mayora de casos se hace de
forma automtica. Las funciones de conversin se utilizan para cambiar el tipo de dato, de una expresin a fin
de poder operar con ella.
Funcin
Tipo
CBool
Boolean
CByte
Byte
0 a 255
CCur
Currency
922 337 203 685 477,5808 a 922 337 203 685 477,5807
CDate
Date
Double
CDec
Decimal
+/-79 228 162 514 264 337 593 543 950 335 para los nmero
sin dcimales. El rango de numeros para 28 dcimales +/7,9228162514264337593543950335. El nmero ms pequeo
es diferente de cero 0,0000000000000000000000000001
CInt
Integer
CLng
Long
CSng
Single
CStr
String
CVar
Variant
CDbl
En el siguiente ejemplo puede ver una forma de convertir datos de tipo numrico a tipo fecha y viceversa:
Sub convierte()
Dim x As Integer
Dim y As Date
x = Cells(1, 1)
Cells(1, 2) = CDate(x)
y = Date
Cells(3, 1) = y
Cells(3, 2) = CLng(y)
End Sub
FILED UNDER FUNCIONES TAGGED WITH FUNCIONES
Funciones Financieras
26 AGOSTO, 2011 DEJA UN COMENTARIO
VBA tiene una serie de funciones financieras adems de las que ya tiene Excel, que nos ofrece la oportunidad
de crear potentes aplicaciones para finanzas empresariales o personales.
Si desea repasar las funciones financieras de Excel aqu tiene un documento que tal vez pueda ayudarle.
Para estudiar las propias de VBA volvamos al examinador de objetos. Pulse F2 y en el cuadro de bsqueda
inserte FINANCIAL. Inmediatamente pordr ver los miembros de Financial:
Define el formato.
Normalmente 0 (crdito).
Funciones de cadenas
Una expresin de cadena devuelve un valor de datos de tipo String. A continuacin veremos la mayora de
las funciones que trabajan con cadenas, previamente aqu tenemos un cuadro de las funciones de cadenas
en Excel.
Asc(string) =Cdigo de carcter ANSI correspondiente a la primera letra de la cadena.
Chr(cdigo char)= Carcter que corresponde al cdigo ASCII
CStr(expresin)=Convierte una expresin a String.
Format(expresin,formato)=La expresin en el formato especificado
Ejemplos:
Sub prueba()
Dim a As String
a = InputBox(Introduzca una palabra, Funciones de texto)
Cells(1, 1) = Asc(a)
Cells(1, 2) = Chr(Cells(1, 1))
Cells(1, 3) = Format(Date, dd / mmm /yyyy)
Cells(1, 5).NumberFormat = #,##0.00
End Sub
(PD Cuando quiera insertar el smbolo euro presione alt gr+ 5)
Tambin tenemos las siguientes expresiones para formatear expresiones:
FormatCurrency(expresin)=Expresin con formato de moneda.
FormatdateTime(expresin)=Id con formato de fecha y hora.
FormatPercent(expresin)=Id formato de porcentaje.
InStr(comienzo,posicin1,posicin2) Ejemplo: en la celda 1,1 previamente he insertado mi nombre completo,
despus ejecuto el siguiente cdigo.
Sub prueba_dos()
Dim c, b As String
Dim i As Byte
b = Cells(1, 1)
c = InputBox(Inserte la letra a buscar)
MsgBox La letra & c & que Vd busca se encuentra en la posicin & InStr(1, b, c)
End Sub
LCase(expresin)= Convierte a minsculas y Ucase a maysculas. Para poner la primera letra en maysculas
y el resto minsculas usamos StrConv(cadena,vbPoperCase).Ejemplo:
Sub letras()
Dim b As String
b = InputBox(Inserte su nombre)
Cells(1, 1) = b
Cells(2, 1) = LCase(b)
Cells(3, 1) = UCase(b)
Cells(4, 1) = StrConv(b, vbProperCase)
End Sub
Otras funciones de cadenas:
VBA cuenta con funciones matemticas propias que podemos utilizar en nuestros procedimientos:
Abs(nmero)>Valor absoluto
Atn(nmero)>Arcotangente de un nmero
Cos(nmero)>Coseno
Exp(nmero)>nmero e como base de los logaritmos naturales
Fix(nmero)>La pasrte entera de un nmero decimal*
Hex(nmero)>El valor hexadecimal de un nmero
Int(nmero)>Parte entera del nmero*
Oct(nmero)>El valor octal de un nmero
Rnd(nmero)>Nmero aleatorio ente 0 y 1.
Sgn(nmero)>El signo del nmero
Sqr(nmero)>Raiz cuadrada
Sin(nmero)>Seno
Tan(nmero)>Tangente
(*) La funcin Fix(n) nos devuelve la porcin entera del nmero. Si este es negativo, Fix devuelve el primer
entero negativo que es mayor que ese nmero. La funcin Int(n) nos devuelve el primer entero negativo que
es menor o igual que el nmero.
La funcin Rnd(nmero) genera un nmero aleatorio entre 0 y 1 con las opciones siguientes:
Podemos utilizar innumerables funciones dentro de VBA. Tambin se pueden usar las propias de Excel,
llamndolas desde un procedimiento o funcin. Por ltimo podemos crear nuestras propias funciones. Una
posible agrupacin sera la siguiente:
Funciones de comprobacin.
Funciones de cadenas.
Funciones matemticas.
Funciones de comprobacin
Las funciones tienen la particularidad de que nos devuelven un valor. Las funciones de comprobacin, que
son las primeras que voy a abordar son muy tiles al permitirnos validad o comprobar los tipos de datos, bien
los insertados en una celda o los introducidos por teclado.
Lista de Funciones de Comprobacin.
IsNumric(Expresin). Comprueba si expresin tiene un valor que se puede interpretar como numrico.
IsDate(Expresin). Comprueba si expresin tiene un valor que se puede interpretar como tipo fecha.
IsEmpty(Expresin). Comprueba que expresin tenga algn valor, que se haya inicializado.
IsError(Expresin). Comprueba si expresin devuelve algn valor de error.
IsArray(Expresin). Comprueba si expresin (una variable) es un array o no.
IsObject(Expresin). Comprueba si expresin (una variable) representa una variable tipo objeto.
IsNull(Expresin). Comprueba si expresin contiene un valor nulo debido a datos no vlidos.
Funcin IsEmpty
Nos comprueba si una celda o rango est vaco, no hay datos.
Sintaxis
IsEmpty(expresin)
El argumento expresin requerido es un tipo de datos Variant que contiene una expresin de cadena o
unaexpresin numrica. Sin embargo, ya que la funcin IsEmpty se utiliza para determinar si las variables
individuales estn inicializadas, el argumento expresin es generalmente un nico nombre de variable.
Ejemplo:
Comprobamos si en la celda B1 de la hoja activa hay datos:
Sub ejemplo()
Dim mensaje As String
If IsEmpty(ActiveSheet.Range(B1)) Then
MsgBox Prompt:=la casilla B1 est vaca, Title:=ERROR
Else
mensaje = ActiveSheet.Range(B1)
MsgBox En la casila B1 hay este dato : & mensaje
End If
End Sub
Es complicado utilizar utilizar IsEmpty con datos recogidos por teclado mediante la funcin InputBox. Y ello es
as porque esta funcin devuelve datos de tipo variant o sea cualquier expresin que se pueda evaluar a
datos numricos, de cadena o de fecha. Para entenderlo mejor modifique el cdigo anterior por este otro:
Sub ejemplo2()
Dim mensaje
mensaje = InputBox(Usuario)
If IsEmpty(mensaje) Then
MsgBox Prompt:=usuario?, Title:=ERROR
Else
MsgBox Hola & mensaje
End If
End Sub
Como comprobar la funcin IsEmpty no evala la cadena vaca, ya que InputBox en ese caso devolvera un
cero.
Funcin IsNumeric/Funcin IsDate
Nos comprueba si una expresin se evala como un nmero, para IsNumeric o fecha para IsDate Por ejemplo
evaluamos si en la celda activa hay valores numricos:
Sub comprueba()
If Not IsNumeric(ActiveCell.Value) Then
MsgBox Error
Else
MsgBox Los valores son numricos
End If
End Sub
Funcin IsObject
La funcin IsObject es til solamente para determinar si un tipo de datos Variant es de VarType vbObject.
Ejemplo:
Sub Obj()
Dim R As Range
Si la variable R es Nothing es que no ha sido asignada, no se puede trabajar con ella
If R Is Nothing Then
MsgBox Prompt:=La variable Objeto no ha sido asignada, Buttons:=vbOK, _
Title:=Error
Else
R.Value = Hola
End If
End Sub
Aqu un ejemplo resumen:
Sub comprueba()
Dim cadena As Variant
cadena = ActiveCell.Value
If IsEmpty(cadena) Then
MsgBox La celda no contiene datos
ElseIf IsNumeric(cadena) Then
MsgBox La celda contiene datos numricos
ElseIf IsDate(cadena) Then
MsgBox La celda contiene datos tipo fecha
ElseIf Not IsArray(cadena) Then
MsgBox La celda no es un array
Else
MsgBox No hay nada para evaluar
End If
End Sub
FILED UNDER FUNCIONES TAGGED WITH FUNCIONES
Podemos anidar condiciones una dentro de otras. En un bucle ifthen podemos insertar otro y, as tambin
podemos hacerlo con Fornext. En l siguiente ejemplo vamos a sacar en las primeras 25 filas de forma
aleatoria nmeros en tre el 100 y el 999, despus vamos a insertar un bucle anidado que nos va a colorear en
rojo y negrita la fuente, para aquellos valores que superen el valor 500. Observe el cdigo y vea cmo se
generan los nmeros aleatorios:
Sub ejemplo()
declaro variables
Dim numaleatorio As Integer
Dim i As Byte
desde la fila 1 a la 25 inserto nmeros aleatorios del 100 al 999
For i = 1 To 25
numaleatorio = Int((999 100 + 1) * Rnd + 100)
Cells(i, 1) = numaleatorio
Next
voy a cambiar a rojo y negrita los valores que pasen de 500
For i = 1 To 25
If Cells(i, 1) > 500 Then
Cells(i, 1).Font.ColorIndex = 3
Cells(i, 1).Font.Bold = True
End If
Next i
End Sub
He separado el cdigo para hacerlo ms comprensible, evidentemente se puede hacer de otra forma. Dentro
del bucle ForNext se sita la estructura condicional. Si la condicin se cumple en una celda, esta cambia de
color. El valor colorindex va del 1 al 56 y representa la paleta de colores en VBA. Aprovechando el tema
intente hacer la prctica 6 puede serle de utilidad.
FILED UNDER BUCLES DE REPETICIN
Bucles de repeticin:DoLoop
15 AGOSTO, 2011 DEJA UN COMENTARIO
Este bucle comprueba que se ejecute una serie de instrucciones hasta que se cumpla una condicin
determinada. Por ejemplo en el siguiente cdigo forzamos que se escriban los nmeros desde el 1 al 11, para
ello usamos una variable contador que la inicializamos en 0 y a partir de aqu le sumamos 1 hasta que llege al
11.
Sub ejemplo_Do_Loop()
Dim i As Byte
i=0
Do Until i = 11
i=i+1
Cells(i, 1) = i
Loop
End Sub
Una variante de este bucle sera Dowhileloop
Sub ejemplo_Do_while_loop()
Dim i As Byte
i=0
Do While i < 20
i=i+1
Cells(i, 1) = i
Loop
End Sub
FILED UNDER BUCLES DE REPETICIN
Los bucles de repeticin nos permite efectuar varias veces una serie de instrucciones incluidas en un
procedimiento.
El primero que vamos a analizar es el bucle Fornext. Su sintxis sera la siguiente:
For variable = inicio To fin salto
Next variable
Ejemplo vamos a realizar un ejercicio que nos presente por pantalla los cuadrados de los nmeros 1 al 5.
Sub cuadrado()
Ejemplo de bucle for..next
definimos la variable contador
On Error Resume NextDim x, y As Byte
Iniciamos el bucle desde 1 hasta 5
For x = 1 To 5
y=x*x
MsgBox El cuadrado de & x & es & y
Next
End Sub
Si no se dice nada, la variable comienza en el nmero que le hallamos maracado como inicio e ira recorriendo
el bucle de 1 en 1. Si deseamos que lo haga por ejemplo de dos en dos, tenemos que especificarlo con la
expresinstep. En el ejemplo citado supongamos que deseamos hacer el mismo clculo pero con los nmeros
pares del 1 al 12:
Sub cuadrado_par()
Dim x, y As Byte
For x = 2 To 12 Step 2
y=x*x
Sintaxis reservada
12 AGOSTO, 2011 DEJA UN COMENTARIO
Ya mencion en otro post que podemos utilizar cualquier nombre para definir nuestras variables o mdulos,
con la nica excepcin de no utilizar aquellas que son propias de la sintxis de VBA.
en una base de datos de personas, el objetivo es que Excel diga la clasificacion del
porcentaje de grasa de una persona, el cual se obtiene por un numero que da una balanza.
El problema es que son muchas condicionales!
Si es mujer de 18-39 aos: 0-21 bajo en grasa;22-33 normal;34-39 alto en grasa;ms de 39
obesidad.
Si es mujer de 40-59 aos:0-23 bajo en grasa;24-34 normal;35-40 alto en grasa; ms de 40
obesidad.
Si es mujer de 60-69 aos: 0-24 bajo en grasa;25-36 normal;37-42 alto en grasa; ms de 42
obesidad.
Si es hombre de 18-39 aos: 0-8 bajo en grasa;9-20 normal;21-25 alto en grasa;ms de 25
obesidad
Si es hombre de 40-59 aos: 0-11 bajo en grasa;12-22 normal;23-28 alto en grasa;ms de 28
obesidad
Si es hombre de 60-99 aos: 0-13 bajo en grasa;13-25 saludable;26-30 alto en grasa; ms de
30 obesidad.
Si bien podramos optar por desarrollar la frmula anidando repetidamente la funcin SI condicional, es cierto
que slo lo podramos implementar con versiones superiores a Excel 2003, ya que en esta o anteriores nuesto
mximo de anidaciones era de siete
Recordemos que para crear una funcon personalizada o UDF debemos acceder al Editor de
VBA presionando Alt+F11, y ya dentro del Editor insertar un modulo (Men Insertar > Modulo), haciendo doble
clic en el mdulo copiaremos el siguiente cdigo:
Cuando tenemos que verificar muchas condiciones la estructura ifelse puede ser un tanto pesada.
Con SelectCase podemos conseguir una estructura ms clara y legible. Su sintxis es la siguiente:
Select [ Case ] testexpression [ Case expressionlist [ statements ] ] [ Case Else [ elsestatements ] ] End Select
Ejemplo:
Sub usuarios()
Dim usuario As String
usuario = InputBox(Ingrese su nombre)
Select Case usuario
Case Hugo
MsgBox Bienvenido Hugo
Case Luis
MsgBox Bienvenido Luis
Case Else
MsgBox Lo siento no ests registrado
End Select
End Sub
FILED UNDER ESTRUCTURAS DE DECISIN
Los pequeos programas que hemos escrito hasta ahora, se han limitado a ejecutar una serie de
instrucciones de forma secuencial, una detrs de otra.
En este post vamos a abordar el estudio de las estructuras de decisin, las cuales evalan si se cumplen o no
una o varias condiciones antes de ejecutar la sentencia.Comenzamos con if__then__else:
Veamos su estructura:
Por ejemplo evaluaremos la edad del usuario para que pueda acceder a la aplicacin:
Sub ejemplo7()
Dim edad As Byte
solicitamos la edad del usuario por teclado
edad = InputBox(Qu edad tienes?, Edad)
si es mayor de edad
If edad >= 18 Then
entonces bienvenido
MsgBox Bienvenido
en caso contrario
Else
mensaje y fin
MsgBox Lo siento no puede acceder a la aplicacin
cerramos Excel
Application.Quit
End If
End Sub
FILED UNDER ESTRUCTURAS DE DECISIN TAGGED WITH E, ESTRUCTURAS DE DECISIN
OPERADORES
2 AGOSTO, 2011 DEJA UN COMENTARIO
Tienen una finalidad bsica en cualquier lenguaje de programacin y ms an en VBA. Nos van a permitir
realizar operaciones aritmticas, lgicas, de concatenacin y de comparacin. Haz clic para ver la
presentacin.
OPERADORES
FILED UNDER OPERADORES TAGGED WITH OPRADORES
Arrays dinmicos
31 JULIO, 2011 DEJA UN COMENTARIO
Ya he hablado anteriormente de los arrays. La mayora de los lenguajes de programacin utilizan los arrays
que, recordemos es un conjunto de elementos que tienen en comn un nombre aunque entre ellos son
diferentes. Por ejemplo el array dgitos estara compuesto por las cifras 0,1,2,3,4,5,6,7,8 y 9. Cada uno de
ellos irn referidos con un ndice. As supongamos el array compuesto por los meses del ao:
Al tratarse de un nmero de elementos fijo estaramos hablando de un array esttico que, en este
caso consta de 12 elementos.
Podr observar que entre parntesis he colocado 11 y no 12, ya que, por defecto los subndices de
los arrays de VBA empiezan en 0 (que es el lmite inferior de la matriz). Si deseamos que comience en 1
en vez de en 0, incluiremos antes del primer array y antes del primer procedimiento las expresin:
Option Base 1
Ahora bien que haramos si no conociramos de antemano la dimensin de nuestra array? Para ello
podemos declarar un array dinmico dejando el parntesis en blanco en la sentencia Dim:
Dim miArray( ) as Double
Una vez que conozcamos el nmero de elementos que necesitamos usaremos la sentencia Redim para
sealar el nmero de subndices necesarios. Por ejemplo:
Redim mi Array(102)
Veamos un ejemplo sencillo para entender los conceptos mencionados:
Vamos a declarar una matriz unidimensional de 3 elementos compuesto por los tres primeros dias de la
semana, y haremos que no los presente por pantalla:
Option Explicit
Sub asignandoarray()
Dim miArray(3) As String
miArray(0) = lunes
miArray(1) = martes
miArray(2) = mircoles
MsgBox miArray(0) & & miArray(1) & & miArray(2)
End Sub
Ahora redimensionaremos el array para introducir el jueves y el viernes:
Sub redimarray()
Voy a redimensionar la array anterior para incluir el jueves y el viernes
ReDim miArray(5)
miArray(0) = lunes
miArray(1) = martes
miArray(2) = mircoles
miArray(3) = jueves
miArray(4) = viernes
MsgBox miArray(0) & & miArray(1) & & miArray(2) & & miArray(3) & & miArray(4)
End Sub
Si deseamos no tener que volver a escribir el mismo procedimiento podemos incluir datos con la expresin
Redim preserve(el nmero siguiente en el ndice)
Sub asignandoarray2()
ReDim miArray(3)
miArray(0) = lunes
miArray(1) = martes
miArray(2) = mircoles
ReDim Preserve miArray(3)
miArray(3) = jueves
MsgBox miArray(0) & & miArray(1) & & miArray(2) & & miArray(3)
End Sub
FILED UNDER ARRAYS
El cdigo que escriba en un proyecto de Visual Basic aparecer siempre en un mdulo. Un mdulo es un
archivo de proyecto, pudiendo ser un mdulo de formulario, de clase o de carcter general como vimos en el
captulo anterior. En cada mdulo, el cdigo se divide en dos secciones: declaraciones y procedimientos.
Los procedimientos son unidades de cdigo como pequeos programas, escritos para realizar funciones
determinadas, con un propsito bien definido. En cualquier mdulo, el programador dispone de una seccin
especial llamada general en las que se sitan las declaraciones y en la que se puede incluir otros
procedimientos creados por el programador En el apartado declaraciones se puede introducir las constantes,
variables y tipos de datos que necesite en su aplicacin. (Todos estos conceptos sern tratados a lo largo del
curso).
Los procedimientos pueden tener parmetros, especificados entre partentesis que le permiten comunicar al
procedimiento alguna informacin que necesite o que sea el propio procedimiento quien devuelva algn valor.
En un mdulo de formulario el cdigo que se sita se refiere tanto a dicho formulario como al resto de objetos
que estn dibujados en l. En este tipo de mdulos cabe destacar los procedimientos de evento que se
encargan de dar una respuesta programada a los eventos que ocurren en la aplicacin.
Si has escrito cdigo para algn procedimiento de evento, ste aparece en negrita en la lista de procedimiento
de la ventana de cdigo. El cdigo de carcter general o que puede compartir en ms de un proyecto, se sita
en un mdulo general. El cdigo que aparece en este tipo de mdulos no se relaciona con un objeto
determinado, sino que tiene carcter general. En los mdulos generales no se pueden incluir procedimientos
de evento como en el caso de los mdulos de formulario.
Es conveniente aadir comentarios a las lneas de cdigo que escribas, de esta forma podrs entender los
programas aunque haga tiempo que los escribiste. Para aadir un comentario en una lnea se utiliza el
carcter (apstrofe).
Objetos en Visual Basic
Un objeto en Visual Basic se caracteriza por tres componentes: propiedades, mtodos y eventos. Las
propiedades son aquellas caractersticas o atributos que permiten establecer el htmlecto de un objeto como el
color, tamao, posicin, etc O el estado del mismo: activo, maximizado, etc
Existen propiedades que slo estn disponibles en tiempo de diseo y otras que slo estn disponibles en
tiempo de ejecucin. Los mtodos son pequeos programas que actan sobre un determinado objeto y que
establecen su comportamiento. As un objeto puede moverse, ocultarse, etc Puedes utilizar cualquier
mtodo que forme parte del objeto.
Los eventos son las situaciones que se producen y que nos interesan identificar para establecer algn tipo de
de respuesta por parte del objeto. As, puedes hacer click sobre un determinado objeto, creando de esta forma
un evento reconocible por el objeto. Que suceda algo o no como respuesta a este evento depender de que
hayas programado alguna accin en el correspondiente procedimiento de evento.
Establecer propiedades
Cuando insertas objetos en un formulario tienes que establecer algunas propiedades que presenta. Las
propiedades son aquellas caractersticas propias del objeto que hacen que se distingan de otro objeto. En una
aplicacin Windows podemos distinguir diversos tipos de ventanas, aunque lo normal es identificar una
ventana inicial que se puede maximizar o minimizar y uno o ms cuadros de dilogo cuyo tamao suele ser
fijo. Sin embargo, debes darte cuenta que las barras de herramientas tambin son ventanas de una
aplicacin. . Normalmente la ventana inicial o de arranque ser la que presente el men principal, formado por
Font: Establece las caractersticas de los objetos de texto que se siten en el formulario.
Left, Top, Height, Width: Establecen la posicin del formulario en la pantalla as como las
dimensiones.
Todas esta propiedas estn disponibles en tiempo de diseo travs de la ventana de propiedades. En tiempo
de ejecucin se puede cambiar o consultar el valor de algunas propiedades que slo tienen sentido en el
tiempo de desarrollo.
Convencin para nombrar objetos en Visual Basic
OBJETO
OBJETO ESPAOL
PREFIJO
Form
Formulario
frm
CheckBox
Casilla de verificacin
chk
ComboBox
Cuadro combinado
cbo
Data-bound combobox
dbc
Command Button
Botn de comando
cmd
Data
Control de datos
dat
dir
drv
fil
Frame
Marco
frm
Grid
Rejilla
grd
Data-bound grid
dbg
Horizontal scrollbar
hsb
Image
Imagen
img
Label
Etiqueta
lbl
Line
Linea
lin
OLE Container
Contenedor OLE
ole
PictureBox
Cuadro de imagen
pic
Shape
Forma
shp
Text Box
Cuadro de texto
txt
Timer
Temporizador
tmr
vsb
Utilizar Mtodos
Una vez se ha establecido la parte estructural del formulario, se pasa a programar el comportamiento que
debe seguir, de forma que cumpla con el objetivo para el que desees crearlo, utilizando los mtodos.
Un mtodo es un componente ms de del objeto, que puede ser utilizado directamente. Para ello debes llamar
al mtodo e indicarle sobre qu objeto deseas aplicarlo, que deber admitirlo.
La sintaxis en este caso debe ser: NombreObjeto.NombreMetodo[par1,,parn], donde la lista de parmetros
[par1,parn] es opcional de cada mtodo.
Un ejemplo es:
Si quieres mostrar un formulario llamado frmPrimero la sintaxis ser:
frmPrimero.Show 1
El valor 1 nos indica que aparecer de forma modal y si el valor es 0 aparecer de forma no modal.
Entender los eventos
El conjunto de eventos est predefinido en Visual Basic por lo cual no puedes crear nuevos eventos para los
objetos. El conjunto de evento reconocibles por un objeto est ligado con los procedimientos de evento. Estos
procedimientos son unidades de cdigo que le permiten especificar la respuesta que debe dar un objeto ante
la ocurrencia de un evento que puede reconocer. La definicin del procedimiento de evento tiene la siguiente
forma:
Algo que normalmente me suelen preguntar mis alumnos es la diferencia entre mdulos y procedimientos en
VBA. Un mdulo se utiliza para recopilar bajo un nombre un conjunto de declaraciones, instrucciones y/o
procedimientos. Aplicado al ejemplo de nuestra primera macro Hola Mundo, el mdulo lo podamos titular
Sub saludo() Sub de subrutina, el nombre de nuestro mdulo
Dim saludo As String declaracin de nuestra variable
saludo = MsgBox(Hola Mundo, vbCritical, Mi saludo) instruccin
End Sub
Ahora qu es un mdulo de clase? Es una plantilla con la que crear objetos.
Definir todas las caractersticas que quisieramos que nuestro objeto final tuviera. Por ejemplo: podemos
tener una clase llamada clsEmpleados en el cual deseamos tener todas las caractersticas con respecto a un
empleado. Como propiedades podriamos definir: nombre, apellidos, domicilio, edad, casado, sueldo,
fechaIngreso, Antiguedad, etc. Como mtodos podriamos tener: ActualizarDatos o GuardarCambios (donde
cambios a las propiedades anteriores se grabaran fisicamente en una base de datos), ValidarDatos (donde se
valida los datos siempre y cuando haya habido cambios en las propiedades segun una variable privada
Cambios)
Un mdulo de clase:
Los mdulos de clase no presentan una interfaz grfica al desarrollados tal y como lo hacen las
formas o formularios. En los formularios puedes colocar visualmente un botn, una lista, un texto,
etc. Los mdulos de clase solo contiene cdigo que definen las caracteristicas del objeto.Si se
desea presentar una ventana informativa (como un Acerca de) u otro formulario, este puede
pertenecer a un proyecto ActiveX DLL y mandarlo llamar mediante un mtodo
(como MostraAcercaDe) que expone alguna clase dentro del proyecto.
De acuerdo a la configuracin de las propiedades de la clase se pueden crear varias instancias u objetos de
una misma clase. Esto es, la propiedad Instancing de un mdulo de clase indica como se trataran los objetos
creados utilizando un mdulo de clase determinado. Tenemos la opcinde que sea una clase Privada lo cual
significa que no se puede instanciar directamente por otro programa, solo el proyecto ActiveX DLL o ActiveX
Exe que lo contiene una copia u objeto de este tipo de clase.
Initialize: ocurre cuando se crea una instancia de una clase. Se usa, generalmente para inicializar
cualquier dato usado por la instancia de una clase en el cdigo.
Terminate: ocurre cuando toda referencia a una instancia de una clase son removidas de memoria al
establecer todas las variables que la refieren a un objeto a Nothing o cuando la ultima referencia al el
objeto se encuentra fuera de alcance. Usado generalmente para limpiar la memoria de objetos creados
dentro de esta instancia y generar un error si hay alguna anomala o guardar alguna informacin del
objeto, etc.
No se puede utilizar el metodo o la propiedad de una clase si no se tiene una instancia de la misma o una
referencia al componente que la contiene si la clase esta configurada como Instancing = PublicNoCreatable.
Veamos un ejemplo:
1.
2.
3.
Arrays
26 JULIO, 2011 DEJA UN COMENTARIO
Supongamos que precisamos referenciar los datos de una cartera de clientes. Tal vez precisemos almacenar
informacin para cada uno de los clientes acerca de su nombre, apellidos, direccin, edad,etc. Esto implicara
la declaracin de una variable por cada concepto y por cada cliente. Adems de la perdida de tiempo, es por
tal motivo que recurrimos a las Matrices o Arrays.
Un array es un conjunto de datos del mismo tipo ordenados en forman lneal uno despus de otro. Los
componentes de un array se han de referenciar por medio del nombre del array y un ndice de desplazamiento
para indicar el componente deseado.
Como ejemplo prctico vamos a realizar este sencillo ejercicio que va a consistir en obtener los productos
cruzados de los primeros 10 nmeros naturales. Para ello vamos a realizar una macro que nos escriba los 10
primeros nmeros en la fila 1 y en la columna A para despus efectar el producto.
1.
2.
3.
4.
Sub tabla_multiplicar()
Dim i, j As Byte
Dim myarray As Variant
myarray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Range(a1:a10).Value = Application.WorksheetFunction.Transpose(myarray)
Range(a1:j1).Value = myarray
Range(a1:a10).Font.ColorIndex = 5
Range(a1:j1).Font.ColorIndex = 5
For i = 1 To 10
For j = 1 To 10
Cells(i, j) = Cells(1, j) * Cells(i, 1)
Next j
Next i
End Sub
Como se habr podido observar despus de declarar dos variables byte, la i y la j, hemos declarado nuestra
matriz con el nombre de myarray y tipo Variant. En principio todos los elmentos de un array deben ser del
mismo tipo, el hecho de declararlos de tipo Variante nos facilita mezclar elementos de diferente tipo e incluso
incluir otras arrays. Seguidamente hemos definido los elementos de nuestra matriz con la siguiente
declaracin:
myarray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Con la siguiente lnea invocamos una funcin de Excel la transposicin de matrices. O sea intercambiar filas
por columnas:
Range(a1:a10).Value = Application.WorksheetFunction.Transpose(myarray)
Con ello conseguimos escribir en forma de columna nuestra matriz fila. A continuacin insertamos los valores
de la misma matriz en la fila 1
Range(a1:j1).Value = myarray
Formateamos un poco dndole color azul a la fuentes de la 1 fila y columna y despus insertamos un bucle
para efectar los productos cruzados. No se preocupe por ese fragmento de cdigo lo entender cuando
tratemos las estructuroas de decisin.