miércoles, 31 de mayo de 2017

VBA: La API FoldString o como eliminar tildes

Hoy veremos un uso interesante de la función API de Windows FoldString para conseguir limpiar de tildes y otros signos nuestros textos.

Generaremos una función personalizada o UDF que hace uso de esa API, y así poder emplearla en nuestras celdas...
Para ello abrimos la ventana de código de nuestro módulo estándar y añadimos el siguiente código:

Private Declare Function FoldString Lib "kernel32" Alias "FoldStringA" _
    (ByVal dwMapFlags As Byte, _
    ByVal lpSrcStr As Long, _
    ByVal cchSrc As Long, _
    ByVal lpDestStr As Long, _
    ByVal cchDest As Long) As Long
    
Private Const MAP_COMPOSITE As Long = &H40
'

Function NoTildes(Texto As String) As String
Dim x As Integer
'generamos una cadena con un número de espacio igual al número de caracteres del texto
NoTildes = Space(Len(Texto))

'empleamos una función 'StrPtr' sin documentación
'que suele emplearse en ocasiones en nuestros proyectos de VBA
'cuando usamos ciertas funciones API
'sirven para obtener la dirección de memoria subyacente de las variables.

For x = 0 To (Len(Texto) * 2 - 2) Step 2
    'empleamos la API FoldString con sus cinco argumentos
    FoldString MAP_COMPOSITE, StrPtr(Texto) + x, 1, StrPtr(NoTildes) + x, 1
Next x
  
End Function



El resultado se observa en la imagen:

VBA: La API FoldString o como eliminar tildes



Comprobamos como ha eliminado los signos más frecuentes: tildes, diéresis o la virgulilla de la eñe...

Esta función API de Windows tiene cinco argumentos:
dwMapFlags: tipos de transformación
lpSrcStr: direcciona a la fuente de la cadena
cchSrc: tamaño de la cadena (en bytes o número de caracteres)
lpDestStr: direcciona al destino
cchDest: tamaño del destino (en bytes o número de caracteres).

siendo especialmente relevante el primero de ellos, donde identificamos el tipo de transformación. Pueden ser:
MAP_COMPOSITE: este asigna caracteres acentuados a caracteres compuestos (lo que necesitamos).
MAP_EXPAND_LIGATURES
MAP_FOLDCZONE
MAP_FOLDDIGITS
MAP_PRECOMPOSED

jueves, 25 de mayo de 2017

VBA: Macro Imprimir Word desde Excel

Un usuario preguntaba por la forma de abrir e imprimir documentos de Word desde Excel.
Para dar respuesta compondremos una sencilla macro.


Abrimos la ventana de código de nuestro módulo estándar y añadimos el siguiente código:

Sub imprime_Word_desde_Excel()
Dim objWord
'abrimos Word
Set objWord = CreateObject("Word.Application")
'mostramos o hacemos visible la aplicación
objWord.Visible = True
'si no deseamos sea visible cambiamos a FALSE
'(OJO, si queremos ver la vista previa debe estar en TRUE)

'identificamos el docx a imprimir
'y lo abrimos (recuerda que no será visible)
Dim objDoc
Set objDoc = objWord.Documents.Open("E:\excelforo\MACRO PARA IMPRIMIR DOCUMENTO WORD DESDE EXCEL.docx")

'Si queremos podemos dirigir la imrpesión por una impresora concreta
Dim ImpresoraDefecto As String
ImpresoraDefecto = objWord.ActivePrinter
objWord.ActivePrinter = "HP Deskjet 3050A J611 series"     '(Tu nombre de impresora deseada)

'activamos la aplicación (Word)
objWord.Activate

'Lanzamos la impresión
objDoc.PrintOut
'o si lo prefieres la vista previa
'objDoc.PrintPreview

'Reseteamos la impresora por defecto para futuras impresiones
objWord.ActivePrinter = ImpresoraDefecto

'cerramos el documento y la aplicación
objDoc.Close
objWord.Quit

End Sub



Bastará ejecutarla...

martes, 23 de mayo de 2017

La función FORMULATEXTO y cómo sacar datos de una fórmula

Un lector del blog consultaba por la forma de extraer información a partir de las partes que componen una fórmula.

El comentario del usuario:
[...]Se trata de conseguir extraer de una celda con una formula del tipo =500*1,25 lo que va antes del signo *. pero al usar la función hallar, como * es precisamente un comodín me sale siempre la 1ª posición y aunque le ponga hallar "*1," tampoco funciona, aunque esto no me valdría porque podría darse el caso de que se multiplique por otro numero[...]


Para dar respuesta a este problema partiremos del siguiente conjunto de celdas formuladas:

La función FORMULATEXTO



Comprobamos que existe un patrón en todas las fórmulas, donde se está realizando un producto de varios importes y que, de acuerdo a lo solicitado, necesitamos trabajar únicamente con el primero de los valores (lo que va antes del signo *).

La solución nos la dará una función poco frecuente: FORMULATEXTO.
Esta función es interesante porque nos devuelve en modo cadena de texto las fórmulas o funciones introducidas en nuestras celdas.
Precisamente esta característica es de la que nos aprovecharemos para recuperar la información que necesitamos... ya que con las funciones de texto EXTRAER y ENCONTRAR trataremos la cadena de texto devuelta, consiguiendo finalmente nuestro objetivo.



La fórmula que buscamos para obtener lo requerido es (en la celda D2):
=EXTRAE(FORMULATEXTO(B2);2;ENCONTRAR("*";FORMULATEXTO(B2))-2)
donde del texto devuelto por la función FORMULATEXTO empezamos a extraer desde la posición 2, i.e., después del igual; y extraemos los caracteres hasta la posición anterior al signo de multiplicación o asterisco...
Si lo necesitáramos, para convertir el dato devuelto a número, podríamos anidar la fórmula anterior dentro de la función VALOR.

De esta forma hemos salvado el problema del lector y el conflicto que causaba usar el asterisco como signo de búsqueda, ya que es un operador de multiplicación pero también un carácter comodín.

jueves, 18 de mayo de 2017

Iconos en las Etiquetas de datos de un gráfico

Como continuación del post anterior donde vimos algunas formas de representar gráficamente variaciones/comparaciones entre datos, hoy veremos una forma de mostrar datos comparativos empleando iconos en las etiquetas de datos de los gráficos.

Iconos en las Etiquetas de datos de un gráfico


La meta es lograr unas etiquetas de datos para nuestras serie de valores que cambie de color según aumente o disminuya frente al ejercicio anterior, mostrando además una flecha hacia arriba o hacia abajo según corresponda.

Partiremos de los datos base siguientes:

Iconos en las Etiquetas de datos de un gráfico



Un primer paso es recordar ciertas combinaciones con la tecla Alt para obtener ciertos caracteres:
Alt + 16 ►
Alt + 17 ◄
Alt + 30 ▲
Alt + 31 ▼
Alt + 254 ■

Iconos en las Etiquetas de datos de un gráfico


Con estos caracteres construiremos tres formatos personalizados de números:

Iconos en las Etiquetas de datos de un gráfico


Estos formatos de número personalizado con los iconos/caracteres los emplearemos posteriormente para formatear las etiquetas de datos de nuestro gráfico.

Siguiente paso.
Generaremos una serie de rangos auxiliares calculados:


Las fórmulas incorporados nos devolverán las diferencias de un año con el anterior, en tres series,
una por cada categoría:
1- para incrementos: (en la celda F3 y luego arrastramos en F3:F8)
=SI(E3>E2;E3-E2;NOD())
2- para igualdades: (en la celda G3 y luego arrastramos en G3:G8)
=SI(E3=E2;E3-E2;NOD())
3- para disminuciones: (en la celda H3 y luego arrastramos en H3:H8)
=SI(E3<E2;E2-E3;NOD())


Seleccionando el rango D1:H8 e insertando un gráfico de columnas apiladas obtenemos:

Iconos en las Etiquetas de datos de un gráfico



A continuación añadimos las etiquetas de datos a nuestras cuatro series.
A las etiquetas de datos de la serie 'incremento', desde el formato de etiquetas > Opciones de etiqueta > Número > Categoria 'Personalizada' > Tipo: 0" ▲" (previamente generado).



Repetimos la acción para las otras dos series restantes ('igualdad' y 'disminución'), con sus correspondientes formatos de número (0" ▼" y 0" ■"), que en los primeros pasos habíamos creado.

En estos formatos podríamos haber otorgado alguna propiedad del color de la fuente:
[Verde]0" ▲"
[Rojo]0" ▼"
y
[Azul]0" ■"

En mi caso prefiero dar color desde los formatos normales desde la Ficha Inicio > grupo Fuente > botón Color de fuente, ya que la diversidad de colores es mucho mayor!.


Acabamos aplicando un formato de relleno (Sin Relleno) para las tres series generadas



Dando por concluido nuestro gráfico.

martes, 16 de mayo de 2017

Insertar Barras Ascendentes y Descendentes en nuestros gráficos

Los gráficos en Excel son una buena herramienta para comparar información, y nos ofrece diferentes instrumentos para facilitar esta labor.
Veremos hoy un par de elementos que podemos insertar en nuestros gráficos, orientados especialmente hacia la comparativa:
1- Barras Ascendentes y Descendentes
2- Líneas de Máximos y Mínimos.
.


Si partimos de dos series de datos ('Real' y 'Presupuesto') con distintos valores, y queremos mostrar una comparativa entre ellos, dejando claro si se han producido desviaciones positivas o negativas de uno frente a otro, podemos emplear el elemento de Barras Ascendentes y Descendentes como se ve en la imagen:

Insertar Barras Ascendentes y Descendentes en nuestros gráficos



Conseguir un aspecto como el del gráfico es bien sencillo, bastará seleccionar nuestro gráfico y desde las Herramientas de gráfico > pestaña Diseño > grupo Diseños de gráfico > botón Agregar elemento de gráfico > Barras Ascendentes y Descendentes:

Insertar Barras Ascendentes y Descendentes en nuestros gráficos



Otra forma más rápida es desde el botón de añadir elementos(al lado derecho del gráfico), al final de la lista tenemos también las Barras Ascendentes y Descendentes

Insertar Barras Ascendentes y Descendentes en nuestros gráficos



Esto añade dos tipos de barras, personalizables de manera independiente desde el Formato de barras ascendentes/descendentes, lo que aprovecharemos para cambiar los colores por defecto a los deseados (como en la primera imagen del post).

De forma similar podemos incorporar otro elemento que facilita la comparación de datos: Líneas de Máximos y Mínimos:

Insertar Lineas de máximos y mínimos en nuestros gráficos



Para insertarlos accedemos a las Herramientas de gráfico > pestaña Diseño > grupo Diseños de gráfico > botón Agregar elemento de gráfico > Líneas > Lineas de máximos y mínimos:

Insertar Lineas de máximos y mínimos en nuestros gráficos


Finalizando con el formato de dichas líneas.

jueves, 11 de mayo de 2017

Agrupaciones de Fechas en Tablas dinámicas en Excel 2016

Hoy toca un sencillo tema que afecta a aquellos que trabajen con tablas dinámicas con la versión Excel 2016.
Quizá no hayas notado la diferencias, pero al trabajar con campos de tipo 'tiempo' (fechas u horas), y construir una tabla dinámica,
se produce una novedad frente a versiones anteriores: lo curioso es que de manera automática, y por defecto, nos muestra el campo agrupado!!.
Obviamente esto es una ventaja en muchas ocasiones, y nos evita realizar este paso manualmente...
Pero en ocasiones he tenido que acometer la acción contraria para desagrupar por un motivo u otro.

Lo que veremos en este post es una forma de Deshabilitar la agrupación automática de columnas de fecha y hora en tablas dinámicas.
El asunto es bastante simple (recuerda esta opción es válidad para Excel 2016!).
Accedemos a las Opciones de Excel > menú Avanzadas > sección Datos > Deshabilitar la agrupación automática de columnas de fecha y hora en tablas dinámicas

Agrupaciones de Fechas en Tablas dinámicas en Excel 2016


Marcaremos la opción para deshabilitar, y listo.

martes, 9 de mayo de 2017

Justificar relleno en rango de celdas

Todos conocemos la opción de alineado dentro de una celda que nos permite justificar dicha alineación,
pero hoy no hablaremos de esto, si no de la herramienta de Justificar habilitada dentro de las opciones de relleno.


El motivo de este post nace al hilo de la entrada publicada hace algunos días (ver) donde hablábamos del relleno rápido y de un articulo que leí en uno de los muchos grupos de Excel que sigo, donde comentaba esta opción sobre la que hablaremos (lo siento, no recuerdo el autor).

Lo primero es localizar la herramienta en la ficha Inicio > grupo Edición > botón Rellenar > Justificar

Justificar relleno en rango de celdas



El sentido de esta herramienta es permitir realizar la justificación al ancho de las columna a partir de una celda o un rango de ellas (a diferencia de la justificación de la alineación que trabajo únicamente sobre el contenido de una sola celda)
Veamos un ejemplo sobre un texto distribuido en varias celdas de una misma columna, con un ancho de columna amplio...

Justificar relleno en rango de celdas


Si seguimos el camino indicado:
ficha Inicio > grupo Edición > botón Rellenar > Justificar
obtendremos el siguiente resultado

Justificar relleno en rango de celdas



Recuerda que manda el tamaño de la columna o bien del número de columnas seleccionadas!!

A la inversa ocurre lo mismo, esto es, si partimos de una frase, se descompondrá de acuerdo al ancho del destino (columna o columnas seleccionadas!!):

Justificar relleno en rango de celdas



Sin duda una interesante alternativa a la justificación e incluso al relleno rápido.

jueves, 4 de mayo de 2017

Cerrar todos los libros de Excel en un clic

Presentaré hoy una breve entrada del blog donde explicar las maneras para cerrar todos los libros de Excel abiertos con un clic.

Es importante que releeamos este post publicado hace algún tiempo, donde se habla del cambio importante en la forma de trabajar que se produjo al aparecer la versión 2013 con diferentes instancias de la aplicación...

Esto influye de maenra directa en el tema de hoy: cerrar todos los libros de una vez, ya que con las versiones anteriores a 2013 bastaba acceder al menú archivo > botón Salir

Cerrar todos los libros de Excel en un clic


Esta acción permitía cerrar todos los libros abiertas en esa instancia... obviamente preguntando, en los casos oportunos, si deseábamos guardar los cambios.
Terminando con el cierre de la aplicación.


Al cambiar el modo de trabajar con diferentes instancias desde la versión Excel 2013, dicho botón 'Salir' desaparece, siendo sustituido por uno de 'Cerrar'...
En realidad actúa de forma similar a versiones anteriores, cierra la aplicación y por ende todos los libros de esa instancia (al ser Excel 2013 y + solo podrá ser un solo libro).


Un primer truco en estas nuevas versiones es trabajar desde la barra de herramientas de Windows, haciendo clic derecho con el ratón sobre los iconos de Excel:

Cerrar todos los libros de Excel en un clic


Se observa como aparece la opción de Cerrar todas las ventana, lo que nos lleva a nuestro objetivo de cerrar todos nuestros libros abiertos.

Otra posibilidad sería extraer el comando de 'Cerrar todo' en la barra de herramientas de acceso rápido, el cual realizará la acción buscada:

martes, 2 de mayo de 2017

Habilitar el Análisis Rápido en Excel 2013 y 2016

Cuando trabajas con las versiones de Excel 2013 y superiores y seleccionas un rango aparece la herramienta de Análisis rápido, la cual ofrece diferentes opciones para generar o insertar, a partir de la selección:
1-formatos condicionales
2-gráficos
3-totales
4-tablas
5-minigráficos

Habilitar el Análisis Rápido en Excel 2013 y 2016



Sin duda es una buena forma de acceder de manera rápida y ágil a dichas herramientas...

Pero y qué si no queremos que aparezca ese 'cuadradito' y me ofrezca dichas opciones?

Habilitar el Análisis Rápido en Excel 2013 y 2016



Para deshabilitar/habilitar este botón de análisis rápido iremos a las Opciones de Excel desde la ficha Archivo, y desde el menú General > sección Opciones de interfaz de usuario (la primera) > marcaremos/desmarcaremos la opción: Mostrar opciones de análisis rápido durante la selección

Habilitar el Análisis Rápido en Excel 2013 y 2016