martes, 25 de noviembre de 2014

Formación Excel para empresas y particulares.

Aumenta tu productividad... última oportunidad!
Aprende con los mejores y adquiere una buena base: Edición de Cursos de Excel y Macros online con tutor personal de Diciembre de 2014.


Los cursos de Excel y Macros abiertos para este mes de Diciembre son:

Curso Excel Avanzado

(ver más)

Curso Macros Medio

(ver más)



Curso Macros Iniciación

(ver más)

Curso Excel Nivel Medio

(ver más)


Curso Tablas dinámicas en Excel

(ver más)

Curso preparación MOS Excel 2010 (Examen 77-882)

(ver más)


Curso Excel Financiero

(ver más)



Esta nueva edición de Cursos de Excel y macros en modalidad elearning (online) comienzan el día 1 de Diciembre de 2014; y la matrícula estará abierta hasta el día 10.

Excelforo: con la confianza de siempre....estás a tiempo!!

También formación Excel a empresas. Explota los recursos a tu alcance (ver más).


Informarte sin compromiso en cursos@excelforo.com o directamente en www.excelforo.com.

lunes, 24 de noviembre de 2014

Gráfico de un Reloj analógico en Excel

Tiempo atrás vimos cómo construir un vistoso reloj 'literal' (ver).
En el día de hoy aprenderemos a construir un reloj analógico en Excel, lo que conseguiremos con un gráfico tipo dispersión, al que posteriormente agregaremos un procedimiento Sub (una macro) para que nuestras manecillas se mueven de acuerdo al paso del tiempo...


Lo primero será insertar un Gráfico de dispersión con líneas rectas y marcadores (o sólo con líneas rectas.. según el gusto). Lo haremos sin marcar ningún rango!!.
A este gráfico le cambiaremos el nombre y llamaremos 'GraficoAnalogico':

Gráfico de un Reloj analógico en Excel


Recordemos que este tipo de gráfico de dispersión nos pide un valor para el eje X y otro para el eje Y, con el que construimos el par ordenado que representa un punto en nuestro plano...

En el siguiente paso agregaremos tres series de datos desde Seleccionar Datos, a las que llamaremos: 'Secundero', 'Minutero' y 'Horas', sin incorporar ningún valor X o Y en ellos:

Gráfico de un Reloj analógico en Excel



Repetimos la misma acción para las otras dos series... con lo que tendremos:


Repito, todas ellas con los valores por defecto (vacío para X y {1} para Y)...

En la siguiente etapa configuramos las etiquetas de ambos ejes, para conseguir que el punto (0,0) quede en el centro del gráfico... para ello desde Dar formato al eje modificamos las Opciones del eje en cuanto a sus límites, dejándolo en el intervalo -1,2 a 1,2 .. para el eje horizontal y eje vertical:

Gráfico de un Reloj analógico en Excel



Cuadramos visualmente nuestro gráfico.. por ejemplo, con una dimensión:
alto:=12,7 cm
ancho:=14,8 cm
por supuesto, al gusto del usuario...


Siguiente etapa... agregamos etiquetas de datos a nuestras tres series.. pero sólo al punto exterior, NO al punto (0,0)... podemos Agregarlo y luego borrarlo.

Gráfico de un Reloj analógico en Excel



Incorporamos en un módulo de nuestro proyecto VBA los siguientes procedimientos:

Dim Paso As Double

Sub InicioReloj()
    ActualizaReloj
End Sub

Sub ParadaReloj()
'Cancela el eventoe OnTime y para nuestro Reloj analógico
On Error Resume Next
Application.OnTime Paso, "ActualizaReloj", , False
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sub ActualizaReloj()
'Actualizamos nuestro reloj
Dim Reloj As Chart
Set Reloj = Sheets(1).ChartObjects("GraficoAnalogico").Chart

'PARÁMETROS RELOJ ANALÓGICO
Const PI As Double = 3.14159265358979
Dim SeriesGrafico As Series
Dim s As Series
'definimos dos matrices para construir los vectores
'que representarán las manecillas del reloj....
'Array x para los valores X de las series
Dim x(0 To 1) As Variant
'Array y para los valores Y de las series
Dim y(0 To 1) As Variant

'Secundero
    Set SeriesGrafico = Reloj.FullSeriesCollection("Secundero")
    'construimos el vector para los segundos
    x(0) = 0
    x(1) = 0.99 * Sin(Second(Time) * (2 * PI / 60))
    y(0) = 0
    y(1) = 0.99 * Cos(Second(Time) * (2 * PI / 60))
    'asignamos un par a los valores de X de la Serie Secundero
    SeriesGrafico.XValues = x
    'asignamos un par a los valores de Y de la Serie Secundero
    SeriesGrafico.Values = y
    'completamos la etiqueta de datos con la lectura de los segundos....
    SeriesGrafico.Points(2).DataLabel.Text = Second(Time) & " s"

'Minutero
    Set SeriesGrafico = Reloj.FullSeriesCollection("Minutero")
    'construimos el vector para los minutos
    x(0) = 0
    x(1) = 0.8 * Sin((Minute(Time) + (Second(Time) / 60)) * (2 * PI / 60))
    y(0) = 0
    y(1) = 0.8 * Cos((Minute(Time) + (Second(Time) / 60)) * (2 * PI / 60))
    'asignamos un par a los valores de X de la Serie Minutero
    SeriesGrafico.XValues = x
    'asignamos un par a los valores de Y de la Serie Minutero
    SeriesGrafico.Values = y
    'completamos la etiqueta de datos con la lectura de los minutos....
    SeriesGrafico.Points(2).DataLabel.Text = Minute(Time) & " m"
    
'Manecilla de las horas
    Set SeriesGrafico = Reloj.FullSeriesCollection("Horas")
    'construimos el vector para las horas
    x(0) = 0
    x(1) = 0.4 * Sin((Hour(Time) + (Minute(Time) / 60)) * (2 * PI / 12))
    y(0) = 0
    y(1) = 0.4 * Cos((Hour(Time) + (Minute(Time) / 60)) * (2 * PI / 12))
    'asignamos un par a los valores de Y de la Serie Horas
    SeriesGrafico.XValues = x
    'asignamos un par a los valores de Y de la Serie Horas
    SeriesGrafico.Values = y
    'completamos la etiqueta de datos con la lectura de las horas....
    SeriesGrafico.Points(2).DataLabel.Text = Hour(Time) & " hr"
    
'Configuramos cada nuevo paso del reloj cada segundo,
'lo que controlamos con TimeValue
Paso = Now + TimeValue("00:00:01")
Application.OnTime Paso, "ActualizaReloj"
End Sub



Añadimos un par de botones de fórmulario para controlar el Comienzo y Parada de nuestro Reloj, a los que le asignamos las macros 'InicioReloj' y 'ParadaReloj':

miércoles, 19 de noviembre de 2014

VBA: Cómo añadir descripciones de ayuda a nuestras funciones personalizadas (UDF) en Excel 2010 y +.

Un tema recurrente en los habituales de la programación de VBA para Excel siempre ha sido poder incorporar a nuestras funciones personalizadas, los textos descriptivos a cada argumento de la función (UDF), de manera simialr a como aparecen en el resto de funciones estándar.

Aprovechando la cuestión planteada por un usuario daremos solución al tema:

...Necesito saber cómo puedo programar mis propios tooltips en las funciones personalizadas de Exel que yo haga, igual como se muestran cuando uno digita cualquier función de Excel, que muestra en un recuadro y marcado con negrita los diferentes argumentos que se usan en cada función.
Ya sé crear mis propias funciones pero solo me falta agregarles ese detalle que lo considero importante...



Hace ya bastante tiempo expliqué, en versiones en versiones anteriores cómo asignar una UDF a una categoría dentro de la biblioteca de funciones o como incorporarle una descripción general...ver; sin embargo hoy, y para versiones de Excel 2010 y superiores, veremos como Microsoft ha habilitado un mayor control sobre nuestras funciones, permitiendo, fácilmente añadir descripciones para nuestros diferentes argumentos.

Partiremos de una sencilla UDF creada por nosotros, por ejemplo:

Function FxExcelforo(Texto1 As String, Texto2 As String, Separador As String) As String
'Devuelve una cadena que se creó uniendo subcadenas contenidas en una matriz.
FxExcelforo = Join(Array(Texto1, Texto2), Separador)
End Function



El siguiente código lo añadiremos nuestro código asociándolo a un Módulo; para ello accederemos a la ventana de código del explorador del editor de VBA. Es importante ejecutarlo para ver reflejados los cambios sobre nuestra UDF:

Sub DescribeFxExcelforo()
'A ejecutar una vez para añadir características a nuestra función

'definimos las variables a emplear...
Dim NombreFx As String
Dim DescripFx As String
Dim Categoria As String
'generamos una matriz de 3 elementos, uno por cada elementos/argumento de nuestra función
Dim DescripArgumentos(1 To 3) As String

'les asignamos valor
NombreFx = "FxExcelforo"
DescripFx = "Devuelve concatenada los dos primeros argumentos, empleando el caracter 'separador'."
Categoria = 7 'La categoría incluye nuestra función personalizada como tipo TEXTO
DescripArgumentos(1) = "Primera Cadena de texto a unir."
DescripArgumentos(2) = "Segunda Cadena de texto a unir."
DescripArgumentos(3) = "Caracter empleado como 'Separador'"

'Aplicamos el método MacroOptions
Application.MacroOptions _
   Macro:=NombreFx, _
   Description:=DescripFx, _
   Category:=Categoria, _
   ArgumentDescriptions:=DescripArgumentos      'nuevo parámetro del método
        'que inserta las descripciones de los argumentos de una UDF
        'que se muestran en el cuadro de diálogo Argumentos de función.
End Sub



Tras ejecutar nuestro procedimiento Sub, veremos en la ventana diálogo de la función, las diferentes descripciones añadidas para cada argumento, así como la descripción general de la función.... como vemos en la imagen siguiente:

VBA: Cómo añadir descripciones de ayuda a nuestras funciones personalizadas (UDF) en Excel 2010 y +.



Observamos remarcado en amarillo la descripción del argumento, y en rojo la descripción general de la función.. coincidente con los textos indicados en el procedimiento 'DescribeFxExcelforo'.

lunes, 17 de noviembre de 2014

Búsqueda vertical concatenada.

Daré respuesta a una compañera de un grupo de LinkedIn al que pertenezco, en el que planteaba una alternativa a una búsqueda sobre dos columnas.
...Tengo el siguiente planteamiento:
En la primera hoja tengo dos códigos en dos columnas diferentes, y necesito localizar esa pareja de dos códigos en otra hoja y si existe obtener la fecha que está en otra columna de esa segunda hoja.
La cuestión es se os ocurre cómo hacerlo SIN MACROS?
Lo he intentado con un SI, con Y, y con COINCIDIR pero en el momento que se encuentra primero un código en una fila y el otro código en otra fila distinta ya no me da el resultado...

Imaginemos el planteamiento de inicio siguiente:

Búsqueda vertical concatenada.



El tema es claro, debo encontrar y mostrar en F1:F10 las fechas correspondientes al par de valores compuesto por las columnas A1:A10 y B1:B10... sin columnas auxiliares

Para un caso como este ofrezco dos alternativas: una matricial y otra estándar.

Vamos con la matricial.
En F1 escribiríamos:
=VALOR(DERECHA(BUSCARV(E1;$A$1:$A$10&$B$1:$C$10;2;0);LARGO(BUSCARV(E1;$A$1:$A$10&$B$1:$C$10;2;0))-1))
y ejecutamos presionando Ctrl+Mayusc+Enter, luego copiamos y pegamos al resto del rango.

La clave del asunto es cómo hemos construido la matriz de búsqueda:
$A$1:$A$10&$B$1:$C$10
que como vemos en la imagen siguiente nos concatena la primera columna, una a una, con la dos siguientes:

Búsqueda vertical concatenada.



El resto de la fórmula es fácil de entender, aplicamos la función BUSCARV que encuentra en nuestra primera columna 'virtual' el código completo, retornándonos el valor correspondiente de la segunda columna, compuesto de un caracter y la fecha (precisamente lo que queremos conseguir).
De ahí que ese valor devuelto lo tratemos con la función de texto DERECHA y acabemos anidando el resultado parcial con la función VALOR, para convertirlo en número y a través del formato en fecha.


La otra forma que mencionaba al principio, se basa en la hipótesis que no hay dos combinaciones iguales, esto es, que son códigos únicos (al igual que en el planteamiento anterior).
La fórmula buscada podría ser la conocida SUMAR.SI.CONJUNTO:
=SUMAR.SI.CONJUNTO($C$1:$C$10;$A$1:$A$10;IZQUIERDA(E1;1);$B$1:$B$10;DERECHA(E1;LARGO(E1)-1))
en la que descomponemos el código completo para buscar la combinación en el rango origen...


Por supuesto hay más formas, por ejemplo empleando nuestros recurridos INDICE y COINCIDIR:
=INDICE($C$1:$C$10;COINCIDIR(E1;$A$1:$A$10&$B$1:$B$10;0))

miércoles, 12 de noviembre de 2014

Búsqueda doble sobre cualquier parte de una tabla de Excel.

Aunque parece un tema más que trillado, en el ejercicio de hoy iremos un paso más allá...
Buscaremos un elemento sobre cualquier parte de una tabla o rango de celdas y retornaremos el valor correspondiente a esa fila que deseemos.

...Necesito generar una fórmula similar al buscarv, pero que tenga los siguientes argumentos:
=buscador(A6:F10,"Miranda","nombre")
Es decir, la macro debe analizar toda la base de datos hasta encontrar a "Miranda" y arrojar como resultado su valor equivalente de la columna "nombre":



la idea es, por tanto, clara.. buscaremos en la totalidad de nuestra tabla el valor buscado (que podrá estar en cualquier fila o columna!!), y una vez localizado, obtendremos su equivalente al nombre de campo indicado.

Como se aprecia en la imagen en la celda H6 hemos añadido una Validación de datos tipo Lista en la que desplegaremos el nombre del campo del que queremos obtener el resultado.
Mientras que en I6 escribiremos cualquier valor único (en caso de duplicados fallaría nuestra fórmula) que realmente queremos localizar en cualquier parte de nuestra tabla (rango A6:F10):


La fórmula matricial deseada aparece en J6:
=INDIRECTO(DIRECCION(K.ESIMO.MAYOR(SI(($I$6=$A$7:$F$10)*1=1;FILA(A7:F10);0);1);COINCIDIR($H$6;$A$6:$F$6;0)))


Fijémonos de la potencia de esta fórmula.. ya que con ella no necesito indicar en qué columna debe encontrar nuestro valor buscado (celda I6), puesto que lo busca en toda la tabla... para localizar la fila donde se halla.
Posteriormente, aprovechándonos de la Validación de datos en H6 y de la ya conocida función COINCIDIR obtenemos la celda con el resultado final.

La clave de esta matricial reside en el primer argumento de la función DIRECCION:
K.ESIMO.MAYOR(SI(($I$6=$A$7:$F$10)*1=1;FILA(A7:F10);0);1)
donde con el condicional SI:
SI(($I$6=$A$7:$F$10)*1=1;FILA(A7:F10);0)
obtendríamos una matriz de ceros y un número de fila, para el caso o celda donde se de la coincidencia con el valor buscado. Forzamos que el condicional nos devuelva el número de la fila en cuestión.

Podemos ver, a parte, el resultado de esa matriz:

Búsqueda doble sobre cualquier parte de una tabla de Excel.



Lo siguiente es sencillo.. basta aplicar la función K.ESIMO.MAYOR (xxxx; 1) para conseguir el valor más alto (el número de fila buscado) -también valdría la función MAX-.

Con esto y daría respuesta a la lectora del blog, sin emplear macros...
De todas formas, en una entrada posterior, daré el código para resolver esto con una función VBA personalizada.

lunes, 10 de noviembre de 2014

El principio de Pareto con tablas dinámicas en Excel.

El Principio de Pareto (ver) establece unas reglas de reparto (de hecho se le conoce como regla de 20-80) económico sobre la riqueza.. aunque hoy en día se extrapola a otros aspectos o ciencias.
Es importante no quedarse con esas cifras aproximadas o iniciales del reparto 'pocos de mucho' y 'muchos de poco' (80%-20%), pero si en el sentido último de la concentración estadística que nos podemos encontrar.
En el ejemplo de hoy veremos como construir, y visualizar esta teoría, empleando tablas y gráficos dinámicos.
Partiremos de un listado de diez productos con un número de unidades dispuestas de manera aleatoria:

El principio de Pareto con tablas dinámicas en Excel.



Sobre estos datos demostraremos ciertamente la concentración de la mayoría (mayor número de unidades) en manos de unos pocos (pocos productos).. siempre sin buscar esos porcentajes mágicos 80%-20%.

En primer lugar construiremos una Tabla dinámica sobre nuestro origen de datos A1:B11. Agregaremos el campo 'Productos' al área de filas, y dos veces el campo 'Unidades' al área de valores:

El principio de Pareto con tablas dinámicas en Excel.



El siguiente paso consiste en ordenar los productos, en sentido descendente (de mayor a menor) según la suma de unidades, para lo cual desplegamos el filtro del campo Productos y más Opciones de ordenación:

El principio de Pareto con tablas dinámicas en Excel.



Con los valores ordenados de mayor a menor

El principio de Pareto con tablas dinámicas en Excel.

actuaremos ahora sobre el segundo campo de unidades, donde aplicaremos la opción de Mostrar valores como... % del total en...:

El principio de Pareto con tablas dinámicas en Excel.



Con la tabla dinámica ya construida, generaremos nuestro gráfico dinámico, teniendo la precaución de llevarnos la segunda serie (la que hemos mostrado como % del total) al eje secundario y cambiar el tipo de gráfico de columnas a líneas...

El principio de Pareto con tablas dinámicas en Excel.

con este resultado:

El principio de Pareto con tablas dinámicas en Excel.



Observamos cómo se concentra la mayoría de unidades sólo en cuatro de los productos.. en la línea del principio de Pareto, y esto con valores aleatorios!!.

miércoles, 5 de noviembre de 2014

Escala de tiempo en Excel 2013.

Toca hoy una novedad de la versión 2013 de nuestro Excel: la Escala de tiempo.
Esta interesante herramienta, categorizada dentro de los filtros, tiene similitudes con otra funcionalidad de Excel como es la Segmentación de datos.
La ventaja principal de esta Escala de tiempo es que en lugar de investigar con los filtros para mostrar las fechas, podemos usar una escala de tiempo a partir de una tabla dinámica... esto es, poder jugar con deslizables o botones sobre cualquier unidad temporal.
Esta escala de tiempo consiste, básicamente, en un cuadro a agregar desde nuestra tabla dinámica y que nos permitirá filtrar por tiempo y acercarnos al período que deseemos.
Para activarlo, con una Tabla dinámica activa (que tenga al menos un campo de fechas), haremos clic en la ficha Insertar > grupo Analizar > Insertar escala de tiempo:

Escala de tiempo en Excel 2013.



Veamos su uso sobre un ejemplo. Partiremos de una tabla como origen de datos con información simple resumida en tres campos: Fecha, Zona y Ventas.
Sobre esta tabla construiremos una Tabla dinámica y un gráfico dinámico como vemos en la imagen siguiente:

Escala de tiempo en Excel 2013.



Como decíamos en un párrafo anterior, con la tabla dinámica activa (o el gráfico dinámico) navegaremos por la ficha Insertar > grupo Analizar > Insertar escala de tiempo, lo que nos abrirá una ventana identificando aquellos campos que contenga fechas (en nuestro ejemplo sólo uno, el campo Fecha):

Escala de tiempo en Excel 2013.



Tras seleccionar el/los campos elegidos y Aceptar se mostrará sobre nuestra hoja de cálculo un cuadro con opciones de filtro de diferentes unidades de tiempo conectada con nuestra taba y gráfico dinámico:

Escala de tiempo en Excel 2013.



Lo primero que debemos saber a nivel de configuración de esta Escala de tiempo es que la unidad temporal es seleccionable, para ello en el botón arriba a la derecha indicaremos nuestra unidad de tiempo

lunes, 3 de noviembre de 2014

Control de Agenda en Excel.

Una lectora hace unos días me planteaba la forma de mostrar en una agenda (construida en Excel) las diferentes tareas programadas, según hora y sala de reunión.
Después de darle unas vueltas, conseguí solucionar el problema (sin macros), empleando unas fórmulas matriciales en columnas auxiliares.


Comencemos el desarrollo viendo cual es el origen de datos del que partimos: Una tabla de información con cinco campos (tabla que he llamado TblRegistros):

Control de Agenda en Excel.


Nuestro objetivo es llegar a la siguiente imagen, esto es, a conseguir se complete la distribución de las tareas programadas según sala, día y hora:

Control de Agenda en Excel.



Para ello crearemos las siguientes columnas auxiliares.
Comenzaremos por la columna G, con la siguiente matricial (seleccionando el rango completo G5:G25):
=INDICE(TblRegistros;COINCIDIR(Hoja1!$C$3+Hoja1!$B$5:$B$25&sala;TblRegistros[FECHA Y HORA]&TblRegistros[SALA];0);4)

De igual forma seleccionando H5:H25 introducimos la matricial:
=INDICE(TblRegistros;COINCIDIR(Hoja1!$C$3+Hoja1!$B$5:$B$25&sala;TblRegistros[FECHA Y HORA]&TblRegistros[SALA];0);5)
(recuerda ejecutarlas matricialmente!!!)


Con estas funciones obtenemos el Inicio y Final de cada tarea desde el origen de datos, en concreto la información registrada para la Tarea concreta en las columnas Hora Inicio y Hora Término

En la siguiente etapa completamos la columna E, escribimos la función BUSCARV en su forma de búsqueda aproximada en la celda E5 para luego arrastrar hasta E25:
=BUSCARV(B5;$G$5:$G$25;1;1)
conseguimos, entonces, detallar para cada hora del día la Hora de Inicio: