miércoles, 31 de julio de 2013

Las funciones trigonométricas en Excel.

Han sido varias veces en los últimos meses que me han llegado consultas sobre cómo trabajar con las funciones trigonométricas en nuestra hoja de cálculo. Es por ese motivo que me he decidido a escribir hoy.
Lo primero que haré será recordar un concepto fundamental para el trabajo con estas funciones: los ángulos... y es que exiten varios tipos de grados:
1- centesimales (divide una circunferencia completa en 400 grados)
2- sexagesimales (divide una circunferencia completa en 360 grados, la más habitual)
3- radianes (divide una circunferencia completa en 2Pi (2Π))

Esto es clave, ya que Excel trabaja en sus funciones trigonométricas empleando ángulo medidos en radianes!!!; asi que la primera función importante a mostrar es:
=RADIANES(grados centesimales)
aplicando la operación grados radianes = grados centesimales x PI / 180.
Lógicamente existe el sentido inverso, y para convertir grados radianes en grados sexagesimales emplearemos la función:
=GRADOS(radianes)

Podemos empaparmos de este mundo trigonométrico en la Wikipedia, prestando atención no solo a las medidas angulares, si no también al concepto de las diferentes funciones: SENO, COS, TAN...

Para una comprobación manual de los resultados devueltos por nuestras funciones de Excel, podemos leer esta Tabla de las funciones trigonométricas de los ángulos (ver), aunque hay muchas más...


Veamos en la imagen algunos cálculos fáciles de comprobar:

Las funciones trigonométricas en Excel.


No es la intención explicar el sentido matemático de la trigonometría, si no tan sólo presentar la forma adecuada de hacerlo con Excel, vuelvo a recordar que es empleando grados radianes, y dejaremos para los expertos en el tema otras explicaciones.

jueves, 25 de julio de 2013

Cursos Macros y Excel Avanzado online con tutor personal. Edición Agosto 2013.

Presento la edición de Cursos de Excel y Macros online con tutor personal de Agosto de 2013.
No dejes pasar el verano sin más... aprende Excel!!!


Los cursos de Excel y Macros abiertos para el proximo Agosoto a los mejores precios son:

Curso Macros Iniciación

(ver más)

Curso Macros Medio

(ver más)

Curso Excel Avanzado para versiones 2007/2010

(ver más)

Curso Excel Nivel Medio

(ver más)

Curso Excel Financiero

(ver más)

Curso Tablas dinámicas en Excel

(ver más)

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

(ver más)


Esta nueva edición de Cursos de Excel y macros en modalidad elearning (online) dará comienzo el próximo día 1 de Agosto de 2013.
Con la confianza de siempre....Anímate!!

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.

martes, 23 de julio de 2013

VBA: La macro de un cronómetro en Excel.

Hace bastante tiempo tenía ganas de exponer este sencillo uso del método OnTime (que ya vimos en el pasado ver OnTime). Recientemente un usuario me preguntaba sobre un modelo similar y recordé que lo tenía pendiente...
En el día de hoy aplicaremos este método en la construcción de un sencillo cronómetro, con un botón de Inicio y otro de Paro. Con la combinación de cuatro procedimientos (muy cortos), basados en el método OnTime, conseguiremos iniciar un cronómetro por segundos. Veamos en la imagen su funcionamiento:

VBA: La macro de un cronómetro en Excel.


Vemos dos botones a los que he llamado 'Lanzar contador' y 'Parar contador', a los cuales he asociado los procedimientos Sub 'InicioContador' y 'ParaContador' respectivamente, y que veremos a continuación.

En un módulo del Editor de VBA añadiremos las líneas de nuestra macro.

Option Explicit
Dim SegundoSiguiente As Date, ComienzaContador As Date

Sub ParaReloj()
    On Error Resume Next
    'con OnTime programamos la ejecución de un procedimiento en un momento concreto
    'en concreto, al parar desactivamos el evento Ontime
    Application.OnTime SegundoSiguiente, "ActualizaReloj", , False
End Sub

Sub ActualizaReloj()
    'Ponemos el tiempo transcurrido en la celda C2
    Worksheets("Tiempo").Range("C2").Value = Now - Worksheets("Tiempo").Range("A2").Value
    'Lanzar el siguiente evento 1 segundo después (total seg dia = 86.400 = 60seg x 60min x 24hrs)
    SegundoSiguiente = Now + (1 / 86400)
    
    'Programa la ejecución de un procedimiento a una hora especificada,
    'ya sea a una hora específica o después del transcurso de un período de tiempo específico
    'expresión.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
    Application.OnTime SegundoSiguiente, "ActualizaReloj"
End Sub

Sub InicioContador()
    'llamamos al procedimiento ActualizaReloj, es decir, comenzamos la cuenta de segundos...
    ActualizaReloj
    ComienzaContador = Now
    'con FormatDateTime y vbLongTime damos formato de fecha según configuración equipo
    Worksheets("Tiempo").Range("A2").Value = FormatDateTime(ComienzaContador, vbLongTime)
    'limpiamos la celda B2
    Worksheets("Tiempo").Range("B2").ClearContents
End Sub

Sub ParaContador()
    'detenemos el proceso ActualizaReloj, llamando al procedimiento ParaReloj
    ParaReloj
    'calculamos el tiempo transcurrido una vez parado el tiempo.
    
    'con FormatDateTime y vbLongTime damos formato de fecha según configuración equipo
    Worksheets("Tiempo").Range("B2").Value = FormatDateTime(Now(), vbLongTime)
    Worksheets("Tiempo").Range("C2").Value = _
    FormatDateTime(Worksheets("Tiempo").Range("B2") - Worksheets("Tiempo").Range("A2"), vbLongTime)
End Sub



Como se puede observar los procedimientos Sub 'ActualizaReloj' y 'ParaReloj' son los encargados de incrementar el temporizador (el cronómetro) de segundo en segundo y de pararlo. El resto de procedimientos se encargan principalmente de asignar formatos...

jueves, 18 de julio de 2013

Abrir archivos automáticamente al iniciar Excel.... sin macros.

La entrada de hoy es un apunte sencillo para recordar cómo podemos configurar nuestro Excel par que nos abra automáticamente, al iniciarlo, ciertos archivos. Logicamente, tendremos que ser precisos, y especificar la carpeta que contenga dichos Libros de trabajo.
Supongamos nuestros documentos de Excel están contenidos en la siguiente ruta:
E:\excelforo
y en ella se encuentran tres ficheros que siempre queremos abrir, pues son nuestros libros de trabajo diarios, y siempre comenzamos nuestra sesión abriendolos manualmente.

Nos podremos ahorrar esa acción rutinaria indicando, desde las opciones de Excel dónde se encuentran esos libros. Para ello accederemos a las Opciones de Excel > Avanzadas > Sección General:


En el cuadro habilitado Al inicio, abrir todos los archivo en: escribiremos nuestra ruta (donde se hallen los Libros que deseamos abrir automáticamentte).
Listo. La próxima vez que iniciemos nuestra aplciación Excel, se abrirán los ficheros contenidos en esa ruta...

Sólo una precaución. Excel intentará abrir TODOS los archivos de la carpeta indicada, sean o no de formatos Excel.

martes, 16 de julio de 2013

Desplazar el valor del eje de un gráfico en Excel.

En la entrada anterior (ver) vimos como interacturar con un control de formulario (tipo Barra de desplazamiento) sobre el aspecto de un gráfico.
Hoy veremos una técnica similar que persigue mostrar una sección de los valores a representar, segmentando un continuo de las etiquetas del eje horizontal. Para ello deberemos trabajar con los Nombres definidos aplicados a la construcción de la Serie de datos (método ya empleado en otras entradas del blog, por ejemplo).


Veamos el efecto a conseguir:

Desplazar el valor del eje de un gráfico en Excel.



Comencemos el trabajo. La idea es clara, tenemos muchos datos y no queremos mostrarlo todos a la vez, ya que quedaría demasiado aglutinado.
El primer paso será construir el tipo de gráfico que mejor nos convenga, en este caso he optado por un sencillo gráfico de columnas; para tal cosa seleccionamos todo el origen de datos A2:B32 y desde la ficha Insertar > grupo Gráficos > Columnas > Columna agrupada.
Configuramos algo el diseño, eliminando la Leyenda y el Título de gráfico (si es nuestro deseo), añadimos las etiquetas de datos a la serie y adaptamos las etiquetas del eje horizontal, hasta que consigamos un gráfico como este:

Desplazar el valor del eje de un gráfico en Excel.



Fuera del área del gráfico añadimos una barra de desplazamiento horizontal (control de formulario) con la siguiente configuración:

jueves, 11 de julio de 2013

Un gráfico de dial completo.

Hoy veremos algo sencillo, pero no por eso menor aparente. Construiremos un gráfico de Dial, es decir, un gráfico que replica el movimiento circular dentro de una circunferencia completa, desde 0% al 100%.. movimiento que forzaremos desde un Control de formulario tipo Barra de desplazamiento.
Vemos en la imagen nuestro objetivo:

Un gráfico de dial completo.



La idea de esta entrada es doble, por un lado asociar el movimiento de un gráfico desde un Control de formulario, y por otro como 'engañar' al gráfico para que nos represente la flecha indicadora...

Comencemos construyendo las fórmulas del rango B1:E2. En primer lugar en B2 convertimos el valor de la celda devuelta por el control en tanto por ciento:= A2/100.
Sobre ese valor de la celda B2, que es precisamente el valor a representar, configuramos el resto de valores...
En C2:=+B2-D2 indicaremos el rango gráfico a representar a la izquierda de la flecha; mientras que en D2 indicamos con el fijo 1% el ancho de la flecha; terminamos en E2:=1-C2-D2 calculando por diferencia lo que queda hasta completar el 100%.

Por otro lado hemos insertado un control de formulario tipo Barra vertical de desplazamiento, indicando que recorra valores de 1 a 100, incrementando de 1 en 1 y vinculando el control con la celda A2.
Vemos el punto de partida en l aimagen siguiente:

Un gráfico de dial completo.



Para construir nuestro gráfico bastará seleccionar el rango C2:E2 e insertar el gráfico tipo Circular (desde la Ficha Insertar > grupo Gráficos > botón Circular > tipo Circular).
Eliminamos a continuación Leyenda y Título del gráfico (si hubiera aparecido).
Seleccionamos los puntos de la Serie que hemos llamado en el ejemplo 'Previo' y 'Último' y cambiaremos el relleno de la forma a 'Sin relleno', por ejemplo haciendo clic derecho sobre los puntos y seleccionando color de fondo 'Sin relleno'.

El gráfico está listo, sólo queda darle mejor aspecto enmarcando la circunferencia, para lo cual insertaremos en el gráfico una autoforma de una Elipse, que manualmente ajustaremos al borde que recorrerá el puntero que hemos dejado visible:

Un gráfico de dial completo.


Ojo!... para extender la forma (elipse) desde el centro lo haremos manteniendo presionada la tecla Ctrl.

El último detalle sería añadir la etiqueta de datos. Para ello seleccionamos el punto llamado 'Puntero' y añadiremos Etiqueta de datos en el centro. A continuación seleccionaremos dicha etiqueta y desde la barra de fórmulas lo vincularemos al valor de la celda B2 (el valor que realmente queremos representar):

martes, 9 de julio de 2013

VBA: Obtener listado de permutaciones de una cadena.

Han sido bastantes las ocasiones que me han preguntado por la obtención de las diferentes combinaciones, variaciones y/o permutaciones de elementos, y siempre les he derivado por la alta complejidad del asunto hacia otras páginas de expertos en la materia, como John Walkenbach, del cual he obtenido el código de esta entrada.

La meta de esta entrada es mostrar cómo podemos conseguir un listado de todas las permutaciones posibles (sin repetición!) en base a una cadena (de texto o numérica).
Es fundamental tener claro de qué estamos hablando al referirnos a las Permutaciones, para lo cual adjunto un link de una explicación clara y sencilla de este concepto (ver).
En ella no sólo vemos el método de cálculo para conocer el número de permutaciones (con o sin repetición) de ciertos elementos, si no unos listados mostrados de cuáles son... y de eso trata este post, como llegar a construir dichos listados.


En un mismo módulo del Editor de VBA añadiremos las líneas de nuestra macro, la cual tenemos partida en dos procedimientos.
Procedimiento 1:

Dim FilaIni As Integer

Sub IntroducirCadena()
Dim texto As String
'introducimos el texto con el que permutar sus caracteres
texto = InputBox("Introduce un texto para obtener sus permutaciones" & vbCrLf & _
"(entre 2 y 7 caracteres):")
'controlamos el número/longitud del texto a permutar
If Len(texto) < 2 Then Exit Sub
If Len(texto) >= 8 Then
    MsgBox "Te has pasado... demasiadas permutaciones!"
    Exit Sub
Else
    'limpiamos la columna A
    'ya que será donde añadiremos el resultado de las permutaciones
    ActiveSheet.Columns(1).Clear
    'damos valor a la variable FilaIni
    'que posteriormente se incrementará
    'para añadir las permutaciones en la columan A en filas consecutivas
    FilaIni = 1
    'y ejecutamos la macro Permutar
    Call Permutar("", texto)
End If
End Sub


Procedimiento 2:

Sub Permutar(x As String, y As String)
Dim i As Integer, j As Integer
'medimos la longitud del texto a permutar
j = Len(y)
'si tuviera 2 o más caracteres
'recorreriamos los diferentes caracteres mezclándolos
If j < 2 Then
    Cells(FilaIni, 1) = x & y
    FilaIni = FilaIni + 1
Else
    'aquí se produce la mezcla e intercambio de elementos
    'permutándolos...
    For i = 1 To j
        Call Permutar((x & Mid(y, i, 1)), (Left(y, i - 1) & Right(y, j - i)))
    Next
End If
End Sub

Vemos cómo el Procedimiento 1 'IntroducirCadena' nos pide una cadena, que es controlada por ese mismo procedimiento, en caso de cumplir las condiciones dadas llamamos al Procedimiento 2 'Permutar', que es quien genera el listado en la hoja de cálculo. La clave de este código es el bucle generado:

For i = 1 To j

Call Permutar((x & Mid(y, i, 1)), (Left(y, i - 1) & Right(y, j - i)))

Next

donde se realiza todo el proceso de creación y ordenación de los elementos, es decir, de las permutas de elementos dados. El procedimiento es algo parecido a una rotación de los difernetes elementos 'permutando' el orden por la izquierda y derecha.
Al ejecutar la macro, aparecerá el InputBox solicitando una cadena (texto o número) que tras evaluar mostrará en la columna A de la hoja activa:

VBA: Obtener listado de permutaciones de una cadena.

Nos podemos fijar que efectivamente los resultados mostrados correspondene en número al total de permutciones calculadas para un número ese elementos en la celda D2 con la fórmula: =PERMUTACIONES(LARGO(A1);LARGO(A1)) Obviamente la obtención del listado para permutaciones con repetición se complica bastante más, y seguiré dejándoselo para los grandes expertos ;-)

jueves, 4 de julio de 2013

VBA: Diferencias entre las propiedades .Formula, .Value y .Text del objeto Range.

Han sido varias las ocasiones en que algún alumno me ha preguntado sobre las semejanzas o diferencias entres las propiedades del objeto Range: .Formula, .Value y .Tex; en apariencia muy similares y muchas veces con resultados idénticos.
Las diferencias son escasas y sólo salen a relucir cuando existen ciertas condiciones. Hoy aprenderemos a trabajar con éstas.


Comenzaremos con la propiedad .Formula, empleada habitualmente para introducir fórmulas en nuestras hojas de cálculo, por ejemplo:
Range("C1").Formula = "=SUM(A1:B1)"

o bien en su forma local:
Range("C2").FormulaLocal = "=SUMA(A2:B2)"

Esta propiedad .Formula nos devuelve o establece un valor de tipo Variant que representa la fórmula del objeto en notación de estilo A1 y en el lenguaje de la macro (.FormulaLocal hace lo mismo en el lenguaje de nuestra instalación).
Las condiciones en las que esta propiedad funciona serían:
  1. Si la celda contiene una constante, esta propiedad la devolverá. Si está vacía, devolverá una cadena vacía. Si la celda contiene una fórmula, la propiedad .Formula devolverá la fórmula en forma de cadena, con el mismo formato en que se presentaría en la barra de fórmulas (incluido el signo igual).
  2. Si se define el valor o la fórmula de una celda como una fecha, Excel comprueba si dicha celda ya tiene uno de los formatos numéricos de fecha u hora; de lo contrario, cambia el formato numérico al formato numérico de fecha corta predeterminado.
  3. Si se define la fórmula para un rango de varias celdas, se rellenan todas las celdas del rango con la fórmula.

Claro que si nos detenemos un segundo y ejecutamos la propiedad .Value como sigue:
Range("C3").Value = "=SUM(A3:B3)"
el resultado es el mismo... aunque las condiciones de uso son algo diferentes.


Lo probamos todo. En un módulo del Editor de VBA añadiremos las líneas de nuestra macro:

Sub pruebas()
Range("C1").Formula = "=SUM(A1:B1)"
Range("C2").FormulaLocal = "=SUMA(A2:B2)"
'''''''''''''''''''''''''''''''''''
Range("C3").Value = "=SUM(A3:B3)"
End Sub


Lo vemos en la imagen en modo Mostrar fórmula:

VBA: Diferencias entre las propiedades .Formula, .Value y .Text del objeto Range.



Y si obtenemos lo mismo por qué y para qué existen estas propiedades???... pues por que nuestras macros, según lean una u otra podrían devolvernos 'cosas' diferentes' (un valor ya calculado o bien una fórmula). Veámoslo con un sencillo ejemplo, donde aplicaremos ambas propiedades.

VBA: Diferencias entre las propiedades .Formula, .Value y .Text del objeto Range.


La propiedad .Formula devolverá, como sabemos, una fórmula si es tal cosa lo que hemos indicado, pero si no es así, es decir, si no contine fórmula, obtendremos un .Value o Valor.
Por ejemplo, sobre los datos de la imagen anterior, para la celda D3, al indicar la propiedad .Formula y .Value conseguiremos precisamente esa fórmula incorporada a la celda:
Range("D3").Formula = "=(C3-B3)/B3"
Sin embargo, si aplicamos la propiedad .Value conseguiremos el valor calculado, el valor puro, sin fórmula (y sin formato).
Range("D3").Value


Verifiquémoslo. En un módulo del Editor de VBA añadiremos las líneas de nuestra macro:

Sub Prueba2()
'incluimos una fórmula en D3
Range("D3").Formula = "=(C3-B3)/B3"
'''''''''''''''''''''''''''''''''''
Set c = Range("D3")
'damos estilo de celda porcentual
c.Style = "Percent"

MsgBox c.Formula 'mostramos el valor de la celda con la propiedad .Formula
MsgBox c.Value   'mostramos el valor de la celda con la propiedad .Formula
End Sub


Al ejecutar nuestra macro Prueba2 rápidamente se observan las diferencias...

Por si fuera poco, tenemos alguna otra propiedad 'en discordia': la propiedad .Text, la cual devuelve en forma literal lo que aparece en la celda (además si el contenido de la celda es numérico lo obtendremos incluyendo el formato.
En el ejemplo anterior, si añadireamos a nuestra macro una última línea
MsgBox c.Text
nos mostraría el valor calculado con su formato porcentual.
Esta es una propiedad sólo de Lectura!!.


La conclusión final, podríamos decir que la diferencia principal entre estas propiedades, es la lectura que hace de ellas nuestra MAcro, y no tanto a la hora de escribir en nuestra hoja de cálculo.

lunes, 1 de julio de 2013

Gráfico de una Pirámide poblacional en Excel.

En la entrada del día explicaré cómo construir una Pirámide poblacional fácilmente con un gráfico de barras en Excel. Además daré una alternativa a la típica imagen que tenemos, empleando un gráfico de dispersión.

Como siempre partiremos de los datos a representar y el aspecto final del gráfico que conseguiremos:

Gráfico de una Pirámide poblacional en Excel.



Para alcanzar el aspecto de barras contrapuestas necesitaremos añadir al origen de datos dos columnas auxiliares en D1:E9, una de ellas cambiando el signo al valor original, mientras que el otro se mantiene.
Seleccionaremos los rangos A1:A9 y D1:E9 y desde la ficha Insertar > grupo Gráficos > botón Barras, crearemos el siguiente gráfico:

Gráfico de una Pirámide poblacional en Excel.
haz clic en la imagen



El siguiente paso consiste en 'alinear' y comparar los valores de ambas series, para lo cual seleccionamos una de las series y desde Formato de series de datos situamos al 100% la 'Superposición de series' y al 0% el 'Ancho del intervalo':