miércoles, septiembre 16, 2009

Selecciones múltiples en Excel basadas en un valor

Ya hemos visto en el pasado cómo realizar selecciones múltiples usando Ir A (F5 o Ctrl+G). El problema surge cuando queremos hacer una selección múltiple basándonos en algún valor.
Por ejemplo, después de importar un informe del sistema ERP en mi empresa, tuve la necesidad de borrar todas las filas cuyas celdas en la columna A contengan la palabra “Total”.

Pongamos un ejemplo reducido



Selecciones múltiples en Excel

Necesitamos borrar todas las líneas con totales para poder usar los datos en una tabla dinámica.
Una solución posible es escribir una macro que haga la tarea. Pero el blog Bacon Bits trae una sugerencia mucha más sencilla y todo el crédito va para él.


Empezamos por seleccionar el rango relevante, en nuestro caso A1:A14. Abrimos el menú Buscar y reemplazar (Ctrl+B o Edición—Buscar) y en la casilla Buscar ponemos “Total” (o la palabra o combinación de valores que queremos usar). Apretamos Buscar todo



Selecciones múltiples en Excel

Todas las celdas aparecen en la ventanilla del diálogo pero sólo la primera en la lista está seleccionada (con un fondo azul). Apretamos Ctrl+E para elegir todas las celdas de la lista (o apretando Mayúsculas señalamos la última celda en la lista)



Selecciones múltiples en Excel

Al hacer esto, todas las celdas que contienen la palabra “Total” son seleccionadas.

Apretamos Cerrar y poniendo el marcador del mouse sobre una de las celdas seleccionadas abrimos el menú contextual con el botón derecho.

Elegimos Eliminar y Toda la fila y apretamos Aceptar

Selecciones múltiples en Excel

Eso es todo!

Selecciones múltiples en Excel


De la misma manera podemos aplicar un fondo de color a las celdas seleccionadas, o borrar el contenido, etc.







Technorati Tags:

martes, septiembre 08, 2009

Encontrar el encabezamiento en una matriz con Excel

Supongamos esta tabla de datos, que muestra la ubicación de ciertos agentes en ciertas zonas por día de la semana


matriz en Excel

Para encontrar qué agente estará en qué zona en determinada fecha podemos usar una fórmula como ésta

=INDICE(agentes,COINCIDIR(C12,fechas,0),COINCIDIR(C13,zonas,0))


dónde usamos los nombres

agentes =indice!$C$3:$F$9


fechas =indice!$B$3:$B$9


zonas =indice!$C$2:$F$2


Es decir, dados los valores de la fecha y la zona en la matriz, podemos encontrar el agente.
Pero la pregunta es, ¿cómo encontramos la zona sabiendo la fecha y el agente? Es decir, ¿en qué zona se encontrará Roberto el 04/09/2009? Es decir, tenemos que hacer una búsqueda “hacia arriba”.


Empezamos por agregar dos nuevos nombres para hacer más legible nuestra fórmula


tabla =zona!$C$3:$F$10
agente =zona!$C$4:$C$10

En la celda C13 ponemos la fecha, en la celda C14 el nombre del agente y en la celda C15 esta fórmula:

=DESREF(tabla,0, COINCIDIR(C14, DESREF(tabla,COINCIDIR(C13,fechas,0),0,1,COLUMNAS(tabla)),0)-1,1,1)

matriz en Excel

Para explicar esta fórmula veamos cuál es la función de cada uno de sus componentes.

Empezamos con


=DESREF(tabla,COINCIDIR(C13,fechas,0),0,1,COLUMNAS(tabla))


Si ponemos esta fórmula en un rango de una fila por cuatro columnas obtenemos los nombres que corresponden a la fecha en la matriz (nótese que entrado la fórmula como matricial)

matriz en Excel

La formula anterior es uno de los argumentos de


=COINCIDIR(C14, DESREF(tabla,COINCIDIR(C13,fechas,0),0,1,COLUMNAS(tabla)),0)


Si pegamos esta fórmula en una celda veremos que el resultado es 4

matriz en Excel

ya que el valor de C14 es “Mario” y este valor es el cuarto en el vector que hemos obtenido con la fórmula anterior.


Si reducimos ahora la fórmula en C15 a =DESREF(tabla,0,4) vemos que el “ancla” de DESREF la celda C3, con 0 filas des desvío y 4 columnas a la derecha.




Technorati Tags:

domingo, septiembre 06, 2009

Mostrar y ocultar líneas de división en Excel 2003

Las líneas de división (o cuadrícula, como ha sido traducido en Excel 2007) aparecen por defecto en las hojas de Excel. Consideraciones de diseño y/o presentación pueden hacer necesario ocultar las líneas de división en la hoja.

En Excel 2007 hacemos esto con un único clic en el icono correspondiente de la pestaña Diseño de Página de la cinta


líneas de división en Excel 2007

En Excel clásico (versión 2003 y anteriores) la cuestión en más trabajosa.

Tenemos que usar el menú Herramientas-Opciones, ir a la pestaña Ver y quitar la marca de la opción Líneas de División.

líneas de división en Excel 2003

En Excel clásico (versión 2003 y anteriores) la cuestión en más trabajosa. Tenemos que usar el menú Herramientas-Opciones, ir a la pestaña Ver y quitar la marca de la opción Líneas de División.


Si usamos con frecuencia esta opción en Excel clásico podemos crear un atajo con una macro sencilla que luego podemos asociar a un icono que pondremos en alguna de las barras de herramientas existentes.

La macro es muy sencilla y la ponemos en un módulo del cuaderno Personal.xls, de manera que esté disponible para todo cuaderno de Excel


Sub lineas_division()

If ActiveWindow.DisplayGridlines = True Then
ActiveWindow.DisplayGridlines = False
Else
ActiveWindow.DisplayGridlines = True
End If

End Sub


El lugar adecuado para poner un icono ligado a la macro es la barra de herramientas de Formato. Para hacerlo seguimos los siguientes pasos:

1 – Abrimos el menú Ver-Barra de Herramientas-Personalizar. En la pestaña de Comandos elegimos la categoría Macros

líneas de división en Excel 2003

2 – Arrastramos el “smiley” al lugar indicado y abrimos el menú contextual con un clic del botón derecho. Activamos la opción Asignar Macro y elegimos la macro apropiada

líneas de división en Excel 2003


líneas de división en Excel 2003

3- Volvemos a abrir el menú contextual, ponemos un texto adecuado en Nombre y cambiamos la imagen del icono

líneas de división en Excel 2003

A partir de ahora tenemos un nuevo icono en la barra de herramientas Formato que nos permite poner o quitar las líneas de división con un solo clic.

líneas de división en Excel 2003




Technorati Tags:

sábado, agosto 29, 2009

Redondeo condicional de horas en Excel

Al trabajar con horas en Excel, por ejemplo en una plantilla horaria, suele surgir la necesidad de redondear los intervalos por múltiplos de minutos. Por ejemplo, si pagamos por medias horas o por intervalos de 15 minutos.

En la nota sobre redondeo de horas en Excel mostré algunas técnicas para esta tarea con la función REDONDEAR. La regla general es

=REDONDEAR(A1*(60/m*24),0)/(60/m*24)

donde m es la cantidad de minutos en el múltiplo y la celda A1 contiene la hora a redondear.

También podemos usar la función REDOND.MULT de esta manera

=NSHORA(HORA(A1),REDOND.MULT(MINUTO(A1),m),0)

Si necesitamos redondear hacia arriba o hacia abajo podemos usar las funciones MULTIPLO.SUPERIOR o MULTIPLO.INFERIOR respectivamente.

Para redondear hacia arriba usamos la fórmula

=NSHORA(HORA(A1),MULTIPLO.SUPERIOR(MINUTO(A1),m),0)

Para redondear hacia abajo usamos

=NSHORA(HORA(A1),MULTIPLO.INFERIOR(MINUTO(A1),m),0)


Otra variante es redondear hacia arriba o hacia abajo condicionalmente.

Por ejemplo, los primeros 15 minutos son ajustados hacia abajo; a partir del minuto 16 se ajusta hacia arriba.

Supongamos que hasta los primeros 15 minutos queremos ajustar hacia la hora pasada más cercana y a partir del minuto 16 hacia la hora próxima.

Para calcular este ajuste usamos una fórmula con la función SI, donde

A1 contiene la hora a evaluar

A2 el intervalo de ajuste (15 minutos en nuestro caso)

=SI(MINUTO(A1)<=A2,NSHORA(HORA(A1),MULTIPLO.INFERIOR(MINUTO(A1),60),0),NSHORA(HORA(A1),MULTIPLO.SUPERIOR(MINUTO(A1),60),0))

En esta fórmula usamos la constante 60 ya que ajustamos por horas completas. Buen fin de semana!

Technorati Tags:

martes, agosto 18, 2009

Valores más frecuentes en una matriz

Esta nota es producto de la consulta de uno de mis lectores, Xisco, quien también, al final de cuentas, aportó una de las soluciones.

Dados un rango o matriz de valores Excel permite calcular el valor más frecuente con facilidad usando la función MODA. Por ejemplo, dada esta matriz de valores (5 columnas X 10 filas = 50 valores aleatorios entre 1 y 10)


valores frecuentes en matriz Excel

si incluimos el rango de la matriz en el nombre “matriz”, usamos esta fórmula para calcular el valor más frecuente (10, que aparece 9 veces)

=MODA(matriz)

valores frecuentes en matriz Excel

El valor de la celda I3 lo calculamos con =CONTAR.SI(matriz,I2).


La pregunta es cómo calculamos el segundo valor más frecuente, o el tercero, etc.


Excel no tiene una función nativa para este cálculo. Mi primera aproximación al problema fue usar columnas auxiliares (técnica que siempre recomiendo ya que hace que los modelos sean más legibles y fáciles de controlar).


Creamos un rango auxiliar que contiene todos los valores únicos que aparecen en la matriz ( en nuestro caso, de 1 al 10) y paralelamente un rango auxiliar que calcula la frecuencia de cada valor

valores frecuentes en matriz Excel

Vemos que, efectivamente, el 10 aparece 9 veces y el segundo valor más frecuente es el 1 con 8 apariciones.


Incluimos el rango B14:B23 en el nombre “valores” y el rango C14:C23 en el nombre “frecuencia”. En la celda I5 ponemos el número de orden de frecuencia buscado (2 por ejemplo) y en la celda I4 ponemos esta fórmula


=INDICE(valores,COINCIDIR(K.ESIMO.MAYOR(frecuencia,I5),frecuencia,0))

valores frecuentes en matriz Excel

En esta fórmula la función K.ESIMO.MAYOR busca el número más grande del rango “frecuencia” de acuerdo al parámetro introducido en la celda I5; luego busca en que fila del rango se encuentra usando la función COINCIDIR y este resultado es usado por la función INDICE para dar el valor adecuado del rango “valores”.


En esta solución hemos usado dos columnas auxiliares (“valores” y “frecuencia”).

El estimado Xisco propone una solución que use sólo una columna auxiliar (o ninguna, si los números vienen ordenados en una sola fila o columna). Dado que en nuestro ejemplo los números están dispuestos en una matriz, debemos transformarlos primero en una columna. Para esto podemos usar la técnica que hemos mostrado en la nota sobre cómo convertir datos de matriz a columna o fila en Excel.


En la celda B13 ponemos esta fórmula


=DESREF(matriz,RESIDUO(FILA()-14,FILAS(matriz)),TRUNCAR((FILA()-14)/FILAS(matriz)),1,1)


que copiamos hasta la celda B63, es decir 50 filas. Este rango lo incluimos en el nombre “valores2”. El resultado es un rango de 1 columna por 50 filas que contiene todos los calores que aparecen en las 50 celdas de la matriz.


Ahora reemplazamos la fórmula de la celda I6 por la siguiente:


=INDICE(valores2,COINCIDIR(K.ESIMO.MAYOR(FRECUENCIA(valores2,valores2),I5),FRECUENCIA(valores2,valores2),0))

valores frecuentes en matriz Excel

La bastante obvia pregunta es: ¿se puede hacer el mismo cálculo sin columnas auxiliares? Por supuesto, con una UDF (función definida por el usuario). Pero, ¿puede hacerse sin usar Vba (macros)?


Toda sugerencia será bienvenida.


Technorati Tags:

jueves, agosto 06, 2009

Determinar colores en el formato personalizado de números

Uno de los blogs que sigo, Bacon Bits, trae una nota sobre cómo determinar el color de un formato personalizado de números.

En notas anteriores he explicado que podemos determinar el color de un formato de número condicionalmente.

Por ejemplo, si queremos que la fuente de todo número superior a 1000 sea verde, números menores de 500 aparezcan en rojo y los restantes en negro. podemos usar este formato personalizado

[Verde][>1000]General;[Rojo][<500]general;[negro]general

Excel formato numerico personalizado



Convengamos que nuestra idea del verde es diferente de la que parece tener Microsoft.

Una solución es renunciar al verde y usar el azul

Excel formato numerico personalizado

Otra solución es usar el número de índice del color en la paleta en lugar del nombre explícito del color. De esta manera tenemos total control del color de la fuente.


El único problema a resolver es saber cuál es el número de índice del color que queremos usar. Para averiguar el número de índice del color podemos usar la técnica que mostramos con las macrofunciones de XLM o una macro como ésta:

Sub nr_color()
    Dim cell As Range, rngNrColor As Range
    
    Set rngNrColor = Application.InputBox(prompt:="select range", Type:=8)
    
    For Each cell In rngNrColor
        cell.Offset(0, 1).Interior.ColorIndex = cell.Value
    Next
    
End Sub


En una hoja creamos un rango con una serie de números del 1 al 56 (por ejemplo A1:A56), corremos la macro y obtenemos esta lista (para facilitar la visualización he divido el rango en tres columnas)

Excel formato numerico personalizado

Para usar el verde cuyo número de índice (en mi paleta) es el 10, modificamos el formato personalizado de esta manera

[Color10][>1000]General;[Rojo][<500]general;[negro]general>

Excel formato numerico personalizado

Es decir, usamos “Color” y el número de índice.


Technorati Tags:

miércoles, agosto 05, 2009

Contar condicional de números con celdas en blanco

En ciertas situaciones Excel puede llevarnos a cometer errores difíciles de detectar. Este ejemplo es la “vida real”, es decir, de un compañero de trabajo.

Supongamos que tenemos un rango de nueve celdas, cinco de las cuales contienen números y las cuatro restantes en blanco



contar condicional con celdas en blanco

La fórmula =SUMA(B2:B10) da como resultado 150. Es decir, las celdas en blanco son consideradas ceros o ignoradas por la función SUMA.


Lo mismo sucede si usamos la función CONTAR para contar cuántos números hay en el rango. =CONTAR(B2:B10) da como resultado 5. Lo mismo con función CONTARA.


Todo esto nos puede llevar a pensar que si queremos contar cuántos números distintos de cero hay el rango, todo lo que tenemos que hacer es usar la función CONTAR.SI de esta manera


=CONTAR.SI(B2:B9,"<>0")


Esta fórmula da como resultado 9. Este resultado es un tanto extraño. Veamos qué pasa si creamos una columna auxiliar con la fórmula =B2<>0 (que copiamos a los largo del rango)

contar condicional con celdas en blanco

Vemos que obtenemos cinco VERDADERO y cuatro FALSO. Es decir, podríamos esperar que el resultado de CONTAR.SI en nuestro caso sea 5, pero como vemos es 9.


En nuestro caso, es muy fácil percibir que el resultado no es el esperado, pero si analizamos un rango grande, digamos mil celdas, es más que probable que aceptemos el resultado como correcto.


En caso de tener que contar condicionalmente números en un rango que contiene o puede contener celdas en blanco, podemos usar alguna de estas soluciones:

# usar la función CONTAR.BLANCO para “corregir el resultado de CONTAR.SI


=CONTAR.SI(B2:B10,"<>0")-CONTAR.BLANCO(B2:B10)


# usar la fórmula matricial

={SUMA(--(B2:B10<>0))}

(recordemos una vez más que las fórmulas matriciales deben ser introducidas apretando simultáneamente Ctrl+Mayúsculas+Enter)

# usar la función SUMAPRODUCTO:

=SUMAPRODUCTO(--(B2:B10<>0))



Technorati Tags:

sábado, agosto 01, 2009

Formato indeseado de número en Excel

Cuando introducimos un valor en una celda, Excel intenta determinar el tipo de valor y darle el formato adecuado. Por ejemplo, si escribimos 1/2 en una celda Excel lo transforma al primero de febrero del año corriente

formato numérico en Excel

Lo mismo sucede si el valor contiene un guión.

Si el número (de hecho, un conjunto de cifras) contiene dos puntos o las letras A o P antecedidas por un espacio, el valor es transformado en hora

formato numérico en Excel

Si ingresamos un número que contiene ceros iniciales, Excel elimina los ceros y convierte el valor en número. Además y como ya hemos visto, si el número excede las 12 cifras Excel aplica el formato científico y si se exceden las 15, las cifras supernumerarias son transformadas en ceros. Esto último lo he vivido en carne propia hace varios años atrás cuando tuvimos que ingresar números de tarjetas de crédito (que tienen 16 cifras).

El remedio a este tipo de situaciones es darle el formato adecuado al rango de celdas que vamos a usar, evitando así que Excel decida por su cuenta. Existen también algunos trucos de teclado, en caso que queramos ahorrarnos el proceso de dar formato a las celdas.

# Si queremos ingresar números con ceros iniciales o códigos de tarjetas de crédito debemos darle al rango el formato Texto. Otra alternativa es poner un apóstrofe al comienzo (por ejemplo, '00001509).

# Si queremos ingresar fracciones debemos dar el formato Fracción o escribir la parte entera de la fracción, dejar un espacio y escribir el resto de la expresión. Por ejemplo, para escribir 2 1/3, escribimos 2, apretamos la barra de espacios e inmediatamente 2/3

formato numérico en Excel

Nótese que en la barra de las fórmulas el valor aparece como 2,3333333333

Si queremos ingresar una fracción de tipo x/y, por ejemplo 3/4 escribimos en la celda 0 3/4

formato numérico en Excel


# Si queremos ingresar una expresión que indica relación entre dos valores, por ejemplo 5:6, debemos formar la celda como Texto o anteceder la expresión con un espacio (o apóstrofe).

lunes, julio 27, 2009

Números grandes en Excel – segunda nota

Excel guarda los números con un límite de precisión de 15 cifras. Esto se hace evidente cuando introducimos un número de más de 15 cifras. Veamos qué pasa cuando introducimos el número 123456789123456789 (18 cifras) en una celda a la cual le hemos de antemano el formato de número para evita que Excel ponga el formato científico automáticamente




Al apretar Enter todas las cifras a la derecha de la posición 15 son convertidas en ceros.
El mismo problema existe cuando la parte fraccional de un número supera las 15 cifras.


Por lo general esta limitación no es significativa, en especial si usamos Excel para cálculos financieros. Si necesitamos operar con mayor precisión de la que permite Excel dos posibilidades son:


# - descargar el complemento xlPrecision


# - utilizar los conceptos esbozados por Tushar Metha en esta nota



La ventaja del complemento xlPrecision es que también soluciona el problema precisión y redondeo que existe en Excel.



Es este el problema de la conversión binaria (no sólo de Excel) que se hace evidente con este ejemplo: restamos 4.0 de 4.1



formato númerico en Excel

Aparentemente el resulta es el correcto: 0.1. Veamos qué pasa cuando formamos la celda para que muestre más de 15 decimales





El resultado no es exactamente 0.1.





Technorati Tags:

miércoles, julio 22, 2009

Números grandes en Excel – primera nota

Un lector me consulta cómo hacer en Excel para que cuando introducimos un número grande éste no se convertido en forma automática a la notación científica.

Por ejemplo, si introducimos el número 123456789123 en una celda, lo que veremos en pantalla es 1.23457E+11



formato númerico en Excel

Esta consulta involucra en realidad dos temas:


# formato automático de números en Excel (cómo exhibe Excel los números en la pantalla)


# cálculos con números de más de 15 cifras significativas.


En esta nota tocaremos el primer tema, y dejaremos el segundo para una futura nota.


Empecemos por ver un ejemplo donde nuestro número tiene por lo menos 12 cifras, pero menos de 15.


Volviendo a nuestro ejemplo (que tiene 12 cifras) veamos qué significa 1.23568E+11.

La notación E+11 es una forma abreviada de escribir el número. Esta notación nos dice que hemos tomado el número y lo hemos divido por 10 elevado la potencia de 11 (es decir 100,000,000,000).


Cuando se trata de números grandes, Excel pone el formato científico automáticamente si la celda está formada como General (el formato por defecto de Excel).

Si queremos evitar que Excel ponga el formato científico tenemos que dar un formato de número a la celda antes de ingresar el número. Si el número tiene menos de 15 cifras, podemos cambiar el formato después de haber introducido el número.


En esta imagen podemos ver que si bien los números en la columna A aparecen en notación científica, Excel los “ve” tal como son; en la columna B vemos los mismos números introducidos en celdas previamente formadas con formato numérico

formato númerico en Excel

Ahora veamos una “curiosidad” de Excel cuando se trata de números grandes

formato númerico en Excel

En las celdas A1:A2 hemos puesto el número 123456789123 que Excel exhibe como 1,23457E+11. En la barra de fórmulas podemos ver que sólo se trata de exhibición; Excel sigue “viendo” el número tal como la introducimos en la celda. En el rango B1:B2 ponemos el mismo número pero previamente hemos formado las celdas como Número.


Ahora usaremos el icono de aumentar decimales para agregar un decimal en las celdas A1 y A2


Como puede observarse, se ha producido una pérdida de precisión. Ahora el número en las celdas, tanto en el rango A1:A2 como en B1:B2, es 123456800000!

formato númerico en Excel

Hasta aquí hemos usado un número de menos de 15 cifras. ¿Qué paso cuando usamos un número de más de 15 cifras?


En la celda A1 introducimos el número 123456789123456789 (18 cifras)

formato númerico en Excel


Sin embargo, el número que aparece en Excel después de apretar Enter es 123456789123456000


Es decir, las últimas tres cifras han sido reemplazadas por ceros!. Toda cifra después de la posición 15, será convertida a cero. Esto se debe a una limitación, no solamente de Excel, que será explicada en la próxima nota sobre el tema.


Lo que debemos saber a esta altura de los acontecimientos es que:


# Excel tiene una limitación de precisión si el número excede las 15 cifras significativas


# para introducir números de más de 15 cifras debemos convertirlos en texto, ya sea anteponiendo un ' o dando el formato Texto a la celda antes de introducir el número.


Esto genera un serio problema si tenemos que realizar cálculos con números grandes. Como enfrentarnos a estos problemas 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:

viernes, julio 10, 2009

Lista desplegable con ajuste automático en Excel

Esta es una variante de la técnica que mostré en la nota sobre cómo agregar valores únicos en una lista desplegable con validación de datos.

Un lector me presenta el siguiente caso: ha creado una lista desplegable que muestra una lista de facturas. ¿Cómo hacer para que las facturas abonadas vayan desapareciendo de la lista desplegable?

Supongamos que esta es la lista de las facturas

lista desplegable Excel

En el rango B6:B19 aparecen los números de las facturas y en el rango C6:C19 si han sido pagadas (señalado con la palabra “pagada).

En nuestro ejemplo, queremos crear una lista desplegable que sólo muestre aquellas facturas que no han sido pagadas

lista desplegable Excel

Por supuesto, queremos que esta lista sea dinámica, es decir que cuando pongamos “pagada” al lado de una factura, ésta desaparezca de la lista
.
La solución consiste en crear dos columnas auxiliares y una tercera que será la que contenga los valores válidos para la lista.

Empezamos por crear la primer columna auxiliar en el rango E6:E19.

lista desplegable Excel

En la celda E6 ponemos esta fórmula

=SI(LARGO(C6)=0,FILA(),"")

y la copiamos a todo el rango.

Esta columna nos da un “número de orden” que es de hecho un número entero único (el número de fila) que identifica a las facturas que aún no han sido pagadas.

Ahora agregamos una segunda columna auxiliar en el rango F6:F19 con esta fórmula

=INDICE($B$6:$B$19,COINCIDIR(K.ESIMO.MENOR($E$6:$E$19,FILA()-5),$E$6:$E$19))


lista desplegable Excel

Como puede verse, sólo las facturas pendientes aparecen en la lista.
Tenemos un pequeño problema y es que cuando una factura ha sido pagada el valor de la fórmula es #NUM!.
Si usáramos el rango F6:F19 para crear la lista de los valores, también el error #NUM! aparecería en ella lo cual es poco elegante.

Una de las soluciones es crear una tercera columna en el rango G6:G19 con la fórmula

=SI(ESERROR(F6),"",F6)

lista desplegable Excel

Este rango es el que usamos para definir la lista de valores válidos. Creamos el nombre "lista"


lista desplegable Excel

Ahora usamos validación de datos para crear la lista desplegable en la celda C2


lista desplegable Excel

Si quitamos la palabra “pagada” en alguna celda, la factura correspondiente aparecerá automáticamente en la lista; si agregamos “pagada”, la factura desaparecerá.

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.

Technorati Tags: