Hojas de cálculo en Excel - página principal

Obtener valores únicos en Excel

Vamos a explicar hoy, como podemos generar una lista con valores únicos en Excel, a través del uso de macros. Esta operación la podemos realizar de una forma muy sencilla con Excel 2007 o superior, tal y como nos explica Microsoft en este artículo, utilizando filtros avanzados. Como a nosotros nos gusta complicarnos la vida un poco, queremos que esta operación se realice sin intervención humana ;-) y de forma inmediata, en función de cuando vamos introduciendo valores en una hoja, con independencia de que a medida que los introduzcamos, estén repetidos una o mil veces, así que programaremos un sencillo macro que nos servirá para enseñárselo a nuestros compañeros de trabajo, o a nuestro jefe, y quedar como unos usuarios avanzados en Excel.

En definitiva, lo que vamos a hacer es obtener en una hoja del mismo libro, un listado de valores únicos (no repetidos), a partir de una serie de datos con valores que pueden estar o no repetidos (lo normal es que estén repetidos, para ver en funcionamiento esta utilidad) . Eso es lo mismo que decir, que vamos a eliminar todos aquellos valores duplicados que haya, para dejar un solo valor de cada dato introducido.

Para ilustrarlo de un modo gráfico, lo que pretendemos obtener es esto:


Como veis en la columna de la izquierda (tabla A), tenemos repetidos una serie de valores, en la columna de la derecha (tabla B), solo tenemos los valores únicos. Es decir, lo que haremos será eliminar los duplicados, o filtrar la tabla para que solo aparezcan los valores una sola vez.

Todo esto lo vamos a hacer introduciendo valores en la Hoja1, y en la Hoja2 es donde mostraremos los valores únicos o sin duplicados, de forma instantánea, a medida que vayamos introduciendo valores en la primera de las hojas.

Pensaréis que esto es algo complicado de obtener mediante macros, pero no, no lo es. De hecho es bastante sencillo. A pesar de que el código siempre lo comento -y esta vez no va a ser menos-, explicaré el proceso por el cual, a partir de una tabla donde vayamos introduciendo valores duplicados, obtendremos los valores únicos.

La técnica es muy sencilla. En el mismo instante en el que introduzcamos un valor en la Hoja1, nos desplazaremos a la Hoja2, a ver si ese valor está en la columna donde nos interesa que salgan los valores únicos, y si es así, volveremos a la Hoja1 sin hacer nada. Si por el contrario, el valor no está en esa columna de la Hoja2, lo que haremos será añadirlo, y volveremos a la Hoja1 para continuar introduciendo valores. Todo esto lo haremos sin darnos cuenta, pues visualmente no observaremos ningún refresco de pantalla por el cambio de la Hoja1 a la Hoja2, y de nuevo a Hoja1.

Para ello utilizaremos los siguientes códigos. Este primero, lo colocaremos en la Hoja1:


Private Sub Worksheet_Change(ByVal Target As Range)
'Al introducir un valor en la columna B,
'llamaremos al macro "valores_unicos_instantaneos"

If Not Application.Intersect(Target, Range("B:B")) Is Nothing Then valores_unicos_instantaneos
End Sub

Al modificar un dato de la columna B, se ejecutará el macro llamado “valores_unicos_instantaneos”. Ahora, en un módulo escribiremos este código:

Sub valores_unicos_instantaneos()
'Ocultamos el procedimiento
Application.ScreenUpdating = False
'si hay errores, que continúe
On Error Resume Next
'pasamos el dato que acabamos de introducir, a una variable
dato = ActiveCell
'buscamos ese dato en la Hoja2,
'y más concretamente en la columna B

With Hoja2.Range("B:B")
'buscamos el dato en esta Hoja2
Set existe = .Find(dato, LookAt:=xlWhole)
'si no existe, lo añadimos, pero antes nos
'situaremos en la primera celda donde queremos
'empezar a escribir los valores únicos

If existe Is Nothing Then
'nos situamos en la primera celda donde queremos
'empezar a escribir los valores únicos

Hoja2.Select
Range("B5").Select
'bajamos hasta encontrar una fila vacía
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
'y escribimos el dato
ActiveCell = dato
End If
End With
'subimos al principio de la tabla
Range("B5").Select
'volvemos a la Hoja1
Hoja1.Select
'mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Si hemos hecho todo correctamente, al introducir valores en la Hoja1, de una forma similar a esta, y en la que repetimos ciertos valores (hemos supuesto que introducimos el nombre los vendedores de la empresa):


Obtendremos de forma automática, y sin darnos cuenta, estos otros datos en la Hoja2:


Ahora pensaréis: “vale, muy chulo, pero ¿y si ya tengo la hoja con los datos duplicados?, ¿voy a tener que reescribirlos para que me tome sólo los valores únicos?”. La respuesta es no. No necesitarás hacer nada de eso porque hemos preparado un pequeño macro en Excel que hará el trabajo por ti. Con este sencillo ejemplo, obtendremos valores únicos, a partir de un listado donde tengamos datos duplicados. Es decir, no será necesario que introduzcamos datos para ver como se nos añaden en la Hoja2 los valores únicos, pues tan solo tendrás que ejecutar este macro:

Sub valores_unicos()
'Ocultamos el procedimiento
Application.ScreenUpdating = False
'si hay errores, que continúe
On Error Resume Next
'fichamos la celda donde estamos, para volver a ella al final
celda = ActiveCell.Address
'si en la hoja2, la celda B5 contiene datos,
'eliminamos todas las filas con datos contiguas

If Hoja2.Range("B5") <> "" Then
'seleccionamos la hoja2
Hoja2.Select
Range("B5").Select
'seleccionamos el rango contínuo hasta abajo
Range(Selection, Selection.End(xlDown)).Select
'eliminamos las filas
Selection.EntireRow.Delete
'volvemos a B5
Range("B5").Select
End If
'seleccionamos la hoja1
Hoja1.Select
'y nos situamos en B5
Range("B5").Select
'hasta que no encuentre una fila vacía...
Do While Not IsEmpty(ActiveCell)
'pasamos el dato que acabamos de introducir, a una variable
dato = ActiveCell
'buscamos ese dato en la Hoja2,
'y más concretamente en la columna B

With Hoja2.Range("B:B")
'buscamos el dato en esta Hoja2
Set existe = .Find(dato, LookAt:=xlWhole)
'si no existe, lo añadimos, pero antes nos
'situaremos en la primera celda donde queremos
'empezar a escribir los valores únicos

If existe Is Nothing Then
'nos situamos en la primera celda donde queremos
'empezar a escribir los valores únicos

Hoja2.Select
Range("B5").Select
'bajamos hasta encontrar una fila vacía
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
'y escribimos el dato
ActiveCell = dato
End If
'seleccionamos la Hoja2
Hoja2.Select
'subimos al principio de la tabla
Range("B5").Select
End With
'volvemos a la Hoja1
Hoja1.Select
'bajamos una fila
ActiveCell.Offset(1, 0).Select
'continuamos con el bucle
Loop
'volvemos a la celda donde estábamos
Range(celda).Select
'mostramos el procedimiento
Application.ScreenUpdating = True
'mostramos un mensaje si no hay errores
If Err = 0 Then mensaje = MsgBox("¡Listo!. Acabamos de hacer el " + _
Chr(10) + "trabajo que nos encargaste :-) ", vbInformation, "Trabajo hecho")
End Sub

Ese macro de Excel también nos servirá para depurar la tabla de valores únicos de la Hoja2, en el caso de que eliminemos algún dato que tenga valores únicos de la Hoja1, pues no desaparecerá de forma automática ese dato eliminado en la Hoja2. Otro caso en el que nos servirá el macro, es cuando editamos un dato ya escrito. En ese caso, la primera edición permanecerá en la Hoja2, por lo que convendrá pasarle el macro, para arreglar las modificaciones realizadas en la Hoja1.

Si este nuevo macro de Excel que acabamos de hacer, lo asignamos a un botón como se muestra en la siguiente imagen, con tan solo leer el texto del propio botón, ya sabremos que es lo que va a ocurrir al presionarlo:


Con esto podríamos dar por finalizado este trabajo, porque hemos hecho lo que pretendíamos hacer al principio, que no es otra cosa que obtener valores únicos a partir de una lista con valores duplicados, pero como nos gusta complicarnos la vida, vamos a liarla un poco más.

Vamos a añadir una columna adicional en la Hoja1, con valores numéricos, de tal forma que imaginaremos que los nombres introducidos son los de nuestros vendedores, y los importes serán la cifra de ventas de cada uno de ellos:


Y claro, ahora nos interesará obtener en la Hoja2, no solo los valores únicos, sino además, la suma de la cifra de ventas de cada uno de los vendedores, y para acabar de redondearlo, el número de acciones de venta de cada uno de ellos, es decir, el número de ventas o transacciones, que no será otra cosa que el número de veces que sale en esta Hoja1, cada uno de los vendedores. Esto podríamos conseguirlo por ejemplo, mediante el uso de una tabla dinámica, pero vamos a prescindir de ella, para hacerlo "a pelo" con macros de Excel, como siempre solemos hacer.

Comenzaremos colocando este código en la Hoja1:

Private Sub Worksheet_Change(ByVal Target As Range)
'Al introducir un valor en la columna B o C,
'siempre que tengamos el dato de laotra columna
'llamaremos al macro "valores_unicos_instantaneos"

If (Not Application.Intersect(Target, Range("B:B")) Is Nothing And ActiveCell <> "" And _
ActiveCell.Offset(0, 1) <> "") Or (Not Application.Intersect(Target, Range("C:C")) Is Nothing _
And ActiveCell <> "" And ActiveCell.Offset(0, -1) <> "") Then
'siempre que no estemos en la columna 1
If ActiveCell.Column > 1 Then
'llamamos al macro
valores_unicos_instantaneos
End If
End If
End Sub

Ese código anterior, lo que hace es evaluar si cada vez que escribimos un dato en la columna B, tenemos asociado a su derecha en la columna C, otro dato. Si así fuera, ejecutaríamos el macro llamado “valores_unicos_instantaneos”. También lanzaremos este macro si escribimos un dato en la columna C, y tenemos en su columna inmediatamente anterior otro dato (en la columna B).

Ahora colocaremos este código en un módulo:

Sub valores_unicos_instantaneos()
'Ocultamos el procedimiento
Application.ScreenUpdating = False
'si hay errores, que continúe
On Error Resume Next
'pasamos los datos a variable2
dato1 = Range("B" & ActiveCell.Row)
dato2 = Range("C" & ActiveCell.Row)
'buscamos ese dato1 en la Hoja2,
'y más concretamente en la columna B

With Hoja2.Range("B:B")
'buscamos el dato1 en esta Hoja2
Set existe = .Find(dato1, LookAt:=xlWhole)
'si no existe, lo añadimos, pero antes nos
'situaremos en la primera celda donde queremos
'empezar a escribir los valores únicos

If existe Is Nothing Then
'nos situamos en la primera celda donde queremos
'empezar a escribir los valores únicos

Hoja2.Select
Range("B5").Select
'bajamos hasta encontrar una fila vacía
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
'y escribimos los datos, comenzando por el vendedor
ActiveCell = dato1
'ahora el importe
ActiveCell.Offset(0, 1) = dato2
'ahora añadimos una venta
ActiveCell.Offset(0, 2) = ActiveCell.Offset(0, 2) + 1
'si ya existe, sumamos la cantidad, y añadimos una venta
Else
'seleccionamos la Hoja2
Hoja2.Select
'seleccionamos el valor encontrado
existe.Select
'añadimos la cantidad
ActiveCell.Offset(0, 1) = ActiveCell.Offset(0, 1) + dato2
'añadimos una venta
ActiveCell.Offset(0, 2) = ActiveCell.Offset(0, 2) + 1
End If
End With
'subimos al principio de la tabla
Range("B5").Select
'volvemos a la Hoja1
Hoja1.Select
'mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

Este macro que acabamos de implementar está muy bien, siempre que estemos introduciendo datos, pues obtendremos los valores únicos en la Hoja2. Pero como en el caso anterior, tiene un problema, y es que cuando nos equivocamos una vez introducidos el nombre del empleado y la cifra de ventas, si editamos el nombre poniendo un nuevo vendedor, nos genera una nueva línea en la Hoja2, pero sin eliminar el dato anterior. Si eliminamos una fila con un valor único en la Hoja1, tampoco nos lo eliminará en la Hoja2.

Todo esto lo podríamos haber resuelto creando un macro que evalúe toda la columna cada vez que introducimos o editamos un dato en la Hoja1, pero eso es cargar innecesariamente el programa con tareas innecesarias. La solución pasa como en el ejemplo anterior, por ejecutar el macro que os pongo a continuación -una vez finalizada la tabla de la Hoja1-, y que podemos asignar a un botón:

Sub valores_unicos()
'Ocultamos el procedimiento
Application.ScreenUpdating = False
'si hay errores, que continúe
On Error Resume Next
'fichamos la celda donde estamos, para volver a ella al final
celda = ActiveCell.Address
'si en la hoja2, la celda B5 contiene datos,
'eliminamos todas las filas con datos contiguas

If Hoja2.Range("B5") <> "" Then
'seleccionamos la hoja2
Hoja2.Select
Range("B5").Select
'seleccionamos el rango contínuo hasta abajo
Range(Selection, Selection.End(xlDown)).Select
'eliminamos las filas
Selection.EntireRow.Delete
'volvemos a B5
Range("B5").Select
End If
'seleccionamos la hoja1
Hoja1.Select
'y nos situamos en B5
Range("B5").Select
'hasta que no encuentre una fila vacía...
Do While Not IsEmpty(ActiveCell)
'pasamos los datos a variables
dato1 = ActiveCell
dato2 = ActiveCell.Offset(0, 1)
'buscamos ese dato1 en la Hoja2,
'y más concretamente en la columna B

With Hoja2.Range("B:B")
'buscamos el dato1 en esta Hoja2
Set existe = .Find(dato1, LookAt:=xlWhole)
'si no existe, lo añadimos, pero antes nos
'situaremos en la primera celda donde queremos
'empezar a escribir los valores únicos

If existe Is Nothing Then
'nos situamos en la primera celda donde queremos
'empezar a escribir los valores únicos

Hoja2.Select
Range("B5").Select
'bajamos hasta encontrar una fila vacía
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
'y escribimos los datos, comenzando por el vendedor
ActiveCell = dato1
'ahora el importe
ActiveCell.Offset(0, 1) = dato2
'ahora añadimos una venta
ActiveCell.Offset(0, 2) = ActiveCell.Offset(0, 2) + 1
'si ya existe, sumamos la cantidad, y añadimos una venta
Else
'seleccionamos la Hoja2
Hoja2.Select
'seleccionamos el valor encontrado
existe.Select
'añadimos la cantidad
ActiveCell.Offset(0, 1) = ActiveCell.Offset(0, 1) + dato2
'añadimos una venta
ActiveCell.Offset(0, 2) = ActiveCell.Offset(0, 2) + 1
End If
'seleccionamos la Hoja2
Hoja2.Select
'subimos al principio de la tabla
Range("B5").Select
End With
'volvemos a la Hoja1
Hoja1.Select
'bajamos una fila
ActiveCell.Offset(1, 0).Select
'continuamos con el bucle
Loop
'volvemos a la celda donde estábamos
Range(celda).Select
'mostramos el procedimiento
Application.ScreenUpdating = True
'mostramos un mensaje si no hay errores
If Err = 0 Then mensaje = MsgBox("¡Listo!. Acabamos de hacer el " + _
Chr(10) + "trabajo que nos encargaste :-) ", vbInformation, "Trabajo hecho")
End Sub

De tal forma que tras ejecutar ese macro en la Hoja1, sobre esta tabla con datos:


Obtendríamos esto en la Hoja2:


Como veis, con los macros podemos idear una alternativa fiable, para competir tanto a los filtros avanzados, como a las tablas dinámicas, a la hora de presentar valores únicos, y para construir tablas con un resumen de datos.

Desde aquí podéis descargar un fichero zip comprimido, con los ejemplos de Excel que hemos visto en este artículo. En el fichero comprimido se incluye tanto el libro de Excel “Valores únicos (ejemplo 1).xls”, como el libro “Valores únicos (ejemplo 2).xls”, que son los que hemos utilizado para ilustrar este artículo.



Plantillas Excel

Después del cierre de Megaupload, he colocado nuevamente y en los servidores de Mediafire, todos los ejemplos que tenía en el blog de Excel, y en los que había un libro o una plantilla en Excel para descargar.

Para ahorraros el trabajo, paso a relacionaros todos los artículos donde hay ejercicios o ejemplos con plantillas en Excel, listas para usar, y que están nuevamente online. Si hubiera algún problema con alguna descarga, o me he dejado alguna plantilla de Excel por incluir, por favor, dejad un comentario en este nuevo artículo, para poder corregirlo, y ponerlo a disposición de todos los lectores del blog.

Aprovecho también para comunicaros que en este mismo artículo, iré incluyendo los ficheros de los nuevos artículos que publique, con lo que será un post de actualización continua, y donde siempre podréis consultar de un simple vistazo, aquellos temas que más os interesen y de los que queráis bajaros algún ejemplo de Excel listo para usar.

Artículo de Excel publicadoDescarga del fichero de Excel
Obtener valores únicos en ExcelDescargar plantilla de Excel
33 utilidades para Microsoft Excel (manual en PDF)Descargar manual en PDF
Calendario emergente en ExcelDescargar plantilla de Excel
Controlar vencimientos de facturas y recibos, con descuento comercialDescargar plantilla de Excel
Buscar valores en un rango de datosDescargar plantilla de Excel
Mostrar imágenes en un formularioDescargar plantilla de Excel
Medias ponderadasDescargar plantilla de Excel
Incluir un calendario en un formularioDescargar plantilla de Excel
Calcular vencimientosDescargar plantilla de Excel
Controlar vencimientos de facturas y recibosDescargar plantilla de Excel
Préstamos según el método americanoDescargar plantilla de Excel
Préstamos con amortización de capital constanteDescargar plantilla de Excel
Calculadora de tiemposDescargar plantilla de Excel
Habilitar y deshabilitar controles de un formularioDescargar plantilla de Excel
Calcular la TAEDescargar plantilla de Excel
Préstamos y cálculo de hipotecasDescargar plantilla de Excel
Modificar datos utilizando un formularioDescargar plantilla de Excel
Protegiendo nuestros trabajos en ExcelDescargar plantilla de Excel
Introducir datos utilizando un formularioDescargar plantilla de Excel
Calendarios para imprimirDescargar plantilla de Excel
Enviar un email desde ExcelDescargar plantilla de Excel
Obtener datos de una página webDescargar plantilla de Excel
Ejecutar macro al seleccionar un elemento de un comboboxDescargar plantilla de Excel
Espacio libre y espacio total en discoDescargar plantilla de Excel
Validar la entrada de datos en un formularioDescargar plantilla de Excel
Números aleatorios no repetidosDescargar plantilla de Excel
Escribir datos de otro fichero ExcelDescargar plantilla de Excel
Formularios dinámicosDescargar plantilla de Excel
Buscar hojas ocultasDescargar plantilla de Excel
Informar de que está ejecutándose un macroDescargar plantilla de Excel
Importar datos concretos de un fichero de textoDescargar plantilla de Excel
Combinar correspondencia con Excel y WordDescargar plantilla de Excel
Calcular vencimientos reales de facturasDescargar plantilla de Excel
Combobox: sacándoles provechoDescargar plantilla de Excel
Solver: cálculo de la TIRDescargar plantilla de Excel
Combobox dependientesDescargar plantilla de Excel
Impedir que se cambie el nombre a una hojaDescargar plantilla de Excel
Evolución de un capital a interés simple y a interés compuestoDescargar plantilla de Excel
EuroconversorDescargar plantilla de Excel
Listar los ficheros de un directorioDescargar plantilla de Excel
Convertir unidades de tiempo a formato hh:mm:ssDescargar plantilla de Excel
Calcular el umbral de rentabilidad, con ExcelDescargar plantilla de Excel
Llenar dinámicamente un comboboxDescargar plantilla de Excel
Control horario: Horas normales y horas extrasDescargar plantilla de Excel
Mostrar y ocultar hojas, utilizando macrosDescargar plantilla de Excel
Mostrar imágenes asociadas a un desplegableDescargar plantilla de Excel
Validación de listas dependientesDescargar plantilla de Excel
Validación con datos en otra hojaDescargar plantilla de Excel
Crear un gráfico, con un macroDescargar plantilla de Excel
Formularios inteligentesDescargar plantilla de Excel
Más sobre las funciones de bases de datos personalizadasDescargar plantilla de Excel
Funciones de bases de datos personalizadasDescargar plantilla de Excel
Volviendo con los números aleatoriosDescargar plantilla de Excel
Sencilla aplicación en ExcelDescargar plantilla de Excel
Leer el número de serie de los discosDescargar plantilla de Excel
Leer una base de datos AccessDescargar plantilla de Excel
Calcular la letra del NIF (o del DNI)Descargar plantilla de Excel
Leer un fichero de texto planoDescargar plantilla de Excel
Impedir que se cambie el nombre al ficheroDescargar plantilla de Excel
La función BDContarDescargar plantilla de Excel
Crear hojas con un clicDescargar plantilla de Excel
Tiempo transcurrido entre dos fechasDescargar plantilla de Excel



33 Utilidades para Microsoft Excel

Hoy os presento un manual en pdf, de lo que creo que podrían ser, las 33 mejores utilidades para Microsoft Excel que he publicado en el blog. Quizás algunos de vosotros no estéis de acuerdo, y penséis que hay otros artículos en el blog que deberían incluirse en el manual. Muy probablemente tengáis razón, pero he escogido esas 33 utilidades, después de hacer muchos descartes.

Este manual con 33 utilidades para Microsoft Excel, no pretende ser un manual de cabecera, pero si un manual de consulta, especialmente ideado para aquellos lectores que quieran aprender las posibilidades de las macros en Excel. No obstante, este manual no solo incluye macros, sino que también podréis encontrar en él, funciones propias de Excel, como la TIR, y el VAN, por poner solo dos ejemplos.

El manual, como todo lo que encontrarás en este humilde blog de Excel, es gratuito y de libre distribución, por lo que puedes imprimirlo, enviárselo a tus amigos, compartirlo, y en definitiva, hacer lo que quieras con el :-)

En muchos de los artículos, podréis comprobar que al final de los mismos, hay un enlace para descargar un fichero con todo lo explicado, para que el usuario no tenga que partir de cero escribiendo el código fuente en Excel. Asimismo, se incluye un enlace a la entrada original de este blog, por si en algún momento el lector quiere acercarse hasta aquí, para ver si he realizado algún cambio o modificación en algún artículo del blog, como ha ocurrido recientemente por ejemplo, en el que explico como obtener datos de una página web.

Estas son las utilidades que he incluido en el pdf:

1. Obtener el nombre del archivo.
2. Obtener el nombre de la hoja.
3. Obtener la ruta, el nombre del fichero, y la hoja.
4. Mi primer macro en Excel.
5. Mi primer UserForm.
6. Introducir datos utilizando un formulario.
7. Modificar datos utilizando un formulario.
8. Mi primer ComboBox.
9. Sacándoles provecho a los ComboBox.
10. Macro al abrir o cerrar un libro.
11. Desproteger una hoja de cálculo.
12. Crear carpetas (o directorios), desde Excel.
13. Poner la hora en una celda.
14. Crear hojas con un clic.
15. Buscar hojas ocultas.
16. Mostrar y ocultar hojas, utilizando macros.
17. Leer una base de datos Access.
18. Simultanear filas de colores.
19. Validación con datos en otra hoja.
20. Validación de listas dependientes.
21. Control horario: horas normales y horas extras.
22. Números aleatorios no repetidos.
23. Préstamos y cálculo de hipotecas.
24. Préstamos según el método americano.
25. Préstamos con amortización de capital constante.
26. Calcular la TAE.
27. Calcular la TIR y el VAN.
28. Evolución de un capital a interés simple e interés compuesto.
29. Calcular la letra del NIF/DNI.
30. Controlar vencimientos de facturas y recibos.
31. Calcular vencimientos.
32. Obtener datos de una página web.
33. Calendarios para imprimir.

Aquí os dejo una imagen de una vista a 4 páginas, para que os hagáis una idea de lo que podéis encontrar en el pdf que podéis descargar más abajo:


Ya no os hago esperar más. Aquí tenéis el manual con las 33 utilidades para Microsoft Excel (cliquead en la imagen para descargar el manual en pdf):

Descargar el manual con 33 utilidades para Microsoft Excel

Si te ha gustado este manual en pdf, te agradecería que dejases un comentario.