Mostrando las entradas con la etiqueta ActiveX. Mostrar todas las entradas
Mostrando las entradas con la etiqueta ActiveX. Mostrar todas las entradas

miércoles, marzo 16, 2011

Usar el control Calendario en Excel 2010

En el pasado, en aquellos lejanos días de Excel Clásico (97-2003), mostramos en este blog las bondades de usar el control Calendario (Mscal.ocx) y también como validar fechas con el control.

Las malas noticias para los que empiezan a trabajar con Excel 2010 es que el control ha sido removido del paquete de Office.

Microsoft comenta el tema en esta nota diciendo:

El control Calendar (mscal.ocx) […] fue removido de Access 2010 y no se puede utilizar en Excel 2010. En cambio, los usuarios pueden utilizar el Date Picker o sus propios controles de calendario personalizado.

El Date Picker se encuentra en la colección de controles ActiveX



Una segunda posibilidad es usar controles o complementos de terceras partes. Personalmente puedo recomendar el complemento desarrollado por Sam Radakovitz. Todo la que hay que hacer es descargar el complemento en la nota que Sam publicó el blog de Microsoft Office y copiarlo en la carpeta XLSTART (por ejemplo: C:\Program Files\Microsoft Office\OFFICE14\XLSTART).

Una vez instalado el complemento aparecerá en la cinta en la pestaña Complementos



El complemento hace que el calendario aparezca en toda celda que contenga una fecha o en la celda inmediata inferior.
También aparece en la celda que se encuentre debajo de una que contenga la palabra “Date” (fecha, en inglés. No, no funciona con Fecha en castellano) o desde el menú contextual que se abre con un clic del botón derecho del mouse



Existe una tercera posibilidad: instalar el control Calendario de Excel Clásico (Mscal.ocx) para utilizarlo en Excel 2010. Esta posibilidad es válida para la versión 32 Bit de Excel 2010.

El control puede descargarse en fonstuff o mejor aún en la página de descargas de Graham Mayor (buscar el MSCAL.ZIP).

Para poder usar el control hay que copiar el archivo MSCAL.OCX en C:\Windows\System32 y registrarlo. Para registrarlo hacemos un clic a Start (Inicio) y en Run copiamos “regsvr32 mscal.ocx” en



Apretamos OK y veremos esta mensaje



Ahora el control aparecerá en la colección de controles ActiveX

lunes, noviembre 15, 2010

Activar una macro desde un cuadro combinado (ComboBox)

En la nota anterior vimos como activar una macro a partir de la elección en una lista desplegable. Esta lista fue creada con validación de datos.

Podemos también crear listas desplegables usando el control cuadro combinado (ComboBox). Pero en ese caso tendremos que usar técnicas un poco distintas de las que mostramos ayer.

Empecemos por señalar que hay dos tipos de controles: los de la barra de formularios y los ActiveX (tema que ya fue tratado en este blog). Los controles de la barra de formularios son fáciles de usar pero no pueden ser programados. Los ActiveX al poder programarlos son más flexibles, pero requieren un poco más de conocimientos.

Siguiendo con el ejemplo de la nota anterior, veremos cómo implementarlo con ambos tipos de controles.


Cuadro combinado de la barra de formularios.

Empezamos por crear las tres macros en un módulo común del editor de Vba

Sub dia()
    MsgBox "Buenos dias"
End Sub
Sub tarde()
    MsgBox "Buenas tardes"
End Sub

Sub noche()
    MsgBox "Buenas noches"
End Sub


Luego creamos una lista con los nombres de las macros y le asignamos un nombre (en este caso usamos el cuadro de nombres para crearlo)



El próximo paso es pegar el cuadro combinado y definir sus propiedades. En la pestaña Programador



Una vez creado abrimos el menú de propiedades del control apretando el botón derecho del mouse.



En el rango de entrada ponemos el nombre que se refiere al rango con la lista de macros y en la casilla de vincular con celda ponemos alguna celda, no necesariamente en la misma hoja y no necesariamente visible



Ahora podemos ver que al elegir la opción "dia", la celda vinculada recibe el valor 1 (ya que "dia" es el primer elemento de la lista). Si elegimos "tarde" la celda vinculada recibe el valor 2.

El paso siguiente es crear una macro lo que haremos abriendo el menú contextual del control (clic con el botón derecho) y eligiendo la opción Asignar macro y apretando el botón Nuevo



En el editor de Vba veremos que Excel ha creado una macro, sin código en esta etapa



En esa macro ponemos este código

Sub Listadesplegable1_AlCambiar()
    Dim intCaseSel As Integer

    intCaseSel = Range("C8")

    Select Case intCaseSel
        Case 1: Call dia
        Case 2: Call tarde
        Case 3: Call noche
    End Select
      
    
End Sub


Cada vez que un valor del cuadro combinado es elegido, la instrucción Select activa la macro correspondiente según el valor de la celda vinculada al control.


Cuadro combinado ActiveX

Empezamos seleccionando el cuadro combinado de los controles ActiveX




y pegándolo en algún lugar de la hoja. En el momento en que terminamos de pegar el control, la hoja pasa al modo "Diseño", lo que nos permite definir las propiedades del control. Abrimos el menú de propiedades (no el de formato!) y definimos el rango de los valores de la lista (ListFillRange)



En el próximo paso abrimos el menú Ver código. Excel crea un evento Change para el control,




donde ponemos este código

Private Sub ComboBox1_Change()
    Application.Run ComboBox1.Value
End Sub


Nótese que el código está en el módulo de la hoja que contiene el control. El evento usa el método Run con el valor elegido en el cuadro combinado (ComboBox1.Value) para activar la macro adecuada.

Todo sobre listas desplegables en Excel, técnicas avanzadas y descarga gratuita de ejemplos  en la Caja de Herramientas Excel - Listas Desplegables de JLD. Ver la nota o ir a la página de descarga de la guía.

lunes, marzo 01, 2010

Activar Macros y controles ActiveX en Excel 2010

Quien haya descargado e instalado Excel 2010 descubrirá, como en Excel 2007, que por defecto la pestaña de Programador no aparece en la cinta. Esto se debe a que por defecto las macros no están habilitadas en Excel 2010. Tampoco tenemos acceso a los controles (formulario y ActiveX).

Si están buscando una solución al problema "No se puede insertar el objeto", debido a la actualización de Microsoft del 9 de diciembre, lean esta nota.

Para poder usar las macros y los controles en Excel 2010 tenemos que seguir los siguientes pasos:
Activamos la pestaña Archivo y apretamos el botón Opciones



Activamos el Centro de Confianza y apretamos el botón Configuración del centro de confianza



En el centro e confianza activamos la opción Configuración de macros y habilitamos la opción Habilitar todas las macros



Apretamos Aceptar con lo que habremos habilitado las macros en nuestra copia de Excel 2010.
Sin embargo la pestaña de Programador no aparecerá. Para hacerla aparecer usamos nuevamente el menú Opciones de Archivo y en Personalizar la cinta de opciones marcamos Programador




A partir de ese momento podemos grabar, editar y crear macros y también usar controles en nuestros cuadernos.

lunes, diciembre 07, 2009

Construir un tablero de comandos (Dashboard) en Excel – segunda nota

En la nota anterior sobre cómo crear un tablero de comandos (dashboard) con Excel dijimos que el primer paso es definir cuál es el objetivo, que información debe ser presentada y de qué manera. A partir de ahí tenemos que solucionar tres cuestiones: diseño, datos y mecanismo, temas que serán abordados en una próxima nota.

En esta entrada me centraré en la explicación del modelo de nuestro ejemplo mostrando los elementos más importantes y las fórmulas en uso.

Desde ya, la mejor forma de entenderlo y estudiarlo es descargar y “disecar” el archivo.

Para descargar el archivo hay que seguir este enlace.

El modelo cuenta con siete hojas



Dashboard - Tablero de Comandos Excel

La hoja Dashboard contiene el tablero de comandos y es en la que el usuario interactúa. Esta hoja tiene dos columnas ocultas: A y B

Dashboard - Tablero de Comandos Excel

A y B son columnas auxiliares que controlan los datos visibles en la tabla Detalle por Sucursal

Dashboard - Tablero de Comandos Excel

En el rango B23:B32 ponemos la fórmula

=DERECHA(D23;LARGO(D23)-HALLAR(" ";D23))

cuyo cometido es extraer el número de sucursal.

En el rango A23:A32 ponemos la expresión

D23=0

Al elegir una de las zonas de la lista desplegable, sólo aparecen las sucursales pertenecientes a la zona. Esto hace que las celdas relevantes del rango A23:A32 den el resultado VERDADERO. Ese resultado controla el formato condicional de la tabla que es el responsable de ocultar las celdas de las sucursales que no pertenecen a la zona elegida

Dashboard - Tablero de Comandos Excel

La hoja tiene tres listas desplegables. Las dos superiores, que controlan la fecha de comienzo y fin del período analizado, están hechas usando los controles de la barra de Formularios.

Dashboard - Tablero de Comandos Excel

La lista de valores está controlado por el nombre tdPeriodos que es un rango dinámico basado en la tabla dinámica de la hoja “tdZonas” que analizaremos más adelante. Todos los nombres usados en el modelo están descritos en la hoja “Documentacion”.

La lista desplegable para elegir las zonas en la tabla Detalle por sucursal está basada en un control de la barra Cuadro de Controles (ActiveX).


Dashboard - Tablero de Comandos Excel

Los valores de la lista están controlados por el nombre “Zonas” y el valor elegido es guardado en la celda E18 quedando oculto por el control.
El valor de esta celda determina qué sucursales serán exhibidas en la tabla. Para este objetivo usamos la fórmula

=INDICE(INDIRECTO("col"&$E$18);FILA()-20)


Dashboard - Tablero de Comandos Excel

donde INDIRECTO("col"&$E$18) componen el nombre del rango dinámico que contiene las sucursales de cada zona.
Así si elegimos la zona Norte, por ejemplo, esta expresión da como resultado “colNorte”, cuya definición puede verse en la hoja Documentacion.

Los datos residen en la hoja BD (obviamente, base de datos), donde son captados con alguno de los métodos mencionados en la nota anterior.
Estos datos son elaborados por tablas dinámicas en las hojas “tdZonas” y “tdSucursales”.

Estas hojas son los verdaderos motores del modelo. Cada una de ellas contiene una tabla dinámica (de allí “td”) que totalizan los datos de acuerdo al corte necesario (por zona o por sucursal).

Los rangos de estas tablas están definidos por el mismo rango dinámico (“tdRango”, documentado en la hoja Documentacion) de manera que no haga falta actualizar el rango cada vez que agregamos datos.

Tanto la tabla de Zonas como la de Sucursales utilizan una fórmula compuesta por las funciones SUMA, INDIRECTO y DIRECCION para extraer los datos correspondientes.

La fórmula en la celda E7 es

=SUMA(INDIRECTO(DIRECCION($E$3+5;3;;;"tdZonas")&":"&DIRECCION($E$4+5;3)))

En esta fórmula $E$3 es el número de orden de la fecha de incio (así funciona el control combobox de la barra de Formularios); le sumamos 5 para ubicarnos en la fila correspondiente de la hoja “tdZonas” (ver la explicación en el párrafo siguiente).
Lo mismo con $E$4. Usamos INDIRECTO para convertir el texto resultado de DIRECCION en un rango que la sunción SUMA pueda usar.

Las listas de zonas y sucursales están ubicadas en la hoja “Parametros”.

Los gráficos de la hoja Dashboard son imágenes capturadas con la herramienta Cámara fotográfica de Excel. Los verdaderos gráficos están en la hoja “graficos”.

Dashboard - Tablero de Comandos Excel

Esta técnica nos permite no sólo controlar mejor el diseño de los gráficos sino también documentar el funcionamiento de éstos. Por ejemplo, los nombres en uso en el gráfico del detalle mensual

Dashboard - Tablero de Comandos Excel

El último elemento importante del modelo es una pequeña macro que nos asegura que cada vez que terminamos de agregar datos en la hoja BD, las tablas dinámicas sean actualizadas.
Como sabemos, las tablas dinámicas no tienen un mecanismo de actualización automático. Esta macro es un evento de la hoja BD que es disparado cada vez que desactivamos la hoja



Dashboard - Tablero de Comandos Excel




Technorati Tags:



martes, noviembre 17, 2009

Cuadro de control (dashboard) sencillo con Excel – Segunda nota

En la nota anterior vimos cómo construir un dashboard sencillo en Excel usando un control de la barra de Formularios y la función DESREF.

Vimos también que el control de la barra de Formularios tiene un serio inconveniente: no podemos establecer los parámetros dinámicamente. En nuestro ejemplo vimos que al agregar líneas a la base de datos tenemos que modificar manualmente la definición de valor máximo del control.

Para crear un modelo que se adapte automáticamente a los cambios en la base de datos tendremos que usar otro tipo de controles, los controles ActiveX.

Empezamos por reemplazar la barra de desplazamiento que pusimos ayer por el mismo control pero de la barra de herramienta Cuadro de Controles (ActiveX).
Para eso activamos la barra (Herramientas-Personalizar-Barra de Herramientas o mejor haciendo un clic con el botón derecho del mouse sobre el área de la barras de herramientas)



dashboard sencillo



Dibujamos el control en la posición deseada (tip: mantenemos apretada la tecla ALT para que los bordes del control encuadren con los bordes de las celdas).

Al dibujar el control Excel activa automáticamente el modo de Diseño (veremos que el icono con la escuadra y la regla aparece “apretado”). Estando en modo Diseño apretamos el icono Propiedades

propiedades del scrollbar

Establecemos estas propiedades:

LinkedCell = inicio (el rango control!C3 definido con ese nombre)


Min = 0

SmallChange = 1 (esto siginifica que cada vez que apretamos la flecha superior o inferior movemos una fila)

LargeChange = 12 (esto hace que si apretamos en algún punto de la barra se muevan 12 filas)

Max = por defecto aparece 32767. Este número lo manejaremos con una macro para evitar tener que editarlo con cada cambio en la base de datos.

Con el control seleccionado apretamos el icono “ver código”

acceso al módulo Vba

Esta acción abre un módulo de VBa en la hoja pertinente (la hoja Informe en nuestro caso) .

En ese módulo ponemos esta macro

Private Sub ScrollBar1_Change()
ScrollBar1.Max = Sheets("control").Range("D3")
End Sub


código del control

Antes de poder usar esta macro para controlar el valor de la propiedad Max tenemos que hacer algunos agregados a nuestro modelo:


# definimos el nombre Periodos como rango dinámico con esta fórmula


=DESREF('base de datos'!$B$3;0;0;CONTARA('base de datos'!$B:$B)-1;1)

Esto nos permitirá saber en todo momento cuantas líneas de datos hay en nuestra tabla

# en la hoja Control definimos tres celdas con nombres que contendrán las siguientes fórmulas:

B3 (control_meses) : =CONTARA(periodos)

C3 (inicio): 0 o en blanco; su valor es establecido por el control (LinkedCell)

D3(max_periodo): =control_meses-12

celdas auxiliares

Ahora podemos ver que el valor Max está determinado por la cantidad de períodos en la base de datos menos 12 (la cantidad de líneas que aparecen en el dashboard).

La rutina ScrollBar1_Change es una macro (evento) que es disparada cada vez que accionamos la barra de desplazamiento.


Nuestro modelo se adapta ahora automáticamente a medida que vamos agregando o quitando datos en la base de datos.

lunes, noviembre 16, 2009

Cuadro de control (dashboard) sencillo con Excel – Primera nota

Ya habíamos tocado el tema del uso de controles en hojas. En esta nota mostraré como crear un informe dinámico o cuadro de control (dashboard) sencillo.

En esta primera nota veremos cómo hacerlo con los controles de la barra de Formulario. Estos controles tienen la ventaja de ser sencillos de usar. La desventaja es que son poco flexibles, como veremos más adelante.

Supongamos que tenemos una lista de datos de ventas (plan y realizado) de una empresa para desde enero del 2007 hasta octubre del 2009.
Nuestro objetivo es crear este cuadro de control (dashboard)



dashboard sencillo

Hemos puesto una barra de desplazamiento que nos permite cambiar las fechas del informe con un clic en las flechas de la barra



Nuestro modelo tiene tres hojas:



base de datos en hoja Excel

informe – donde ponemos el cuadro de control y el gráfico

base de datos – que contiene los datos de ventas. Como pueden ver, las fechas están formateadas como mm-aaaa (o mm-yyyy)

control – ligaremos el control (la barra de desplazamiento) a la celda B3 de esta hoja.
También hemos definidos este nombres

inicio=control!$B$3
Ahora creamos el cuadro de control en la hoja “informe”.

cuadro de control en hoja de Excel

En el rango C3:C14 ponemos la barra de desplazamiento. Ese es el motivo por el cual la columna C es más angosta que las restantes.
Activamos la barra de herramientas de Formularios y seleccionamos la barra de desplazamiento

selección de barra de desplazamiento en Excel

La arrastramos y hacemos que coincida con el rango C3:C14. Luego abrimos el menú de formato del control

formulario del formato del control

Ponemos estos valores:
Valor actual = 0
Valor Mínimo = 0
Valor Máximo = 22
Incremento = 1
Cambio de Página = 12
Vincular con celda - control!$B$3 (o poner el nombre “inicio”)
formulario delas propiedades del control

Seguimos. En la celda B3 ponemos esta fórmula

=DESREF('base de datos'!$B$3;inicio+FILA()-3;0)


y la copiamos hasta la celda B14.
En la celda D3 ponemos la misma fórmula pero referenciando la columna C en la hoja “base de datos”

=DESREF('base de datos'!$C$3;inicio+FILA()-3;0)

y lo mismo en la celda E3, con referencia a la columna D en “base de datos”


En la celda F3 ponemos la fórmula =E3/D3-1

Copiamos todas las fórmulas al resto de la tabla. Todo lo que nos queda por hacer es crear el gráfico
gráfico dinámico en el dashboard

Este gráfico es absolutamente dinámico e irá cambiando a medida que cambien los datos en la tabla.

Este modelo tiene un serio inconveniente. Cada vez que agreguemos o quitemos filas de la base de datos tendremos que corregir manualmente las definiciones de la barra de desplazamiento. Por ejemplo, si agregamos tres meses más y no corregimos la definición del valor máximo de la barra no veremos los datos que acabamos de agregar.

Sólo después de corregir la definición del valor a 25
correción del valor Max en las porpiedades del control

veremos los nuevos datos.

Podemos hacer que el modelo se actualice automáticamente usando los controles ActiveX en lugar de los de la barra de formularios. Este será el tema de la próxima nota.



Technorati Tags:


viernes, julio 17, 2009

Transferir datos de Excel a Access - tercera nota

En las notas anteriores vimos cómo transferir datos de Excel a Access manualmente y programáticamente.

La necesidad de usar Access surge como una de las soluciones posibles cuando queremos, por ejemplo, consolidar datos de varias hojas en una única base de datos para generar a partir de ella una tabla dinámica.
Si el total de filas a consolidar supera el límite de una hoja de Excel (hasta la versión 2003 incluida, 65536 filas) no podemos almacenar los datos consolidados en una única hoja.
Si trabajamos con Excel 2007 podemos almacenar más de un millón de filas en una hoja, lo cual nos exime de tener que usar herramientas externas a Excel. Pero como más del 50% de los usuarios usa versiones anteriores a Excel 2007, almacenar datos en Access es una buena solución.

En las soluciones que muestro en las notas mencionadas suponemos que Access está instalado en la máquina del usuario. Por supuesto, éste no es siempre el caso y en esta nota mostraremos como usar Access como recipiente para nuestros datos aún cuando no esté instalado en nuestra máquina.

Empecemos por aclarar que los archivos con formato .mdb no requieren la presencia de Access para poder ser utilizados. Estos archivos están asociados con el Microsoft Jet Database Engine, que está incluido en el paquete de Office. Si bien este componente ha sido abandonado por Microsoft, sigue siendo vigente por motivos de compatibilidad.

Nuestra meta es crear dos rutinas, una para crear el archivo “.mdb” y otra para almacenar los datos de la hoja u hojas Excel en la tabla.

Nuestro primer paso es crear una referencia a

* Microsoft Ext. ADO 2.5 for DDL Security (o posteriores).
* Microsoft ActiveX Data Object 2.5 Library (o posteriores).
en el editor de VB, en el menú Tools—References



datos de Excel a Access

Un detalle a tomar en cuenta es que las macros que mostraré más adelante están construidas para el ejemplo específico de esta nota y hay que editarlas para adaptarlas a otros usos.
En nuestro ejemplo tenemos un cuaderno Excel con tres hojas. Cada hoja contiene datos de tres distintos años (2005, 2006 y 2007) que queremos consolidar en una única hoja para construir a partir de ella una tabla dinámica.
La rutina para crear el archivo “.mdb” con una tabla para almacenar los datos es la siguiente:

Option Explicit

Const dataSource As String = "provider=microsoft.jet.oledb.4.0;" _
& "data source=d:\BaseDeDatos.mdb"
Const tableName As String = "datos_export"

Sub crearDB()
Dim catalog As ADOX.catalog
Dim new_table As ADOX.Table


'crear la base de datos

Set catalog = CreateObject("adox.catalog")
catalog.Create dataSource

' crear la tabla para contener los datos

Set new_table = CreateObject("adox.table")
new_table.Name = tableName
new_table.Columns.Append "mes", adDate
new_table.Columns.Append "pais"
new_table.Columns.Append "suma", adDouble
catalog.Tables.Append new_table

End Sub

En la parte superior del módulo, antes de la rutina “crearDB” hemos definido dos constantes. Lo hacemos de esta manera ya que también en la segunda rutina haremos uso de estas constantes.
Esta macro crea una base de datos Access (BaseDeDatos.mdb) con una tabla (datos_export)

datos de Excel a Access

Ahora tenemos que exportar los datos de la hoja activa al la tabla “datos_export”, lo que hacemos con esta macro:

Sub AgregarDatos()
' exporta los datos de la hoja activa a una tabla de Access
' este procedimiento es especifico para el ejemplo.
' Para otros usos hay que adaptarlo

Dim cn As ADODB.Connection, rs As ADODB.Recordset, fila As Long

Set cn = New ADODB.Connection
cn.Open dataSource

Set rs = New ADODB.Recordset
rs.Open tableName, cn, adOpenKeyset, adLockOptimistic, adCmdTable
' all records in a table
fila = 2 ' la primer fila en la hoja despues de los encabezamientos

Do While Len(Cells(fila, 1)) > 0
With rs
.AddNew
.Fields("mes") = Range("A" & fila).Value
.Fields("pais") = Range("B" & fila).Value
.Fields("suma") = Range("C" & fila).Value
.Update
End With
fila = fila + 1 ' next row
Loop
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub


Esta rutina es la misma que hemos usado en la segunda nota de la serie, adaptada a nuestro ejemplo.


Ahora activamos la hoja cuyos datos queremos exportar y corremos la macro para cada una de las hojas que queremos consolidar.


A esta altura de los acontecimientos tenemos un archivo Access con un tabla que contiene los datos de las hojas (podemos ver que el tamaño del archivo se ha incrementado)

datos de Excel a Access

Ahora podemos crear la tabla dinámica usando la opción Fuente de datos Externa

datos de Excel a Access

En el segundo paso creamos una nueva fuente de datos, que en nuestro ejemplo llamaremos “consolidarMdb” usando el driver de Access

datos de Excel a Access


datos de Excel a Access


datos de Excel a Access


datos de Excel a Access

Después de apretar Connect, apretamos OK con lo cual hemos creado la nueva conexión. De aquí en adelante seguimos los pasos del asistente tal como hemos mostrado en esta nota.


El resultado:

datos de Excel a Access




Technorati Tags: