Sie sind auf Seite 1von 96

Anlisis 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:

Su funcionamiento es muy simple:

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.

Con las opciones Modificar/Eliminar podemos editar o eliminar el escenario seleccionado.

FILED UNDER SIN CATEGORA TAGGED WITH ESCENARIOS

Introduccin a las herramientas de Macros y VBA en Excel 2010


25 JULIO, 2012 DEJA UN COMENTARIO

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.

Abra el men Archivo y seleccione Opciones en la barra de navegacin izquierda.

En el cuadro de dilogo Opciones de Excel, de la navegacin de la izquierda,


seleccione Personalizar cinta de opciones.

En el cuadro de lista derecho, seleccione la casilla de verificacin junto a la ficha Programador.

Para volver a Excel, haga clic en Aceptar.

Ahora debera aparecerle la pestaa Programador en el men:

Los iconos utilizados para grabar y reproducir macros VBA en el grupo de cdigo en la ficha del desarrollador:

Icono Visual Basic Se abre el Editor de Visual Basic.


Icono Macros Muestra el cuadro de dilogo Macro, donde se puede optar por ejecutar o editar una macro
de la lista de las macros.
Icono Grabar macro Comienza el proceso de grabacin de una macro.
Con el icono de referencia relativa intercambiamos entre el uso de la grabacin relativa o absoluta.
Icono de seguridad de macros se accede al Centro de confianza, donde se puede optar por permitir o no
permitir las macros para ejecutar en este equipo.
FILED UNDER SIN CATEGORA TAGGED WITH MACRO, VBA, VISUAL BASIC

Herramientas bsicas II
25 JULIO, 2012 DEJA UN COMENTARIO

Proteger celda, hojas y libros.


Un aspecto importante en Excel es su carcter manipulativo. Los usuarios pueden modificar datos para su
anlisis posterior, aunque en ocasiones se plantea la necesidad de que ciertos datos no puedan manipularse.
Para ello se establece la posibilidad de bloquear, el libro, determinadas hojas o determinadas celdas.
Realmente por defecto todas las celdas estn protegidas o bloqueadas para que no sufran cambios, pero no
nos damos cuenta ya que la hoja no est protegida, para que realmente se bloqueen las celdas antes hay que
proteger la hoja de clculo.
Para desbloquear las celdas:
Seleccionar el rango de celdas que queremos desbloquear para poder realizar variaciones.
1.

Seleccionar la pestaa Inicio.

2.

Hacer clic sobre la flecha que se encuentra bajo la seccin Fuente.

3.

Hacer clic sobre la pestaa Proteger.

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.

Recordemos como se proceda en 2003:


1. Para proteger toda una hoja de un libro (archivo) de excel, slo tenemos que ir directamente al
men Herramientas/Proteger/Proteger hoja.
Se abrir la siguiente ventana:

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.

Utilizacin del condicional


Si deseamos establecer una accin sobre una celda si cumple una condicin podemos utilizar las funciones
lgicas. Por ejemplo observe la siguiente tabla:

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.

Buscar objetivo con VBA


En alguna ocasin se nos puede presentar la necesidad de programar la funcin buscar objetivo con VBA.
Para ello debemos utilizar la notacin GoalSeek. Al objeto de conocer mejor su uso lo voy a explicar con el
siguienteejemplo, sobre el que adems profundizar un poquito ms en el uso del formato condicional.

Imaginemos un envasador de caf que presenta los siguientes datos en su cuenta analtica:

Precio coste del kg de caf >13.95

Costes directos por kg> 0.75

Costes indirectos por kg >0.25

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

Range(I25).GoalSeek Goal:=18.4, ChangingCell:=Range(E23)


End Sub
Las correspondencias de la sintxis en VBA con la funcin buscar objetivo es la siguiente:
Range(I25).GoalSeek>Definir la celda
Goal:=18.4 >Con el valor (en nuestro caso 18.4)
ChangingCell:Range(E23)>Para cambiar la celda (en el ejemplo la correspondiente a los costes directos
la E23).
Una vez insertado procedemos a configurar los escenarios Margen y Mixto de forma similar al anterior:
Escenario margen
Private Sub CommandButton3_Click()
Range(E22) = 15.07
Range(e24) = 0.26
Range(E23) = 0.75
Range(e26) = 0.15
Range(I25).GoalSeek Goal:=18.4, ChangingCell:=Range(E26)
End Sub
Escenario Mixto
Private Sub CommandButton4_Click()
Range(E22) = 15.07
Range(e24) = 0.26
Range(E23) = 0.70
Range(I25).GoalSeek Goal:=19, ChangingCell:=Range(E26)
End Sub
Para rematar podemos establecer un conjunto de iconos por ejemplo flechas que nos permitan visualizar la
evolucin que van teniendo los datos que analizamos respecto a una situacin anterior.
Si escogemos el escenario Costes, seleccionamos la celda E23. Vamos a Inicio->Formato condicional
>Nueva regla nos saldr el cuadro siguiente:

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.

Seleccione la celda B12.

2.

Vaya a Insertar>Minigrfico de columna>

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

Aadir barra de errores a los grficos


17 JULIO, 2012 DEJA UN COMENTARIO

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

Representamos los datos como grfico de dispersin XY:

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

Utilizacin de caracteres especiales en grficos y hojas.


16 JULIO, 2012 DEJA UN COMENTARIO

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.

Ejemplos de la funcin CARACTER


La funcin CARACTER puede ayudarnos a hacer uso de caracteres especiales o smbolos dentro de alguna
celda como pueden ser los saltos de lnea o encontrar alguna letra del alfabeto.

Agregar un salto de lnea


Cuando necesitamos agregar dos cadenas de texto que incluyan un salto de lnea entre ellas podemos utilizar
la funcin CARACTER (10), que representa precisamente el salto de lnea. Observa cmo la celda C2 hace la
unin de las cadenas de texto de la celda A1 y B1 pero introduce un salto de lnea entre ambas.
Para ver reflejado el salto de lnea debemos ir al cuadro de dilogo Formato de celdas (CTRL + 1) y
seleccionar la opcin Ajustar texto que se encuentra en la pestaa Alineacin.

Encontrar una letra del alfabeto


Si queremos saber rpidamente cual es la letra 10 del alfabeto podemos utilizar la funcin CARACTER que
nos dar el resultado inmediato sin necesidad de ir letra por letra.
Antes de mostrar el ejemplo debemos saber que la letra A (mayscula) tiene asociado el cdigo 65 y de esta
manera podemos imaginar que la primera letra del alfabeto es lo mismo que 64 +1, la segunda letra del
alfabeto ser 64 +2, la tercera 64 + 3 y as sucesivamente. Si necesitamos conocer la dcima letra del
alfabeto utilizaremos la frmula CARACTER(64 + 10)
Y cmo sera con VBA: Para insertar la letra c por ejemplo en la celda activa>
ActiveCell.FormulaR1C1 = =CHAR(64+3)
FILED UNDER SIN CATEGORA

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:

Add: para aadir una nueva regla de validacin a un rango de celdas.

Modify: cuando deseamos modificar las mismas

Delete: para eliminarlas.

A su vez el evento Add contiene una serie de argumentos:


Type (tipo de validacin) es un argumento obligatorio con el que especficamos que tipo de validacin vamos
a aplicar, pudiendo escoger entre las siguientes:

xlValidateCustom (validacin personalizada)

xlValidateDate(para fechas)

xlValidateDecimal (slo nmeros decimales)

xlValidateInputOnly (slo entradas determinadas)

xlValidateList (mediante listas)

xlValidateTextLength (texto de un determinado tamao)

xlValidateTime (slo formatos horarios)

xlValidateWholeNumber ( para no admitir celdas vacas)

Otros argumentos son:


AlertStyle

XlDVAlertStyle opcional. El estilo de alerta de validacin.

XlDVAlertStyle puede ser una de estas constantes XlDVAlertStyle.


xlValidAlertInformation
xlValidAlertStopxlValidAlertWarning
Operator

XlFormatConditionOperator opcional. El operador de validacin de datos.

XlFormatConditionOperator puede ser una de estas constantes XlFormatConditionOperator.


xlBetween
xlEqualxlGreaterxlGreaterEqualxlLessxlLessEqual
xlNotBetween
xlNotEqual
Formula1

Variant opcional. La primera parte de la ecuacin de la validacin de datos.

Formula2

Variant opcional. La segunda parte de la validacin de datos

cuando Operator es xlBetween oxlNotBetween; de lo contrario, se omite este argumento.


De esta forma, nuestra macro quedara como sigue:
Sub val()
With Range(a3).Validation

.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

Otras funciones estadsticas


21 NOVIEMBRE, 2011 DEJA UN COMENTARIO

Adems de las funciones bsicas ya vistas anteriormente, Excel cuenta con otras que pueden resultar de gran
ayuda al recontar celdas vacas u ocupadas:

CONTAR: cuenta el nmero de celdas que contienen nmeros.

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

CONTAR.BLANCO: devuelve el nmero de celdas vacas dentro de un rango de datos.

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

Hacemos clic en Buscar todo.


En la parte inferior del cuadro de dilogo Buscar y reemplazar, se muestran todas las celdas con dicho
formato.
Pulsamos Ctrl +A para seleccionar todas las celdas con dicho formato
Al hacerlo en la barra de estado se mostrar la suma de los valores. En este caso, 56863.
Si lo que queremos es contar el nmero de celdas en vez de sumarlas, hacemos clic con el botn derecho
sobre la barra de estado
Seleccionamos la funcin Cuenta.
En la barra de estado se mostrar el nmero de celdas con el formato que indiquemos. En este caso hay dos
celdas con color de fondo amarillo. Por tanto, en la barra de estado aparece 2.
A continuacin reproduzco un post de Jorge Dun de cmo se prodra hacer con VBA :

Function contar_por_color(RangoColor As Range, CeldaColor As Range)


Dim rngCelda As Range

For Each rngCelda In RangoColor


If rngCelda.Interior.ColorIndex = CeldaColor.Interior.ColorIndex Then
contar_por_color = contar_por_color + 1
End If
Next
End Function
Si quisiramos sumar los datos que contienen las celdas aplicaramos la funcin siguiente:

Function sumar_por_color(RangoColor As Range, CeldaColor As Range, RangoSumar As Range)


Dim rngCelda As Range
Dim colOffset As Long
colOffset = RangoSumar.Column RangoColor.Column
For Each rngCelda In RangoColor
If rngCelda.Interior.ColorIndex = CeldaColor.Interior.ColorIndex Then
sumar_por_color = sumar_por_color + rngCelda.Offset(0, colOffset).Value
End If
Next
End Function
FILED UNDER SIN CATEGORA

Clculos estadsticos bsicos: media,mediana, moda, varianza y


desviacin estndar
18 NOVIEMBRE, 2011 DEJA UN COMENTARIO

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:

Seleccione por ejemplo la celda A13 para realizar clculos.

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

Veamos como podra ser con cdigo VBA:


Function Media(k As Long, Arr() As Single)
Dim Sum As Single
Dim i As Integer
Sum = 0
For i = 1 To k
Sum = Sum + Arr(i)
Next i
Media = Sum / k
End Function
Y para la desviacin estndar:
Function StdDev(k As Long, Arr() As Single)
Dim i As Integer
Dim avg As Single, SumSq As Single
avg = Media(k, Arr)
For i = 1 To k
SumSq = SumSq + (Arr(i) avg) ^ 2
Next i
StdDev = Sqr(SumSq / (k 1))
End Function
FILED UNDER SIN CATEGORA

Reconociendo los mensajes de error


6 NOVIEMBRE, 2011 DEJA UN COMENTARIO

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

El primer tipo de error suele ocurrir:

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.

Al ejecutar una macro que en realidad es una funcin.

El segundo tipo de error surge:

Al hacer mencin a un nombre inexistente.

Usar una frmula en una etiqueta.

Introducir texto en una frmula sin cerrar las correspondientes etiquetas.

En cuanto al tipo de error div 0 no requiere mayor explicacin.


FILED UNDER SIN CATEGORA

Tcnicas de control y depuracin de errores (2 parte)


5 OCTUBRE, 2011 DEJA UN COMENTARIO

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)

Lectura y escritura. Devuelve o establece una cadena


descriptiva asociada a un error.

Erl (Propiedad)

Slo lectura. Devuelve un entero que indica el nmero de lnea


de la ltima instruccin ejecutada.

HelpContext
(Propiedad)

Lectura y escritura. Devuelve o establece un Integer que


contiene el identificador de contexto de un tema de un archivo
de Ayuda.

HelpFile
(Propiedad)

Lectura y escritura. Devuelve o establece una


expresin String que contiene la ruta de acceso completa a un
archivo de Ayuda.

LastDLLError
(Propiedad)

Slo lectura. Devuelve un cdigo de error proveniente del


sistema y producido por una llamada a la biblioteca de enlaces
dinmicos (DLL).

Number
(Propiedad)

Lectura y escritura. Devuelve o establece un valor numrico


que especifica un error.

Source
(Propiedad)

Lectura y escritura. Devuelve o establece una


expresin String que especifica el nombre del objeto o de la
aplicacin que gener originalmente el error.

Mtodos

METODOS

Clear
(Mtodo)

Borra todos los valores de las propiedades del objeto Err.

Raise
(Mtodo)

Genera un error en tiempo de ejecucin. Se puede utilizar en lugar


de la instruccinError.

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

Tcnicas de depuracin y de control de errores (1 parte)


4 OCTUBRE, 2011 DEJA UN COMENTARIO

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

establecemos la salida en caso de error


On Error GoTo controldivcero
si no hay errores dividimos
resultado = Format(dividendo / divisor, #0.00)
presentamos el resultado
msg = dividendo & entre & divisor & es igual a & resultado
MsgBox msg
dividir = True
salimos y finalizamos la funcin dividir
Exit Function
aqu el manejador de error
controldivcero:
se ha detectado un divisor=0 se le pregunta al usuario si pretende continuar
resultado = MsgBox(No se puede dividir entre 0 Desea continuar?, _
vbYesNo + vbQuestion, Dividir)
si dice que s rcomenzamos el bucle
If resultado = vbYes Then
dividir = False
Else
dividir = True
End If
End Function
Y con el procedimiento siguiente obtenemos los operadores y llamamos a la funcin:
Sub obtenernumeros_bis()
Dim hecho As Boolean
Dim divisor, dividendo As Variant
hecho = False
Do While Not hecho
dividendo = InputBox(Introduzca el dividendo, DIVISION)
divisor = InputBox(Introduzca el divisor, DIVISION)
hecho = dividir(dividendo, divisor)
Loop
End Sub
En este ejemplo preparar un rutina de control de errores no es muy difcil dado lo previsible y obvio del error
que se puede presentar. Aunque por desgracia no siempre es as.
A menudo necesitamos ofrecer al usuario la opcin de continuar el programa o abandonarlo. Para ello
podemos aadir una o varias sentencias Resume al manejador de errores. VBA define tres tipos:

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.

Resume Line: a partir de la etiqueta especificada con Line.

En cualquier momento podemos desactivar el manejador con la sentencia: On Error GoTo 0.

FILED UNDER CONTROL DE ERRORES

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:

Todo objeto personalizado ha de tener su propio mdulo.

El mdulo de clase es necesario renombrarlo para reflejar el objeto personalizado.

Por lo tanto vamos a renombrar nuestro mdulo desde la ventana de propiedades y le


llamaremos clsClientes. A continuacin vamos a asignar las propiedades:

Public localidad as string

Public ratio as double

Public importeventa as double

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

.localidad = Cells(fila, 2).Value


.ratio = 0.1
.importeventa = Cells(fila, 3).Value
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
Next
End With
End Sub
FILED UNDER MDULOS DE CLASE TAGGED WITH CLASES

Excel y bases de datos (Oracle)


1 OCTUBRE, 2011 DEJA UN COMENTARIO

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

Dim columna As Integer


Dim fila As Integer
creando la conexin a la base de datos y al recordset
Set conexion = New ADODB.Connection
Set rs = New ADODB.Recordset
parmetros de la conexin
conexion.Open ( _
User ID=system & _
;Password=root & _
;Data Source=XE & _
;Provider=MSDAORA.1)
sentencia SQL sacando todos los datos de la tabla EMPLEADOS
rs.Open select * from EMPLEADOS, conexion
vamos a presentar los resultados poniendo el contador a cero

Colocamos los datos empezando por os ttulos de las columnas

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:

FILED UNDER EXCEL Y BASES DE DATOS TAGGED WITH ORACLE

Excel y bases de datos (MySQL)


29 SEPTIEMBRE, 2011 1 COMENTARIO

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:

Crear/eliminar una base de datos.

Crear/eliminar tablas y campos.

Hacer consultas generales o especficas.

Insertar datos o borrarlos.

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.

Preparamos las variables para:

la conexin

servidor

usuario

contrasea

nombre de la base con la que trabajar

las tablas y campos en su caso.

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

A partir de aqu si todo ha ido bien podemos realizar varias acciones


Crear o eliminar tablas
Aadir campos
En este caso vamos a extraer datos a Excel

Set rs = New ADODB.Recordset


consulta = SELECT * FROM example
rs.Open consulta, conexion, adOpenStatic
With Worksheets(1).Cells
.ClearContents
.CopyFromRecordset rs
End With
Cerramos la conexin
On Error Resume Next
rs.Close

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

Excel y bases de datos (Access)


26 SEPTIEMBRE, 2011 DEJA UN COMENTARIO

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:

MsgBox (Archivo creado: & ruta & \ & nombrecpt)

Else: MsgBox La carpeta ya existe


End If
Else: MsgBox Directorio no existente
End If
End Sub
Y para crear la BD
Private Sub CommandButton1_Click()
Dim bd As Database
On Error Resume Next
NuevaCarpeta C:\, VisualExcel
Set bd = CreateDatabase(C:\VisualExcel\bd1.mdb, dbLangGeneral)
End Sub

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

abriendo la base de datos


Set bd = OpenDatabase(C:\mi_bd.mdb)
abriendo recordset
Set rs = bd.OpenRecordset(MiTabla, dbOpenTable)
recogiendo todos los campos en una tabla
r = 2 empiezo en la fila 2 de la hoja 1
Do While Len(Range(A & r).Formula) > 0
repetir hasta la primera celda vaca de la columna A
With rs
.AddNew
.Fields(Alias) = Range(B & r).Value
.Fields(apellidos) = Range(C & r).Value
.Fields(nombre) = Range(D & r).Value
.Fields(direccin) = Range(E & r).Value
.Fields(poblacin) = Range(F & r).Value
.Fields(tel) = Range(G & r).Value
.Update
End With
r=r+1
Loop
x = rs.RecordCount
cerramos
rs.Close
Set rs = Nothing
bd.Close
Set bd = Nothing
If Error = Then
MsgBox Exportacin correcta se han creado & x & registros.
End If
End Sub
Si en algn momento dado quisiramos eliminar la base usaramos la funcin Kill:
Para elminarla
Sub eliminar_bd()
Kill (C:\mi_bd.mdb)
End Sub
FILED UNDER EXCEL Y BASES DE DATOS TAGGED WITH ACCESS

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.

Abra un libro nuevo.

2.

Inicie el cuadro de controles.(Men>Ver>barra de herramientas>Cuadro de controles)

3.

Seleccione y dibuje un botn.

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)

Ejecuta bloc de notas

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:

En primer lugar el nombre del programa a ejecutar y su ubicacin exacta.

En segundo lugar un nmero asociadoal estilo de la ventana en que se va a ejecutar el programa,


que puede presentar los valors siguientes:

vbHide

Se oculta Windows y se pasa el foco a la


ventana oculta. La constante vbHide no se
aplica a plataformas Macintosh.

vbNormalFocus

Windows recupera el foco y vuelve a su


posicin y tamao original.

vbMinimizedFocus

Windows se muestra como un icono con foco.

vbMaximizedFocus

Windows se maximiza con foco.

vbNormalNoFocus

Windows vuelve al tamao y posicin ms


recientes. La ventana activa actual permanece
activa.

vbMinimizedNoFocus

Windows se muestra como un icono. La


ventana activa actual permanece activa.

Si quisiramos mostrar / acceder a la ventana de comandos deberamos ejecutar la macro siguiente:


Sub muestra_cmd()
Dim RetornaVal
RetornaVal = Shell(C:\WINDOWS\system32\cmd.exe, 1)
End Sub
Intente ejecutar un ejemplo similar como el anterior haciendo que se muestre mediante un botn la
calculadora de Windows.
FILED UNDER SHELL DE WINDOWS TAGGED WITH SHELL

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&#8221;) = 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/&#8221; & _
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&#8221;) = 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&#8221;) = fulanito@gmail.com
contrasea
Email.Configuration.Fields.Item _
(http://schemas.microsoft.com/cdo/configuration/sendpassword&#8221;) = micontrasea de correo

si el servidor utiliza SSL (secure socket layer). en gmail: True


Email.Configuration.Fields.Item _
(http://schemas.microsoft.com/cdo/configuration/smtpusessl&#8221;) = True
End If
a partir de ahora tomaremos los datos incluidos en el la hoja de excel:
Direccin del Destinatario
Email.To = Trim([e1].Value)
Direccin del remitente
Email.From = Trim([e2].Value)
Asunto del mensaje
Email.Subject = Trim([e3].Value)
Cuerpo del mensaje
Email.TextBody = Trim([e4].Value)
Ruta del archivo adjunto
If [e5].Value <> vbNullString Then
Email.AddAttachment (Trim([e5].Value))
End If
antes de enviar actualizamos los datos:
Email.Configuration.Fields.Update
colocamos un capturador de errores, por las dudas:
On Error Resume Next
enviamos el mail
Email.Send
si el numero de error es 0 (o sea, no existieron errores en el proceso),
hago que la funcin retorne Verdadero
If Err.Number = 0 Then
EnviarMails_CDO = True
Else
caso contrario, muestro un MsgBox con la descripcion y nro de error
MsgBox Se produjo el siguiente error: & Err.Description, vbCritical, Error nro & Err.Number
End If
destruyo el objeto, para liberar los recursos del sistema
If Not Email Is Nothing Then
Set Email = Nothing
End If
libero posibles errores
On Error GoTo 0
End Function
En principio para que pueda funcionar ha de activar la siguiente referencia: Microsoft (CDO for Windows
2000) . Para ver bien los comentarios y comprender el cdigo debera insertarlo en un mdulo y hacer las
pruebas.
Quizs lo que cueste un poco ms de entender son las lneas referentes a las configuraciones de los campos
de correo. Necesitamos decirle al sistema como estn configurados los campos referentes al remitente,

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&#8221;)
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

CDO valores por defecto

Set Flds = iConf.Fields


With Flds
.Item(http://schemas.microsoft.com/cdo/configuration/smtpusessl&#8221;) = True
.Item(http://schemas.microsoft.com/cdo/configuration/smtpauthenticate&#8221;) = 1
.Item(http://schemas.microsoft.com/cdo/configuration/sendusername&#8221;) = fulanito@gmail.com
.Item(http://schemas.microsoft.com/cdo/configuration/sendpassword&#8221;) = contraseadefulanito
.Item(http://schemas.microsoft.com/cdo/configuration/smtpserver&#8221;) = smtp.gmail.com
.Item(http://schemas.microsoft.com/cdo/configuration/sendusing&#8221;) = 2
.Item(http://schemas.microsoft.com/cdo/configuration/smtpserverport&#8221;) = 25
.Update
End With
Set rng = Nothing
On Error Resume Next
Set rng = Selection.SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rng Is Nothing Then
MsgBox La seleccin o no es un rango o la hoja est protegida & _
vbNewLine & corrigalo e intntelo de nuevo, vbOKOnly
Exit Sub
End If
With Application
.EnableEvents = False

.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

Set outlookApp = New Outlook.Application


MsgBox outlookApp.Name
End Sub
Otra forma:
Sub probando_referencia_bis()
Dim outlookApp As Object
Set outlookApp = CreateObject(Outlook.Application)
MsgBox outlookApp.Name
End Sub
Utilizamos CreateObject cuando deseamos crear una nueva instancia de Outlook y GetObject para hacer
referencia a una instancia en ejecucin de Outlook. El siguiente cdigo utiliza el enlace para mostrar la
carpeta predeterminada de la agenda de la instancia existente de Outlook y crea una instancia si no hay una
ya existente:
Sub Mostrar_Calendario()
declaracin de objetos
Dim outlookApp As Object
Dim olNs As Object
tratamiento en caso de error
On Error Resume Next
recogemos la referencia al objeto Outlook
Set outlookApp = GetObject(, Outlook.Application)
tratamiento en caso de error que no se pueda crear el objeto
If Err.Number = 429 Then
Set outlookApp = CreateObject(Outlook.application)
End If
On Error GoTo 0
obteniendo el calendario de la carpeta por defecto
Set olNs = outlookApp.GetNamespace(MAPI)
si no aparece activamos el explorador
If outlookApp.ActiveExplorer Is Nothing Then
outlookApp.Explorers.Add _
(olNs.GetDefaultFolder(9), 0).Activate
Else
en caso contrario lo mostramos
Set outlookApp.ActiveExplorer.CurrentFolder = _
olNs.GetDefaultFolder(9)
outlookApp.ActiveExplorer.Display
End If
vaciamos las variables de objeto
Set olNs = Nothing
Set outlookApp = Nothing
End Sub

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:

Mediante vinculacin previa: la referencia al objeto se realiza cuando se compila el programa.

Mediante vinculacin posterior: en tiempo de ejecucin.

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.

Activar Micrsosoft Word 11.o Object Library.

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

invocamos la aplicacin y abrimos el documento


Set wdApp = New Word.Application
Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & \testWord.doc)
wdApp.Visible = True
vaciamos las variables
Set wdApp = Nothing
Set wdDoc = Nothing
End Sub
Si la versin de Word a la que se hacer referencia no existe, aparecer un error de aplicacin.
Vinculacin posterior
Con este tipo de vinvulacin creamos un objeto que hace referencia a la aplicacin Word antes de vincular
con la biblioteca Word.
El siguiente ejemplo abre y hace visible el documento anterior:
Sub prueba_word()
debemos declarar una variable de objeto
Dim varDoc As Object
creamos el objeto
Set varDoc = CreateObject(Word.application)
varDoc.Visible = True hacemos visible el documento
Sheets(Hoja1).Range(A1:B1).Copy selecionamos y copiamos el rango sealado
varDoc.Documents.Add aadimos hojas al documento
varDoc.Selection.Paste pegamos la seleccin
varDoc.activedocument.SaveAs ThisWorkbook.Path & / & testWord.doc guardamos el documento en el
directorio raiz como
varDoc.Documents.Close cerramos varDoc.Quit
Application.CutCopyMode = False
End Sub
La diferencia si la prueba es notable. Con este mtodo no sabemos lo que est ocurriendo. No aparecen las
ayudas visuales cuando se hace referencia a los objetos de Word.
Abrir documentos de Word
Para abrir un documento existente hay que utilizar el mtodo Open. Admite varios parmetros entre
ellos Read Only y AddtoRecentFile. Por ejemplo el siguiente cdigo abre un documento existente en forma
slo lectura e impide que el archivo se aada a la lista de archivos recientes, bajo el men Archivo:
Sub abrir_arc_word()
Documents.Open Filename:=C:\testWord.doc, ReadOnly:=True, AddToRecentFiles:=False
End Sub
FILED UNDER EXCEL Y WORD TAGGED WITH WORD

XML y Excel (Ejemplo prctico)


16 SEPTIEMBRE, 2011 DEJA UN COMENTARIO

En el presente post vamos a reproducir un ejemplo prctico de Microsoft de como tratar con datos XML en
Excel.

1.

Descargue descargue el archivo de ejemplo XML.

2.

Agregar una asignacin a una hoja de clculo y a continuacin la llenar con los datos importados.

Empiece preparando la hoja de clculo


1.

Inicie Excel y abra el archivo de ejemplo.

Cuando aparezca el cuadro de dilogo Abrir XML, haga clic en Utilizar el panel de tareas Origen XML y
enAceptar.
2.

En la celda A1, escriba Empleado y en la celda A3, escriba Administrador.

3.

En la celda C1, escriba Departamento, y en la celda C3, escriba Fecha de presentacin.

4.

Aplique el formato que desee al texto para resaltarlo.

Agregue la asignacin
1.

Arrastre el elemento ns1:EmployeeName del panel de tareas Origen XML a la celda B1 y, a


continuacin, arrastre el elemento ns1:Department a la celda D1.

2.

Arrastre el elemento ns1:ManagerName a la celda B3 y, a continuacin, arrastre el


elemento ns1:Date a la celda D3.

3.

En ns1:ExpenseItem, seleccione ns1:Description y arrstrelo a la celda B5.

4.

An en ns1:ExpenseItem: arrastre el elemento ns1:Account a la celda C5, arrastre ns1:Date a la


celda D5 y, a continuacin, arrastrens1:Total a la celda E5.

5.

Guarde el archivo. Esto agregar la asignacin al archivo y enlazar los datos del archivo de origen a
la asignacin.

Ahora ya podr

Importar datos a la asignacin


1.

Seleccionar cualquiera de las celdas asignadas. En el men Datos, elija XML y, a continuacin, haga
clic enImportar.

Aparecer el cuadro de dilogo Importar XML.


2.

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>

<juego nombre="escondite" espacio="exteriores">


<jugadores min="2" max="16" />
<edades min="3" max="indefinido" />
<descripcion>
Los jugadores se reparten en dos equipos y...
</descripcion>
</juego>
<juego nombre="ajedrez" espacio="interiores">
.... etc.
</juego>
</juegos>
XML tiene unas reglas que hay que preservar y un alfabeto. Vamos a analizar como covertir un libro desde
Excel a HTML y vieceversa utilizando XML.
Reglas
Todo elemento de datos debe empezar y terminar con una etiqueta idntica. Los nombres de

etiquetas son sensibles a maysculas y minsculas.


El archivo XML debe empezar y terminar con una etiqueta raz. En el archivo slo puede existir una

etiqueta raiz.

Es vlido tener una etiqueta vaca.

Si se anidan etiquetas, la interior debe estar centrada antes de cerrar la exterior.

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

Como lista podemos usar el siguiente cdigo:


Sub Abrir_XML_FicheroLista()
Dim oWX As Workbook
Set oWX = Workbooks.OpenXML(Filename:=c:\ejemplo.xml,
LoadOption:=XlXmlLoadOption.xlXmlLoadImportToList)
End Sub
FILED UNDER XML

Trabajando con varias propiedades


14 SEPTIEMBRE, 2011 DEJA UN COMENTARIO

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

Formularios: cuadro de lista y cuadro combinado


11 SEPTIEMBRE, 2011 DEJA UN COMENTARIO

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.

Cuadro combinado. Combina un cuadro de texto


con un cuadro de lista para crear un cuadro de lista desplegable.Un cuadro combinado es ms compacto
que un cuadro de lista, pero requiere que el usuario haga clic en la flecha abajo para mostrar la lista de
elementos. Utilice un cuadro combinado para permitir que el usuario escriba una entrada o elija un solo
elemento de una lista. El control muestra el valor actual en el cuadro de texto, independientemente de cmo
se haya insertado ese valor.

La propiedad predeterminada de un control ListBox es Value.


El evento predeterminado de un control ListBox es Click.
El siguiente ejemplo agrega y elimina el contenido de un control ListBox utilizando los
mtodos AddItem yRemoveItem y las propiedades ListIndex y ListCount.
Para utilizar este ejemplo, copie este cdigo de ejemplo en la parte Declaraciones de un formulario.
Asegrese de que el formulario contiene:

Un control ListBox llamado ListBox1.

Dos controles CommandButton llamados CommandButton1 y CommandButton2.

Ejemplo:

Private Sub Command1_Click()


If Text1 = Then
MsgBox Debe ingresar un nombre para poder agregar un elemento, vbQuestion + vbOKOnly, Datos
incompletos
Salimos de la rutina ya que no se ha ingresado nada en el control text1
Exit Sub
End If

Agregamos el contenido del Text1 en el control List1


List1.AddItem Text1
End Sub
Private Sub Command2_Click()
Si la lista no est vaca entonces podemos eliminar
If List1.ListIndex <> -1 Then
Eliminamos el elemento que se encuentra seleccionado
List1.RemoveItem List1.ListIndex
End If
End Sub
FILED UNDER CONTROLES DE FORMULARIOS TAGGED WITH CUADRO DE LISTA

Formularios: Check buttom / Option Buttom


9 SEPTIEMBRE, 2011 DEJA UN COMENTARIO

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:

Un control TextBox llamado TextBox1.

Dos controles CheckBox llamados CheckBox1 y CheckBox2.

Un segundo control TextBox llamado TextBox2.

Private Sub CheckBox1_Change()


TextBox2.Text = TextBox2
TextBox1.Enabled = CheckBox1.Value
End Sub
Private Sub CheckBox2_Change()
TextBox2.Text = TextBox2
TextBox1.Locked = CheckBox2.Value
End Sub
Private Sub UserForm_Initialize()
TextBox1.Text = TextBox1
TextBox1.Enabled = True
TextBox1.Locked = False
CheckBox1.Caption = Enabled
CheckBox1.Value = True
CheckBox2.Caption = Locked
CheckBox2.Value = False
TextBox2.Text = TextBox2
End Sub
FILED UNDER FORMULARIOS

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.

El evento predeterminado de un control Frame es Click.


FILED UNDER CONTROLES DE FORMULARIOS TAGGED WITH FRAME

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.

Resumen de controles de formulario

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

Agrupa controles relacionados en


una unidad visual en un rectngulo
con una etiqueta opcional.
Generalmente, se agrupan botones
de opcin, casillas de verificacin o
contenido estrechamente
relacionado.

Botn

Ejecuta una macro que realiza una


accin cuando un usuario hace clic
en l. Los botones tambin se
conocen como botones de comando.

Casilla de
verificacin

Activa o desactiva un valor que


representa una seleccin inequvoca
entre opuestos. Puede seleccionar
ms de una casilla de verificacin en
una hoja de clculo o en un cuadro
de grupo. Una casilla de verificacin
puede tener uno de tres estados:
activada, desactivada y mixta, lo
que significa una combinacin de
los estados activada y desactivada
(como en una seleccin mltiple).

Botn de opcin

Permite una nica eleccin dentro


de un conjunto limitado de opciones
que se excluyen mutuamente; un
botn de opcin generalmente est
contenido en un cuadro de grupo o
un marco. Un botn de opcin
puede tener uno de tres estados:
activado, desactivado y mixto, lo
que significa una combinacin de
los estados activado y desactivado
(como en una seleccin mltiple).
Los botones de opcin tambin se
conocen como botones de radio.

Cuadro de lista

Muestra una lista de uno o ms


elementos de texto de entre los
cuales puede elegir el usuario. Use
un cuadro de lista para mostrar
grandes cantidades de opciones que
varan en nmero o contenido.

Existen tres tipos de cuadros 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.

Combina un cuadro de texto con un


cuadro de lista para crear un cuadro
de lista desplegable. Un cuadro
combinado es ms compacto que un
cuadro de lista pero requiere que el
usuario haga clic en la flecha abajo
para mostrar una lista de elementos.
Use un cuadro combinado para
permitir que un usuario escriba una
entrada o elija solamente un
elemento de la lista. El control
muestra el valor actual en el cuadro
de texto, sin importar el modo en
que dicho valor se haya
proporcionado.
Se desplaza por un intervalo de
valores cuando el usuario hace clic
en las flechas de desplazamiento o
arrastra el cuadro de
desplazamiento. Adems, se puede
mover por una pgina (en un
intervalo preestablecido) de valores
haciendo clic en el rea entre el
cuadro de desplazamiento y
cualquiera de las flechas de

desplazamiento. Generalmente, el
usuario tambin puede escribir un
valor de texto directamente en un
cuadro de texto o una celda
asociados.

Control de
nmero

Aumenta o disminuye un valor,


como un incremento numrico, una
hora o una fecha. Para incrementar
el valor, es necesario hacer clic en la
flecha arriba; para disminuirlo, se
debe hacer clic en la flecha abajo.
Generalmente, el usuario tambin
puede escribir un valor de texto
directamente en un cuadro de texto
o una celda asociados.

FILED UNDER FORMULARIOS TAGGED WITH FORMS

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.

A una celda en concreto.

A toda una fila / columna.

A celdas de otras hojas.

Como propiedades el objeto Range tiene las siguientes:

ActiveCell->representa la primera celda activa de la ventana activa (windowactive) o especificada.

Areas->todos los rangos de una selecin mltiple.

Cells->representa a una celda o cleccin de ellas.

Columns->representa las columnas de la hoja activa,o especificada, o del rango especificado.

Entire column/row->la columna/fila entera dentro del rango.

End->la celda situada al final del rango especificado.

Offset->la celda desplazada segn un n especfico de fila/columna.

Formas de seleccionar celdas con Range:


Una celda slo:
Range(A1).Select
Un conjunto de celdas contiguas dentro de la misma hoja:
Range(A1:G5).Select
Para seleccionar celdas no contiguas:
Range(A1,A5,B4).Select

Para seleccionar celdas no contiguas mas un conjunto contiguo:


Range(A1,A5,B4:B8).Select
Otro ejemplo:
La siguiente tabla muestra algunas referencias de estilo A1 utilizando el mtodo Range.
Referencia Significado
Range(A1) Celda A1
Range(A1:B5) Celdas de la A1 a la B5
Range(C5:D9,G9:H16) Seleccin de varias reas
Range(A:A) Columna A
Range(1:1) Fila uno
Range(A:C) Columnas de la A a la C
Range(1:5) Filas de la uno a la cinco
Range(1:1,3:3,8:8) Filas uno, tres y ocho
Range(A:A,C:C,F:F) Columnas A, C y F
De todas las propiedades descritas tal vez una de las ms usadas sea Offset, que nos permite seleccionar
celdas contiguas a la celda activa segn una determinada posicin de filas y clumnas:
expresin.Offset(RowOffset, RowOffset)
RowOffset

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

Variant opcional. El nmero de columnas (positivo, negativo o cero) que indica el

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]

En vez de Range(A1:D5) podemos utilizar [A1:D5]


Range(A1:D5,G6:I17) >[A1:D5,G6:I17]
FILED UNDER OBJETOS

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:

La hoja activa> ActiveSheet

Llamada a la hoja 1>WorkSheets(Hoja1)

Llamada a la primera hoja de la coleccin>WorkSheets(1)

Llamada a la ltima hoja de la coleccin.>WorkSheets(WorkSheets.Count)

Llamada a una hoja de otro libro.>

Workbooks(Libro1).Worksheets(Hoja1)
Workbooks(Libro2).Worksheets(Hoja1)
Propiedades: a excepcin de name todas son de lectura.

.Name>Nombre de la hoja.

.Index>Numero de la hoja dentro del ndice numrico de la coleccin.

.Count>Devuelve el nmero de hojas dentro de la coleccin.

.Next/previous>Devuelve la hoja siguiente/anterior.

.Used Range>Devuelve un objeto range con el rango de la hoja que tiene datos.

Ejemplo: la siguiente macro devuelve el nombre de las hojas del libro.


Sub Muestra_mis_hojas()
Dim mihoja As Worksheet
For Each mihoja In Worksheets
MsgBox mihoja.Name
Next mihoja
End Sub
Eventos:

.Activate>activa la hoja

.calculate>reclacula la hoja especificada.

.Delete>Borra la hoja.

.Protect>Protege la hoja sealada.

Ejemplo: macro para proteger la hoja activa.


Sub ProtectSheet()
ActiveSheet.Protect
End Sub
FILED UNDER OBJETOS TAGGED WITH WORKSHEETS

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

Nombre del usuario

OrganizationName

Nombre de la empresa

OperatingSystem

Sistema operativo

Version

Versin de MS Excel

ProductCode

Cdigo de MS Excel

StandardFont

Fuente por defecto

StandardFontSize

Tamao fuente por defecto

DecimalSeparator

Carcter separador de miles

ActivePrinter

Impresora por defecto

DefaultFilePath

Ruta de acceso por defecto

UserLibraryPath

Ruta a carpeta Add-Ins

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

Ejemplo: Crearemos un libor nuevo con ese nombre.


Sub NuevoLibro()
Workbooks.Add
Application.ActiveWorkbook.SaveAs (Mi_nuevo_libro)
End Sub
Abrir un libro existente: para abrir un libro utilizaremos la siguiente Macro.
Sub AbrirLibro()
Workbooks.Open (C:\Mis documentos\Ejemplo.xls)
End Sub
FILED UNDER OBJETOS TAGGED WITH LIBROS

Trabajando con objetos


31 AGOSTO, 2011 DEJA UN COMENTARIO

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

Las funciones ImputBox y MsgBox


29 AGOSTO, 2011 DEJA UN COMENTARIO

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])

Prompt : Es el texto mostrado en el cuadro de dialogo

Title :(opcional)Texto de titulo para el cuadro de dialogo


Default :Valor por defecto mostrado en el cuadro de dialogo

Xpos,Ypos :La patalla se ubicar segun las cordenadas

Helpfile ,context (opcional).el archivo de ayuda

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

0 > Una frmula


1 > Un numero
2 > Una cadena(texto)
4 > Un valor logico(True o False)
8 > Una celda de referencia ,como un objeto de rango
16 > Un error de valor,como #N/A
El MsgBox es el cuadro de respuesta de la API de Windows. Su sintxis es la siguiente:
Muestra un mensaje en un cuadro de dilogo, espera a que el usuario haga clic en un botn y devuelve un
tipoInteger correspondiente al botn elegido por el usuario.
MsgBox(prompt[, buttons][, title][, helpfile, context])
La sintaxis de la funcin MsgBox consta de estos argumentos con nombre:

prompt

Requerido. Expresin de cadena que representa el prompt en el cuadro de


dilogo. La longitud mxima de prompt es de aproximadamente 1024
caracteres, segn el ancho de los caracteres utilizados. Si prompt consta de
ms de una lnea, puede separarlos utilizando un carcter de retorno de carro
(Chr(13)) o un carcter de avance de lnea (Chr(10)), o una combinacin de
caracteres de retorno de carro avance de lnea (Chr(13)y Chr(10)) entre
cada lnea y la siguiente.

buttons

Opcional. Expresin numrica que corresponde a la suma de los valores que


especifican el nmero y el tipo de los botones que se pretenden mostrar, el
estilo de icono que se va a utilizar, la identidad del botn predeterminado y la
modalidad del cuadro de mensajes. Si se omite este argumento, el valor
predeterminado para buttons es 0.

title

Opcional. Expresin de cadena que se muestra en la barra de ttulo del cuadro


de dilogo. Si se omite title, en la barra de ttulo se coloca el nombre de la
aplicacin.

helpfile

Opcional. Expresin de cadena que identifica el archivo de Ayuda que se

utiliza para proporcionar ayuda interactiva en el cuadro de dilogo. Si se


especifica helpfile, tambin se debe especificar context.
context

Opcional. Expresin numrica que es igual al nmero de contexto de Ayuda


asignado por el autor al tema de Ayuda correspondiente. Si se
especifica context, tambin se debe especificar helpfile.

Valores
El argumento buttons tiene estos valores:

VbOKOnly

Muestra solamente el botn Aceptar.

VbOKCancel

Muestra los botones Aceptar y Cancelar.

VbAbortRetryIgnore

Muestra los
botones Anular, Reintentar e Ignorar.

VbYesNoCancel

Muestra los botones S, No y Cancelar.

VbYesNo

Muestra los botones S y No.

VbRetryCancel

Muestra los
botones Reintentar y Cancelar.

VbCritical

16

Muestra el icono de mensaje crtico.

VbQuestion

32

Muestra el icono de pregunta de


advertencia.

VbExclamation

48

Muestra el icono de mensaje de


advertencia.

VbInformation

64

Muestra el icono de mensaje de


informacin.

VbDefaultButton1

El primer botn es el predeterminado.

VbDefaultButton2

256

El segundo botn es el predeterminado.

VbDefaultButton3

512

El tercer botn es el predeterminado.

VbDefaultButton4

768

El cuarto botn es el predeterminado.

VbApplicationModal

Aplicacin modal; el usuario debe


responder al cuadro de mensajes antes de
poder seguir trabajando en la aplicacin
actual.

VbSystemModal

4096

Sistema modal; se suspenden todas las


aplicaciones hasta que el usuario responda
al cuadro de mensajes.

VbMsgBoxHelpButton

16384

Agrega el botn Ayuda al cuadro de


mensaje.

VbMsgBoxSetForeground

65536

Especifica la ventana del cuadro de mensaje


como la ventana de primer plano.

VbMsgBoxRight

524288

El texto se alnea a la derecha.

VbMsgBoxRtlReading

1048576

Especifica que el texto debe aparecer para


ser ledo de derecha a izquierda en sistemas
hebreo y rabe.

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

Funciones de conversin de tipos


27 AGOSTO, 2011 DEJA UN COMENTARIO

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

Valor que devuelve la funcin

CBool

Boolean

Cualquier cadena o expresin numrica vlida

CByte

Byte

0 a 255

CCur

Currency

922 337 203 685 477,5808 a 922 337 203 685 477,5807

CDate

Date

Cualquier expresin de fecha vlida

Double

-1.79769313486231E308 a -4,94065645841247E-324 para los


valores negativos ; 4,94065645841247E-324 a
1,79769313486232E308 para los valores positivos

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

-32 768 a 32 767 , las fracciones se redondean. Las partes


decimales se redondean a 0.5 y el nmero par ms cercano

CLng

Long

2 147 483 648 a 2 147 483 647 , las fracciones son


redondeadas. Las partes decimales se redondean a 0.5 y el
nmero par ms cercano

CSng

Single

-3,402823E38 a -1,401298E-45 para los valores negativos,


1,401298E-45 3,402823E38 para los valores positivos

CStr

String

Los valores devueltos por la funcin Cstr de la expresin


dependiente

CVar

Variant

Mismo rango de valores para los nmeros de tipo doble y el


tipo de cadenas no nmericas.

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:

Las ms usuales son:


rate: tasa fija de inters.
nper:n de perodos
pmt: pagos o depsitos peridicos.
pv:valor actual del prstamo
fv: valor futuro del prstamo o inversin.
type:tipo de pago o depsito.
El siguiente ejemplo muestra el clculo de la cuota para un prstamo francs:
Sub otro()
Dim Fmt, FVal, PVal, APR, TotPmts, Tipopago, Pago
Const PERIODFIN = 0, PERIODINI = 1
Fmt = ###,###,##0.00
FVal = 0

Momento de los pagos.

Define el formato.

Normalmente 0 (crdito).

PVal = InputBox(Cunto dinero desea solicitar?)

APR = InputBox(Cul es la tasa anual porcentual del crdito?)


If APR > 1 Then APR = APR / 100

Asegura la forma correcta.

TotPmts = InputBox(Cuantos pagos mensuales va a realizar?)


Tipopago = MsgBox(Realiza los pagos al final del mes?, vbYesNo)
If Tipopago = vbNo Then Tipopago = PERIODINI Else Tipopago = PERIODFIN
Pago = Pmt(APR / 12, TotPmts, -PVal, FVal, Tipopago)
MsgBox El importe del pago ser & Format(Pago, Fmt) & al mes.
End Sub
En la prctica que aqu se expone, se ha realizado el clculo de las cuotas de un prstami tipo francs
mediante Excel:

En F10 se inserta la frmula siguiente:=(Va*i/q)/(1(1+i/q)^-(n*q))


Si qusiramos hacerlo mediante VBA el cdigo asociado sera el siguiente:
Sub prestamo_dos()
Dim cuantia, cuota, tipo, periodos, i, r
Const k = 0.25 / 100
tipo = (Cells(4, 4).Value) / 100
periodos = Cells(5, 4).Value
cuantia = Cells(3, 4).Value
Cells(9, 2) = Cells(4, 4) / 100
For i = 9 To 15
Cells(i, 2).Value = (Cells(i 1, 2).Value) + k
r = Cells(i, 2).Value
Cells(i, 6) = Abs(Pmt(r, periodos, cuantia))
Cells(i, 5) = Abs(Pmt(r / 2, periodos * 2, cuantia))
Cells(i, 4) = Abs(Pmt(r / 4, periodos * 4, cuantia))
Cells(i, 3) = Abs(Pmt(r / 12, periodos * 12, cuantia))
Next
End Sub

FILED UNDER FUNCIONES TAGGED WITH FUNCIONES

Funciones de cadenas

23 AGOSTO, 2011 DEJA UN COMENTARIO

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:

Left(texto,Nchart)>devuelve los primeros caracteres de una cadena


Right(id)>nos devuelve los ltimos
Midt(texto, Init, NChar)>permite extraer del texto una serie de carcteres a partir de Init.
Ejemplo:
Sub funciones_cadenas()
Dim palabra As String
palabra = InputBox(Introduzca una palabra, Funciones de cadenas)
If Len(palabra) = 0 Then
MsgBox ERROR
GoTo salida
Else
[A1] = La palabra que ha introducido ha sido & palabra
[A2] = La funcin left a partir de la 2 letra devuelve el carcter : & Left(palabra, 2)
[A3] = La funcin right a partir de la 2 letra devuelve el carcter : & Right(palabra, 2)
[A4] = La funcin Mid(palabra, 1, 2) devuelve : & Mid(palabra, 1, 2)
[A5] = Su palabra tiene & Len(palabra) & caracteres.
End If
salida:
End Sub
FILED UNDER FUNCIONES TAGGED WITH FUNCIONES

Funciones matemticas de VBA


22 AGOSTO, 2011 1 COMENTARIO

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:

si nmero <0 Repite el mismo nmero cada vez


si nmero=0 El nmero generado ms reciente
si nmero>0 El siguiente nmero aleatorio en la secuencia.
Le inserto aqu un cdigo para que compruebe los resultados.
Sub prueba()
Dim i As Byte
Dim j As Integer
principio:
j = Int(Val(InputBox(Escoja un nmero positivo , Funcin Random)))
If j < 0 Then
MsgBox Error debe escoger un nmero positivo
GoTo principio
Exit Sub
Else
For i = 1 To 15
Cells(i, 1) = Rnd(-j)
Cells(i, 2) = Rnd(0)
Cells(i, 3) = Rnd(j)
Next
End If
End Sub
La necesidad de trabajar con nmeros aleatorios surge muy a menudo. A veces necesitamos trabajar con un
abanico ms amplio que de 0 a9. Aqu le expongo la frmula que ha de emplear en tal caso:
Int((superior-inferior)*Rnd + inferior
Ejemplo nmero aleatorio entre 25 y 100
Sub prueba2()
Cells(1, 1) = Int((100 25) * Rnd + 25)
End Sub
FILED UNDER FUNCIONES

FUNCIONES (funciones de comprobacin)


18 AGOSTO, 2011 DEJA UN COMENTARIO

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 conversin de tipos.

Funciones MsgBox e InputBox.

Definidas por el usuario.

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

Condiciones dentro del bucle Fornext


17 AGOSTO, 2011 DEJA UN COMENTARIO

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

Bucles de repeticin: Fornext


12 AGOSTO, 2011 DEJA UN COMENTARIO

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

MsgBox El cuadrado de & x & es & yNext


End Sub
Por cierto se habr percatado de la presencia de una lnea de cdigo al comienzo del bucle On Error Resume
Next. Con esta sentencia evitamos que el programa se cuelge ante la presencia de errores ms o menos
viene a decir:en presencia de error salta al siguiente paso.
En su momento trabajaremos el tema referente al tratamiento de errores.
FILED UNDER BUCLES DE REPETICIN TAGGED WITH BUCLES DE REPETICIN

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.

FILED UNDER ENTENDER VBA

Estructuras de decisin Select Case anidados


10 AGOSTO, 2011 DEJA UN COMENTARIO

Me ha parecido interesante la explicacin y el ejemplo de las estructuras anidadas de Select Case y la


reproduzco aqu al objeto de que vd pueda ver la potencialidad de esta estructura con un ejemplo que, a
pesar de la presencia de varias condiciones, resulta bastante clara y as adems, aborda ejemplos ms
desarrollados.
Publicado por ExcelForo
El problema planteado es el siguiente:

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:

creamos una funcin con tres variables Sexo, Edad y % grasa


Public Function Grasa1(sexo, edad, Porcgra)
Select Case sexo
definimos categoras para mujeres
Case Is = M
Select Case edad
Case 18 To 39
Select Case Porcgra
Case 0 To 21: Grasa1 = bajo en grasa
Case 22 To 33: Grasa1 = normal en grasa
Case 34 To 39: Grasa1 = alto en grasa
Case Is > 39: Grasa1 = obesidad
End Select
Case 40 To 59
Select Case Porcgra
Case 0 To 23: Grasa1 = bajo en grasa
Case 24 To 34: Grasa1 = normal en grasa
Case 35 To 40: Grasa1 = alto en grasa
Case Is > 40: Grasa1 = obesidad
End Select
Case 60 To 99
Select Case Porcgra
Case 0 To 24: Grasa1 = bajo en grasa
Case 25 To 36: Grasa1 = normal en grasa
Case 37 To 42: Grasa1 = alto en grasa
Case Is > 42: Grasa1 = obesidad
End Select
End Select
lo mismo para hombres
Case Is = H
Select Case edad
Case 18 To 39
Select Case Porcgra
Case 0 To 8: Grasa1 = bajo en grasa

Case 9 To 20: Grasa1 = normal en grasa


Case 21 To 25: Grasa1 = alto en grasa
Case Is > 25: Grasa1 = obesidad
End Select
Case 40 To 59
Select Case Porcgra
Case 0 To 11: Grasa1 = bajo en grasa
Case 12 To 22: Grasa1 = normal en grasa
Case 23 To 28: Grasa1 = alto en grasa
Case Is > 28: Grasa1 = obesidad
End Select
Case 60 To 99
Select Case Porcgra
Case 0 To 13: Grasa1 = bajo en grasa
Case 14 To 25: Grasa1 = normal en grasa
Case 26 To 30: Grasa1 = alto en grasa
Case Is > 30: Grasa1 = obesidad
End Select
End Select
End Select
End Function
Ya podremos utilizar nuestra funcin Grasa1 en nuestra Hoja de clculo, sobre tres celdas
=GRASA1(sexo; edad; %grasa)
FILED UNDER ESTRUCTURAS DE DECISIN

Estructuras de decisin Select Case


10 AGOSTO, 2011 DEJA UN COMENTARIO

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

Estructuras de decisin if_then_else


7 AGOSTO, 2011 DEJA UN COMENTARIO

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:

El cdigo en VBA sera:

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.

Antes de empezar a programar con ellos necesitamos declararlos


Dim meses(11) as byte

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

Mdulos, propiedades y eventos

28 JULIO, 2011 DEJA UN COMENTARIO

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

mens desplegables en uno o ms de un nivel. El resto de ventanas no deberan contener mens


desplegables, aunque puede darse el caso.
Algunas propiedades de los formularios que se pueden establecer en tiempo de diseo son:

BorderSytle: Establece el estilo del borde del formulario.

Caption: Establece el texto que aparece en la barra de ttulo del formulario.

ControlBox: Permite mostrar o no el men de control de las ventanas de Windows.

Enabled: Establece si el formulario puede responder o no a los eventos que generes.

Font: Establece las caractersticas de los objetos de texto que se siten en el formulario.

Icon: Cambia el icono que representa el formulario.

Left, Top, Height, Width: Establecen la posicin del formulario en la pantalla as como las
dimensiones.

MaxButton y MinButton: Establece si se podr maximizar o minimizar el formulario.

MousePointer: Modificar el puntero del ratn.

Visible: Establece si el formulario se mostrar visible en tiempo de ejecucin.

WindowState: Establece el modo en que se carga inicialmente el formulario, normal, maximizado o


minimizado.

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

Cuadro combinado enlazado a datos

dbc

Command Button

Botn de comando

cmd

Data

Control de datos

dat

Directory list box

Cuadro lista de directorios

dir

Drive List Box

Cuadro lista de unidades

drv

File List Box

Cuadro lista de archivos

fil

Frame

Marco

frm

Grid

Rejilla

grd

Data-bound grid

Rejilla enlazada a datos

dbg

Horizontal scrollbar

Barra de desplazamiento horizontal

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

Vertical scroll bar

Barra de desplazamiento vertical

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:

Private Sub NombreObjeto_NombreEvento([Lista de parametros])


...instrucciones...
End Sub
FILED UNDER ENTENDER VBA

Mdulos,procedimientos, subrutinas y mdulos de clases


28 JULIO, 2011 DEJA UN COMENTARIO

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:

Es parecido a los tipos definidos por el usuario UDT.

Cada mdulo define un tipo de objeto.

En ejecucin creas una instancia (o objeto) de la clase.

No tiene interfaz de usuario.

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.

Se pueden crear mltiples instancias en ejecucin.

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.

Proporciona mtodos y propiedades.

Eventos de un mdulo de clase: Initialize y Terminate


Los mdulos de clase presenta dos eventos:

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.

Diferencias con los mdulos estndar

Deben ser creadas explcitamente (crear instancia) antes de usarlas.

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.

Puedes crear mltiples instancias de la clase.

Veamos un ejemplo:
1.

Inicie VBA y vaya a Men>Insertar>Mdulo de clase.

2.

Dele un nombre por ejemplo ObAplicacion

3.

Inserte el siguiente cdigo con el que crearemos un objeto Aplicacion:

Public WithEvents MiAplicacion as Application


Si pulsa ahora F2 y despliega la lista de objetos encontrar el objeto recin creado. A continuacin crearemos
dos procedimientos para nuestro objeto recin creado. El primero se encargar de insertar una nueva hoja en
el libro:
Private Sub MiAplicacion_NuevaHoja(ByVal wb As Workbook, ByVal sh As Object)
Dim nombrehoja As String
nombrehoja = InputBox(Introduzca un nombre para la hoja)
ActiveSheet.Name = nombrehoja
ActiveSheet.Move After:=Sheets(Sheets.Count)
End Sub
Con este cdigo crearemos un nuevo libro:
Private Sub MiAplicacion_NuevoLibro(ByVal wb As Workbook)
Dim numhojas, numactual, diferencia As Integer
por cada nuevo libro solicitamos al usuario el nmero de hojas
caso necesario se agregan o eliminan hojas
Do
numhojas = Application.InputBox(Cuntas hojas va a necesitar?, Type:=1)
Loop While numhojas = False
numactual = Sheets.Count
diferencia = numactual numhojas
eliminamos las hojas de sobra y desactivamos alertas
Do While diferencia > 0
Application.DisplayAlerts = False
Sheets.Item(diferencia).Select
ActiveWindow.SelectedSheets.Delete
diferencia = diferencia 1
Loop
Application.EnableEvents = True
Application.DisplayAlerts = True
End Sub
Por ltimo vamos a conectar el mdulo de clase con el objeto Aplicacin:
Option Explicit
Dim app As New ObjAplicacion
Sub Inicializa_MiAplicacion()
Set app.MiAplicacion = Application
End Sub
FILED UNDER ENTENDER VBA TAGGED WITH MDULOS DE CLASE

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.

Abra un libro nuevo.

2.

Presione Alt+F11 para ejecutar el Editor de Visual Basic.

3.

En el men Insertar, haga clic en Mdulo.

4.

Escriba el siguiente cdigo en la hoja de mdulo:

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.

Das könnte Ihnen auch gefallen