lunes, 25 de junio de 2012

Cómo sumar letras en Excel.

Me llegó una curiosa cuestión hace pocos días sobre cómo poder sumar las letras dispuestas en un rango de celdas en Excel, conociendo su valor asociado a cada letra.
Supongamos que conocemos y tenemos dispuesta en una tabla auxiliar (A1:B7) la equivalencia Letras - Valor:


Como vemos tenemos desplegado en el rango D1:L1 de nuestra hoja de cálculo el texto excelforo, cada letra en una celda.
Si manualmente asociáramos a cada letra su valor correspondiente, como se ve en D5:L5, podríamos comprobar que la suma del texto 'excelforo' con sus valores respectivos sería igual a 35. Pero obviamente, aunque para este ejemplo sería sencillo hacerlo, pensando en trabajos algo más complejos, he desarrollado una formula matricial, que añadiremos en M1:
=SUMA(SI($A$1:$A$7=D1:L1;$B$1:$B$7))
No olvidemos validar la fórmula presionando Ctrl+Mayusc+Enter.


Lo que hemos conseguido es crear un rango de valores con el condicional:
SI($A$1:$A$7=D1:L1;$B$1:$B$7)
que busca la equivalencia entre Letra y Valor, para cada una de las celdas del rango D1:L1. Esta matriz de valores, este rango de números, acaba siendo sumado por la función SUMA, con lo que obtenemos la suma acumulada de todas esas letras.

Recordemos que lo importante de trabajar con fórmulas matriciales es ser capaces de obtener, precisamente, ese rango o matriz sobre la que operar.

viernes, 22 de junio de 2012

VBA: Exportar una imagen desde Excel.

En un reciente comentario, un lector preguntaba por la forma de guardar o exportar una imagen insertada previamente en nuestra Hoja de cálculo de Excel hacia un archivo en nuestro equipo.
El asunto no es sencillo de aplicar, ya que no existe una instrucción directa que permita guardar o exportar de alguna manera una imagen a un archivo en nuestro PC; sin embargo, una solución válida consiste en incluir nuestras imágenes a exportar dentro de un objeto Gráfico; puesto que estos objetos si son exportables fácilmente con la instrucción chart.Export.


Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel:

Sub ExportarImagen()
Dim img As Shape

Application.ScreenUpdating = False
For Each img In ActiveSheet.Shapes
'añadimos un gráfico
Charts.Add
'lo situamos como objeto en la Hoja 3
ActiveChart.Location Where:=xlLocationAsObject, Name:="Hoja1"
Set chrt = ActiveSheet.ChartObjects(1)

    nombreimg = img.Name
    'adaptamos tamaño de imagen y gráfico
    With img
    chrt.Width = .Width
    chrt.Height = .Height
    'copiamos la imagen
    .Copy
    End With
    'pegamos dentro del gráfico la imegen
    ActiveChart.Paste
    'exportamos el gráfico con el nombre del objeto (imagen)
    chrt.Chart.Export Filename:="C:\" & nombreimg & ".gif"
chrt.Delete
Next img

Application.ScreenUpdating = True
End Sub


Observamos que la macro recorre todas las formas/objetos de la hoja de Excel activa, y para cada imagen creamos un nuevo gráfico que inmediatamente localizamos como objeto (no como Nueva Hoja), para inmediatamente adecuar el tamaño del gráfico al de la imagen; finalmente copiamos la imagen y la pegamos en el gráfico activo recién creado.
Sólo nos queda seleccionar este gráfico y exportarlo con el nombre que tuviera definida la imagen. Para terminar eliminamos el gráfico y no dejar rastro del trabajo que hemos realizado.

martes, 19 de junio de 2012

VBA: Vincular datos en Excel con la hoja anterior.

En un foro, en el que suelo participar, contesté una cuestión que me pareció interesante compartir en el blog. Se trata de vincular una referencia de una celda con un dato de la hoja inmediata anterior. En definitiva el fin es vincular no a una hoja concreta, si no a la hoja de Excel anterior (a la hoja situada a la izquierda).
Esto en principio no es tan sencillo de conseguir con la formulación estándar, ya que al crear un vínculo sobre una Hoja de cálculo se hace sobre el nombre de la hoja y la celda; por ejemplo, un vínculo sobre la celda A1 de la Hoja1, se consigue, en cualquier otra hoja del libro así:
=Hoja1!A1
y siempre 'apuntará' hacia esa Hoja y celda.

Sin embargo, podemos trabajar una función personalizada en VBA que nos permite 'apuntar' el vínculo a la hoja anterior.
Nos aprovecharemos de una instrucción de VBA como ActiveSheet.Index que nos dice en qué hoja (numerada) nos encontramos; esto será una ventaja para localizar cúal es la Hoja anterior.


Supongamos un Libro de trabajo con siete hojas (Lunes, Martes, Miércoles, Jueves, Viernes, Sábado y Domingo); sobre alguna de las cuales quiero añadir un vínculo sobre otra hoja; por ejemplo, en la Hoja 'Domingo' quiero añadir un vínculo de la celda A1 de la Hoja anterior, que en esta primera situación sería la Hoja 'Sábado', pero que en cualquier momento podría ser, por que movamos las Hojas, la Hoja 'Jueves' o 'Lunes'; aquí es donde no es muy práctico el enlace: 'Sábado!A1', ya que este vínculo no se vé afectado por la movilidad de las hojas.
Para ello construimos una función que nos sitúa en cada momento en la Hoja activa, en particular en el orden (1, 2, 3, ...) que le corresponde a dicha hoja activa, el resto es sencillo, ya que como resultado de nuestra función personalizada, obtendremos el vínculo a la celda A1 de la hoja que en orden sea una menor, esto es, la anterior.

Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra función VBA de Excel:

Function RefNumHoja()
'permitimos que la función actualice cada vez haya cambios en la hoja
Application.Volatile
Dim NumHoja As Long
'averiguamos la hoja activa
NumHoja = ActiveSheet.Index
    'evitamos un error para el caso de que estemos en la Hoja número 1..
    If NumHoja = 1 Then
    RefNumHoja = "Ojo es la primera hoja!!!"
    Else
    RefNumHoja = Sheets(NumHoja - 1).Range("A1").Value
    End If
End Function


Si ejecutamos esta nueva función 'RefNumHoja' en alguna de las celdas de cualquiera de las siete Hojas de nuestro libro, veremos cómo siempre nos devuelve el valor de la celda A1 de la Hoja inmediatamente anterior (menos en el caso que estemos en la Hoja número 1, que devuelve el texto definido).
Además hemos asignado el método Volatile para facilitar la actualización de la función ante cambios en la hoja donde se encuentre, o cada vez que forcemos la actualización de la hoja presionando F9.

lunes, 18 de junio de 2012

Curso macros de Excel nivel iniciación.

Como sabéis recientemente he comenzado una nueva actividad, por la cual ofrezco cursos de Excel y macros en modalidad elearning:

Curso Excel Avanzado para versiones 2007/2010

(ver más)

Curso Macros Iniciación

(ver más)


Este post es para anunciar la segunda edición para los Cursos de Macros Excel nivel Principiante, que darán comienzo el próximo día 1 de julio de 2012, con una duración de un mes.
Con la confianza de siempre....Anímate!!

El programa del curso es el siguiente, pero puedes informarte sin compromiso en cursos@excelforo.com:
TEMA 1 - INTRODUCCIÓN A LAS MACROS
1.    Introducción al VBA (visual basic para aplicaciones).
2.    Introducción a las macros.
2.1.  Hacer visible la ficha programador.
2.2.  ¿Qué se puede hacer con VBA?
3.    Sobre seguridad de macros.
4.    Guardando libros de trabajo con macros.
5.    Dos tipos de macros en VBA:
5.1.  Procedimiento Sub.
5.2.  Procedimiento Function.
6.    Definiciones importantes.
7.    Creando macros en VBA.
8.    Grabación de macros VBA:
8.1.  Ejemplo 1.
8.2.  Ejemplo 2.
9.    Grabar usando referencias absolutas frente relativas.
10.  Libro de macros personal.
11.  Asignar una macro a una tecla de acceso directo-método abreviado.
12.  Asignar una macro a un botón.
13.  Escribiendo algo de código VBA.
14.  ¿Cómo trabaja VBA?: resumen de lo visto:
14.1.Objetos y colecciones.
14.2.Propiedades.
14.3.Métodos.
14.4.Variables.
14.5.Construcciones de programación VBA.
TEMA 2 – EL ENTORNO VBA. CARACTERÍSTICAS GENERALES
1.    El editor de VBA (Visual Basic para aplicaciones).
2.    Los módulos en el editor de VBA.
3.    Personalizar el entorno del editor de VBA: Opciones.
3.1.1.    Pestaña Editor.
3.1.2.    Pestaña Formato del Editor.
3.1.3.    Pestaña General.
3.1.4.    Pestaña Acoplar.
4.    Personalizar el entorno del editor de VBA: Examinador de objetos.
5.    Personalizar el entorno del editor de VBA: Propiedades del proyecto.
5.1.1.    Pestaña General.
5.1.2.    Pestaña Protección.
6.    La ventana de Explorador de proyectos.
7.    La ventana de Propiedades.
TEMA 3 – TIPOS DE DATOS, VARIABLES, CONSTANTES
Y EXPRESIONES:
1.    Tipos de datos y variables.
2.    Ámbito de las variables.
3.    Elección del tipo de una variable.
4.    Definiendo constantes.
5.    Expresiones, operadores y otros.
TEMA 4 – SENTENCIAS DE CONTROL:
1. Introducción.
2. Sentencia IF ... THEN ... ELSE ...
3. Sentencia SELECT CASE.
4. Sentencia FOR…NEXT.
5. Sentencia WITH...END WITH.
TEMA 5 – RANGOS EN VBA:
1.    Introducción.
2.    Trabajando con rangos en vba:
3.    Determinar el tipo de la selección:
4.    Copiar un rango:
5.    Cortar un rango:
6.    Copiar un rango de tamaño variable:
7.    Seleccionando rangos variables:
8.    Contar celdas seleccionadas:
9.    Looping eficiente por un rango seleccionado:
10.  Transferir datos de un rango a una matriz (o viceversa):
11.  Las funciones INPUTBOX y MSGBOX:
TEMA 6 – PROCEDIMIENTO SUB Y FUNCION:
1.    Introducción.
2.    Procedimiento Sub.
3.    Ejemplos procedimiento Sub.
4.    Procedimiento Function.
5.    Definir en qué categoría incluir la nueva Function.
6.    Ejemplos procedimiento Function.
TEMA 7 – CONTROLES Y EVENTOS:
1.    Introducción.
2.    Controles disponibles:
3.    Propiedades comunes a todos los controles.
4.    Controles más usuales.
5.    Ejemplo de un CommandButton.
6.    Ejemplo de un ListBox.
7.    Eventos.
8.    Eventos más comunes.
9.    Control de errores de ejecución.
TEMA 8 – FORMULARIOS:
1.    Introducción.
2.    Insertar un UserForm.
3.    Agregando controles al formulario.
4.    Las propiedades de un control.
5.    Ajustando los controles en el UserForm.
6.    Orden de tabulación. Moviéndose entre controles.
7.    Mostrar o desplegar un UserForm.
8.    Ejemplo de un UserForm.
TEMA 9 – GRAFICOS:
1.    Introducción.
2.    Usando el asistente de grabación.
3.    Mover y eliminar gráficos.
4.    Formato de un gráfico.

domingo, 17 de junio de 2012

VBA: Macro para imprimir los WorkBooks de una carpeta.

Hoy veremos una macro sencilla, que utiliza algunas funciones de VBA muy interesantes, así como algún método o propiedad; y todo con el fín de obtener una impresión de la Hoja1 de todos los ficheros Excel de una carpeta dada. Esta impresión podrá ser bien en papel o bien, si disponemos del software oportuno, directamente en un fichero .pdf.
Supondremos que deseamos imprimir los ficheros de excel que se encuentren en la carpeta D:\Prueba\, y que para nuestro ejemplo, aprovecharemos la aplicación PrimoPDF, para obtener de la Hoja1 de todos los Libros de trabajo de Excel de esas carpeta, el rango seleccionada como área de impresión.

Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel:

Sub Imprimir_Otro_Workbook()
Dim Ruta, Archivos As String
Ruta = "D:\Prueba\"
'representa el nombre de un archivo, directorio
'o carpeta que coincide con el patrón o atributo de archivo especificado
Archivos = Dir(Ruta & "\*.xl*")

Application.ScreenUpdating = False
'Recorremos la carpeta o directorio hasta el último archivo con extensión .xl*
Do While Len(Archivos) > 0
   'Abrimos los WorkBook de la carpeta
   Workbooks.Open Filename:=Ruta & "\" & Archivos
   'Damos la orden de imprimir la Hoja1 del Libro,
   'activando una de las impresores disponibles
   ActiveWorkbook.Sheets(1).PrintOut Copies:=1, ActivePrinter:="PrimoPDF", _
   IgnorePrintAreas:=False
   'Cerramos el WorkBook abierto sin guardar cambios
   ActiveWorkbook.Close savechanges:=False
   'Para obtener más nombres de archivo que coincidan con la Ruta,
   'volveremos a llamar a la función Dir sin argumentos
   Archivos = Dir()
Loop
Application.ScreenUpdating = True
End Sub


La clave de esta macro es la función Dir (ya empleada en est blog), y que nos devuelve una variable, tipo String, que representa el nombre de un archivo, directorio o carpeta que coincide con el patrón o atributo de archivo especificado, o la etiqueta de volumen de una unidad de disco. Con una gran vengtaja, y es que la función Dir permite el empleo de los caracteres comodín '*' (múltiples caracteres) y '?' (un solo carácter) para especificar varios archivos. Además Dir devuelve el primer nombre de archivo que coincide con la Ruta. Para obtener más nombres de archivo que coincidan con la Ruta, volveremos a llamar a la función Dir sin argumentos, esto es, Dir().
Por otro lado empleamos el método Workbooks.Open con su parámetro Filename para abrir los Libros de trabajo (WorkBooks) de la carpeta concreta definida con la función Dir.
También usaremos para configurar la impresión el método ActiveWorkbook.Sheets(1).PrintOut, y sus parámetros Copies,ActivePrinter y IgnorePrintAreas; destacando como clave el parámetro ActivePrinter, con el que indicaremos qué impresora de las existentes deseamos utilizar.
Finalizamos señalando que una vez abierto el Libro de trabajo de Excel, impresa la Hoja1, sólo cabe cerrar el Libro sin guardar cambios, lo que conseguimos con el método ActiveWorkbook.Close y su parámetro savechanges:=False que evita la ventana diálogo de pregunta de si Guardar o No guardar.

jueves, 14 de junio de 2012

Simulando un Texto predictivo en una celda de Excel.

En una entrada anterior vimos como mediante un ComboBox y con su Propiedad MatchEntry y algo más de código VBA conseguimos que dicho Control funcionara como un reconocimiento de texto según escribíamos en él, de acuerdo a un listado de elementos de un rango definido. En la entrada de hoy simularemos igualmente ese Texto predictivo directamente en una celda de la hoja de cálculo de Excel.
Se trata de un truco, como otras tantas veces, para engañar a Excel (y a nosotros mismos), y que sólo sería válido bajo ciertas condiciones y ciertos tipos de estructura de informes.

Nos aprovecharemos de la opción de Habilitar Autocompletar para valores de celda que permite para cada celda reconocer textos o valores de otras celdas contiguas:

Simulando un Texto predictivo en una celda de Excel.


Por ejemplo, con esta opción habilitada, si escribimos a continuación de un rango de celdas rellenas, se autocompletará con el texto más cercano reconocido, y también podremos presionar Alt+flecha abajo para obtener una lista desplegable de todos los elementos del rango contiguo. Aunque lo que nos interesa es la primera propiedad, podemos ver un ejemplo del segundo:

alt=


Pero volvamos a lo que nos ocupa. Con esta propiedad de Texto predictivo del Habilitar Autocompletar para valores de celda podemos replicar en nuestra hoja de cálculo de Excel el comportamiento deseado. Como necesitamos un rango o listado contigua, deberemos incorporarlo al informe.

Trabajemos sobre un ejemplo; deseamos obtener un valor asociado a dos variables 'Producto' y 'Concepto'. de acuerdo a una Tabla de referencia cruzada, según rellenamos ciertos registros.
Para ello, construímos la siguiente estructura de informe:

lunes, 11 de junio de 2012

VBA: La propiedad MatchEntry en un ComboBox.

Recientemente un lector del blog, Ever David, me recordó una propiedad de los ComboBox (cuadros combinados) que permitía algo muy buscado por la red, como es el completar texto según escribimos, sobre los elementos de un listado.
Explicaré hoy, aprovechando esa característica, cómo utilizar un ComboBox ó Cuadro Combinado(ActiveX) en nuestra Hoja de Excel, para conseguir y obtener en otra celda de la Hoja de Excel, el valor asociado al elemento buscado con este cuadro combinado de control.
Además para un mejor control, añadiremos un poco de código VBA para evitar que se introduzcan elementos no pertenecientes a nuestro listado de base.


Empezaremos nuestro trabajo asignando un nombre a nuestro Listado de trabajo (llamado 'datos':
datos =Hoja1!$A$2:$A$8
siendo el origen de datos

VBA: La propiedad MatchEntry en un ComboBox.


El siguiente paso es insertar el ComboBox ó Cuadro combinado(ActiveX) en la Hoja de Excel; lo que haremos desde Programador > Controles > Insertar > Controles ActiveX > Cuadro Combinado:

VBA: La propiedad MatchEntry en un ComboBox.


Nos aseguraremos que tenemos la propiedad MatcEntry de este control como 1-fmMatchEntrecomplete:


Esta propiedad MatchEntry habilita que según escribamos en este ComboBox se vayan reconociendo los elementos de la Lista origen de datos.
Para darle más potencia a este Control, incluiremos un poco de código más, por lo que haciendo doble click en el control (siempre con el Modo Diseño activado), insertaremos, asociado al Cuadro Combinado(ActiveX), en la Hoja correspondiente del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel:

Private Sub ComboBox1_change()
'cargamos listado desde la tabla 'datos' previamente creada...
ComboBox1.ListFillRange = "datos"

Dim ListadoDatos As Range
Dim Buscado As Object
'Definimos la variable ListadoDatos
Set ListadoDatos = Range("datos")
'Definimos una variable 'buscado'
Set Buscado = Nothing
'damos un valor a la variable 'buscado'
Set Buscado = ListadoDatos.Find(ComboBox1.Value)

If Buscado Is Nothing Then
'Si el dato escrito no está en la lista arroja el siguiente error
MsgBox "El dato introducido [" & ComboBox1.Value & "] no se encuentra en la lista", vbInformation, _
"Detalle del error..."
Else
'si está, entonces devuelve el valor del 'importe' correspondiente
Range("F2").Value = Range("datos").Offset(ComboBox1.ListIndex, 1).Value
End If

Set ListadoDatos = Nothing
Set Buscado = Nothing
End Sub


Ya podemos probar nuestro ComboBox, desactvamos el Modo Diseño, y desplegamos los elementos... podemos ver como lista los existentes sin problemas, y cómo finalmente lleva a la celda F2 el importe correspondiente al elemento elegido:

viernes, 8 de junio de 2012

VBA: Gráfico Variable en Excel 2010.

Hace bastante tiempo expliqué una manera de construir un gráfico en Excel vinculado al valor de ciertas celdas asociadas (ver), era una manera sencilla de obtener de un origen de datos aquellos valores que deseábamos representar gráficamente en nuestras Hojas de Excel.
Hoy explicaré una nueva forma de conseguir un Gráfico en Excel asociado a dos variables, obteniendo los Rangos de datos de Hojas diferentes, para poder responder la cuestión planteada por un lector del blog:

...Se trataria de crear un grafico en esta misma hoja en el cual pueda mostrar los datos respectivos al Año(D1) y Tipo(B1)conjuntamente.
Por ejemplo, yo selecciono 'Año 2010' y 'Vehiculos' y me mostraria un grafico de barras con los valores correspondientes a esos dos datos; el eje de x tendria como rotulos las celdas F1 a Z1 y el eje de y la escala correspondiente a los valores de F2 a Z2.
Si cambio la selección a otro año y otro concepto ( utilizaria el desplegable de D1 y B1) pues que me muestre esos nuevos valores....

Para ello, y para no complicar nuestro trabajo, comenzaremos con un Gráfico ya creado llamado 'GráficoFinal', y con dos celdas validadas tipo lista con los Años de estudio (celda D1)y los Tipos de datos (celda B1). También importante el nombre de cada Hoja con datos corresponde en nombre con '2012', '2013' y '2014', es decir, con los años a desplegar.

VBA: Gráfico Variable en Excel 2010.



Veamos por último la estructura de datos de cada una de las Hojas, muy importante para no complicar el código de nuestra macro siempre situadas en el mismo rango de celdas E1:Z4.
El código VBA de la siguiente macro se basa precisamente en la estructura de datos de esas hojas, ya que mediante una instrucción SELECT CASE obtendremos los valores de la Serie de datos a representar en función del Año y Tipo seleccionado:

VBA: Gráfico Variable en Excel 2010.



Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel:

Sub GraficoVariable()
Dim valores, cabecera, fuente As Range
Dim rngvalores As Range
Dim Año As String

Application.ScreenUpdating = False
Año = Sheets("Gráfico").Range("D1").Value
valores = Sheets("Gráfico").Range("B1").Value

Set cabecera = Sheets(Año).Range("E1:Z1")
'Con SELECT CASE seleccionamos el Rango de Serie datos del gráfico
'según Tipo y Año
Select Case valores
    Case "Vehículo/100 habitantes": Set rngvalores = Sheets(Año).Range("E2:Z2")
    Case "Vehículos": Set rngvalores = Sheets(Año).Range("E3:Z3")
    Case "Habitantes": Set rngvalores = Sheets(Año).Range("E4:Z4")
End Select
'con UNION creamos un multirango, que servirá para crear el gráfico
Set fuente = Union(cabecera, rngvalores)

'Activamos el gráfico definitivo, y le asignamos los datos de Rótulos y Valores
'seleccionados mediante la Validación de datos de B1 y D1
ActiveSheet.ChartObjects("GráficoFinal").Activate
ActiveChart.SetSourceData Source:=fuente
ActiveChart.SeriesCollection(1).Name = valores & " Año " & Año

Application.ScreenUpdating = True
ActiveCell.Select

Set cabecera = Nothing
Set rngvalores = Nothing
Set fuente = Nothing
End Sub


Vemos como la macro de Excel que hemos creado, tras ejecutarla presionando el Botón (Control de formulario), obtiene los valores representados en nuestra 'GráficoFinal a partir de la selección del Año y Tipo, añadiendo como Serie de datos aquel rango de valores elegido, que era lo que queríamos obtener.

miércoles, 6 de junio de 2012

Excel: Habilitar cálculo iterativo vs Referencia Circular.

Hablaré hoy de un concepto poco conocido de Excel, como es el Habilitar cálculo iterativo y cómo podemos aprovecharnos de él.
Para entender cuál puede ser el beneficio de activar esta opcíon debemos entender primero qué son las Referencias circulares, que seguro en más de una ocasión hemos sufrido. Estas referencias circulares aparcen cuando al trabajar en nuestras Libros u Hojas de Excel incluimos una celda como argumento de una función que necesita la primera para llegar a un resultado; es decir, cuando hay fórmulas que se refieren a otras y estas dependen unas de otras; por ejemplo, si la celda A1 contiene la formula "=B1" y la celda B1 contiene la formula "=A1". Estas referencias circulares nos devuelven un error muy típico que condiciona el resto de resultados de la Hoja de cálculo (incluso del Libro) sobre el que trabajamos.
No se hace necesario para el fin de esta entrada comentar más al respecto.


Nosotros trabajaremos sobre una Hoja donde hemos forzado una Referencia Circular, necesaria para nuestro cálculo final. En nuestro ejercicio hemos resumido en una pequeña cuenta de resultados, Ingresos menos costes fijos, variables y un margen industrial, que irá en función del resultado o beneficio final; es decir, un coste incluido como parte del Beneficio pero que se calcula precisamente a partir del Resultado final. Una referencia circular muy clara.
Podemos verlo en la imagen:

Excel: Habilitar cálculo iterativo vs Referencia Circular.


De alguna forma tendremos que 'romper' ese círculo; y ahí es donde entra la opción de Habilitar cálculo iterativo. Para ello iremos al menú Archivo > Opciones > Fórmulas > Opciones de cálculo > Habilitar cálculo iterativo:

Excel: Habilitar cálculo iterativo vs Referencia Circular.


Sabiendo que las Iteraciones máximas define el número de veces que Excel actualiza los cálculos.
Para definir el número máximo de cambio que se aceptará entre los resultados de los nuevos cálculos, escribimos la cantidad en el cuadro Cambio máximo.
Cuanto mayor sea el número de iteraciones, más tiempo necesitará Excel para calcular una hoja de cálculo; y cuanto menor sea el número, más preciso será el resultado y más tiempo necesitará Excel para volver a calcular una hoja de cálculo.

Una vez marcada la opción de Excel 'Habilitar cálculo iterativo', Excel permitirá el cálculo tantas veces como le hayamos indicado (100 en nuestro ejemplo) hasta alcanzar un resultado con la precisión definida; es decir, de manera similar a como hubiera actuado Buscar objetivo o Solver.
Al volver a la Hoja de cálculo podemos ver el resultado conseguido:

domingo, 3 de junio de 2012

Indicar un error en una celda de Excel con colores.

Una curiosidad de Excel es que detecta celdas con errores, marcándolas en la esquina superior izquierda con un triángulo de color verde, en mi ejemplo lo tengo personalizado en rojo; así al menos está definido por defecto... y estamos muy acostumbrados a verlo así: esquina verde igual a celda con error.
Sin embargo, esto es configurable, quiero decir, podemos indicar el color que queremos para marcar las celdas con error.
Veamos el aspecto habitual de una celda con un error cualquiera:

Indicar un error en una celda de Excel con colores.


Lo que haremos ahora es irnos, si trabajamos con Excel 2010, hasta el menú Archivo > Opciones > Fórmulas > Comprobación de errores > Indicar errores con el color:

Indicar un error en una celda de Excel con colores.


Simplemente seleccionaremos el color que deseemos... en este ejemplo elegiremos el 'Verde vivo' (cualquiera valdría). Y una vez cambiado el color del error, veríamos en nuestra hoja de cálculo:

viernes, 1 de junio de 2012

VBA: Macro para conseguir un Calendario en Excel.

Un lector del blog, Luís García, tuvo a bien enviarme una macro de Excel para realizar un calendario completo del año en tres columnas y 4 filas, que ha desarrollado basándose en una funcion matricial para realizar un mes especifico realizada por Damian Silva.
Realmente me ha parecido interesante, por lo que agregándole dos cosillas sin importancia, he decidido compartirlo con todos.

Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel:

Sub calendario3()
Dim i As Integer
Dim fecha As Date
Dim aumento As Integer
Dim s As Integer
Dim contador
Range("B4").Select
Application.ScreenUpdating = False

s = 1
'tomo la fecha inicial de cualquier año
fecha1 = CDate(InputBox("ingrese la fecha, bajo el formato dd/mm/aaaa, Ejemplo: 01/12/2012 "))
'con un bucle recorro todos los meses del año inicio en 0 para que tome el mes de la fecha que le_
'anexamos al principio
contador = 0
For aumento = 0 To 11
contador = contador + 1
fecha2 = DateSerial(Year(fecha1), Month(fecha1) + aumento, Day(fecha1))
' voy aumentando un mes a la fecha inicial

fecha = DateSerial(Year(fecha2), Month(fecha2), Day(fecha2))
'para quenos quede la fecha a utilizar en la macro

año = Year(fecha) ' tomo el año de la fecha
mes = Month(fecha) ' tomo el mes de la fecha
' el dia inicial tomando en cuanta para mi gusto que lunes es el primer dia de la semana
inicio = Weekday(DateSerial(año, mes, 1), vbSunday)
fin = Day(DateSerial(año, mes + 1, 1) - 1)
j = 1 ' primer dia del mes
p = inicio  ' de lun a vier que colocamos el valor de los dia dependiendo del mes
For x = 1 To fin
    ActiveCell.Offset(j - 1, p - 1) = x
    ActiveCell.Offset(-2, 0).Value = DateSerial(año, mes, 1)
    ActiveCell.Offset(-2, 0).NumberFormat = "mmmm-yyyy"
    ActiveCell.Offset(-2, 0).Interior.ColorIndex = Int(Rnd * 55) + 1
    '
    ActiveCell.Offset(-1, 0).Value = "Do"
    ActiveCell.Offset(-1, 1).Value = "Lu"
    ActiveCell.Offset(-1, 2).Value = "Ma"
    ActiveCell.Offset(-1, 3).Value = "Mi"
    ActiveCell.Offset(-1, 4).Value = "Ju"
    ActiveCell.Offset(-1, 5).Value = "Vi"
    ActiveCell.Offset(-1, 6).Value = "Sá"
If p = 7 Then
p = 0
j = j + 1
End If
p = p + 1
Next

    ActiveCell.Offset(0, 9).Select
If contador = 3 Or contador = 6 Or contador = 9 Or contador = 12 Then
     ActiveCell.Offset(9, -27).Select
End If
Next
Application.ScreenUpdating = True
End Sub


el funcionamiento es 'sencillo', pregunta a través de un INPUTBOX la fecha desde donde queremos comience el calendario, y tras todo el proceso de cálculo, traslada a la Hoja de Excel, a partir de la celda B4, la cabecera de mes y día de la semana, y los días del mes correspondientes.
El resultado de ejecutar esta macro la podemos ver en la siguiente imagen:

VBA: Macro para conseguir un Calendario en Excel.