lunes, 25 de julio de 2011

VBA: Una utilidad de OFFSET en macros de Excel.

Hace pocos días vimos cómo, mediante una macro, podíamos evaluar coincidencias entre diferentes rangos (ver). En el post de hoy, analizaremos una de las utilidades o finalidades que podemos dar en nuestras macros a Range.Offset(núm_filas;núm_columnas).
Supongamos el siguiente ejemplo en el que disponemos de una tabla con diferentes elementos (ALTO, MEDIO, BAJO o vacío), de los cuales necesitamos obtener cuáles son sus referencias:


Se trata de obtener un rango variable del elemento elegido para el filtro (ALTO, MEDIO, BAJO o vacío); por ejemplo, si seleccionamos el elemento 'ALTO' deberíamos obtener el rango con los siguientes valores: AA-A, AC-C y AE-E
ya que son estos precisamente las coordenadas en nuestra tabla para los tres elementos 'ALTO' existentes.

En este caso, nuestra macro evaluará celda por celda cada una de las pertenecientes a nuestro origen, y en caso de que el valor de dicha celda coincida con el elemento seleccionado lo colocará en un orden predeterminado, una debajo de otra (sin espacios).

Es precisamente este el fin que le daremos en esta ocasión a la función OFFSET

Debemos incluir nuestro código VBA en un módulo del Explorador de proyectos dentro del Editor de VBA (Alt+F11):

Sub MuestraCoincidencias()
'www.excelforo.blogspot.com
Dim CompareRange As Variant, x As Variant, y As Variant
Dim referencia As Variant
'definimos cuál es el valor a filtrar
'para nuestro ejemploel valor que tenga la celda I1
referencia = Range("I1").Value
'iniciamos un contador
contar = 0
'limpiamos todos los valores existentes previos.
Range("I2:I50").Clear
'mediante la instrucción FOR pasaremos por todas las celdas que correspondan
'a las filas de la 3 a la 10
'y a las columnas de la 2 a la 7 (B a G)
For i = 3 To 10
For j = 2 To 7
Set celda = Sheets("Filtro").Cells(i, j)
'comprobamos si el valor de la celda coindice con el buscado
'si es cierto nos llevamos sus coordenadas de tabla a la celda I2
'y con OFFSET añadimos cada nueva coincidencia en una fila por debajo
'incrementando el contador en uno cada coincidencia
If celda.Value = referencia Then
Range("I2").Offset(contar, 0) = Cells(celda.Row, 1).Value & "-" & Cells(2, celda.Column).Value
contar = contar + 1
Else
contar = contar
End If

Next j
Next i

End Sub


Ya sólo queda probarla, en la celda I1 disponemos un desplegable con los valores ALTO, MEDIO, BAJO o Vacío, y ejecutamos nuestra macro y obtenemos:

viernes, 22 de julio de 2011

Mantener elementos eliminados en el origen de datos de una Tabla dinámica.

Daré respuesta a la cuestión planteada por un lector con problemas a la hora de Suprimir o mantener los elementos eliminados en el origen de datos al trabajar con tablas dinámicas:

...Tengo un problema con una tabla dinamica.
Genere una tabla dinamica con unos datos iniciales, en uno de los filtros que cree se visualiza el listado correctamente. Luego cambie los datos iniciales con otros datos, pero con las mismas caracteristicas. Al actualizar la tabla dinamica, en el filtro se visualizan en el listado tanto los datos viejos (iniciales) como los nuevos y en los datos nuevos no existe el listado de los datos iniciales.
Como puedo hacer para que no se visualicen en el filtro el listado de los datos viejos (iniciales) solo los nuevos?...


La cuestión es que cuando realizamos, una vez construida nuestra tabla dinámica, algún cambio en los elementos de un campo en nuestra tabla origen, no basta actualizar nuestra tabla dinámica para que los filtros de campo en ésta, eliminen los antiguos elementos y nos muestren exclusivamente los nuevos elementos y valores.
Pongamos un ejemplo. Supongamos el siguiente origen de datos y una tabla dinámica construida sobre dicho origen:


miércoles, 20 de julio de 2011

VBA: Evaluar datos coincidentes en una tabla de datos.

Recientemente llegó a mi correo una cuestión que me pareció interesante; me preguntaban por formas de reiterar procesos en macros. Emplearemos las más habitual para realizar bucles, la instrucción FOR ... NEXT:

...Con esto comparo la primera fila de datos (que he seleccionado para que sea Selection),
con la siguiente, que está en la segunda fila. El resultado de los valores coincidentes me lo coloca unas cuantas filas más abajo.
Sub Iguales()
Dim CompareRange As Variant, x As Variant, y As Variant
Set CompareRange = Worksheets("Hoja2").Range("A2:E2")
For Each x In Selection
For Each y In CompareRange
If x = y Then x.Offset(4, 0) = x
Next
Next
End Sub
¿Cómo puedo repetir este proceso para comparar la misma selección con la tercera fila, cuarta fila... n fila? Además los valores coincidentes también deberían ir colocándose en filas distintas, unos debajos de otros...
Esto de reiterar los procesos lo encuentro especialmente complicado, ya que me cuesta parametrizar las cosas para repetirlas n veces, y sobretodo, dónde colocar los resultados para que no se machaquen unos encima de otros... ...


Vemos que en el código propuesto por nuestra lectora emplea otra instrucción importante en nuestros códigos: FOR EACH ... IN ... NEXT. Lo que hace falta al desarrollo propuesto es que siga analizando las diferentes filas de la tabla, y añadiendo las coincidencias en distintas filas, para no 'machacar' las anteriores.
Supongamos nuestra tabla de datos inicial a comparar:


Nuestra fila a comparar, esto es, nuestra selección será la primera (A1:E1).
Debemos incluir nuestro código VBA en un módulo del Explorador de proyectos dentro del Editor de VBA (Alt+F11):

Sub EvaluaCoincidencias()

'www.excelforo.blogspot.com

Dim CompareRange As Variant, x As Variant, y As Variant
'con FOR analizaremos de las filas 2 a 4.
For i = 2 To 4
'definimos una variable que utilizaremos como rango
rng = "A" & i & ":E" & i
Set CompareRange = Worksheets("Hoja1").Range(rng)

'con FOR EACH repasamos cada celda de los rangos seleccionados y definidos como variable.
For Each x In Selection
For Each y In CompareRange

'evaluamos la coincidencia y nos la llevamos 4 filas por debajo.
If x = y Then x.Offset(4 + i, 0) = x

Next
Next
Next i

End Sub


Para ejecutar esta macro seleccionamos el rango a evaluar A1:E1 y desde la lista de macros ejecutamos EvaluaCoincidencias, o bien asignamos la macro a un botón, obteniendo el siguiente resultado:



Vemos como los elementos coincidentes para cada rango A2:E2, A3:E3 y A4:E4 con los valores de A1:E1 se llevan algunas filas más abajo, sin 'machacarse' (como decía nuestra lectora), manteniendo en este caso el orden de columnas de la selección A1:E1.

lunes, 18 de julio de 2011

Comprobador de compatibilidad en Excel 2007.

Aún hoy, cuando estamos muy cerca de la desaparición (al menos del soporte por Microsoft) de versiones antiguas como 2003, seguimos empleando el formato .xls para nuestras hojas de cálculo.
Yo, al menos, sigo teniendo instalada esta versión por que sigo recibiendo consultas sobre Excel 2003. Si operamos con Excel 2007 0 Excel 2010 no tenemos problemas para abrir y trabajar con Libros .xls, sin embargo, se hace necesario que antes de guardar un fichero modificado con una versión superior realicemos una comprobación de compatibilidad de las modificaciones realizadas. Normalmente este 'Comprobador' aparece de manera automática cuando 'Guardamos' nuestros Libros.xls.
Pero existe una forma de llamar a esa herramienta, sin necesidad de esperar al guardado.
Desde el Botón de Office > Preparar > Ejecutar Comprobador de compatibilidad:


Apareciéndonos entonces la ventana diálogo con un listado de 'errores' o características no compatibles con versiones anteriores a la versión de Excel con la que estemos trabjando en ese momento.
Se nos advierte, además, que dichas características, se pueden perder en el proceso de guardado o se reconvertiran a lo más parecido:


Recuerdo que esto fue una pregunta del examen 77-602 para obtener el certificado MOS Excel 2007 (Microsoft Office Specialist Excel 2007).

viernes, 15 de julio de 2011

Diagrama de Gantt en Excel.

Hablaré hoy del método a seguir para construir un sencillo gráfico de Gantt, o más conocido como Diagrama de Gantt. El objetivo de esta Carta de Gantt es enseñar, a través de una barra semicontinua, el tiempo estimado de dedicación para la realización de las diferentes fases a lo largo de un tiempo total determinado de un proceso.
Para nuestro ejemplo supondremos un Procedimiento que consta de cuatro fases continuas, es decir, una empieza al finalizar la anterior, siendo la duración estimada de cada fase conocida y diferente.
Veámoslo en la siguiene tabla:


El siguiente paso es la construcción de nuestro gráfico; y esta construcción la haremos partiendo de cero.
Sin seleccionar ningún rango de nuestra tabla, navegaremos hasta Insertar > Gráficos > Barra > Barra en 2-D > Barra apilada:


martes, 12 de julio de 2011

Mostrar / Ocultar la cinta de opciones en Excel 2007.

Un pequeño truco para ocultar o mostrar la Cinta de opciones si trabajamos en Excel 2007; se trata de conseguir más espacio visual de la hoja de trabajo...
Normalmente trabajamos con la Cinta de opciones visible...


La manera más rápida para poder Mostrar u Ocultar dicha Cinta de opciones es presionando Ctrl+F1.
Sin embargo existe otra forma, sería 'clickar' el botón derecho del ratón sobre alguna de las Fichas, donde obtendríamos las siguientes opciones:

lunes, 11 de julio de 2011

Marcas de agua en Excel.

Hace algunos días un lector preguntaba cuál era la forma de añadir Marcas de agua a nuestras hojas de cálculo:

...cual es la opción para crear marcas de agua en las hojas de calculo, lo he visto en varios archivos y quisiera saber como se hace...


La realidad es que Excel es una Hoja de cálculo, y ha dejado algo olvidado este asunto, es decir, no existen marcas de agua como pueden existir en editores de texto, como Word. Sin embargo, sí es posible replicar o imitar este efecto en nuestras hojas.
Explicaré en esta ocasión el método más corriente; basicamente consiste en insertar una imagen predefinida por nosotros en el encabezado, para luego darle un formato concreto.
Nuestro primer paso será entonces disponer de la imagen que queremos como marca de agua, en mi caso, dispondré de la siguiente:


Debemos ahora ejecutar el Encabezado de página, herramienta que podemos llamar desde varias rutas:
  • Insertar > grupo Texto > Encabezado y pié de página

  • Diseño de página > grupo configurar página > Pestaña Encabezado y pié de página

martes, 5 de julio de 2011

Autoajustar el ancho de columnas al actualizar una tabla dinámica.

Frecuentemente, al usar nuestras tablas dinámicas y actualizar los datos desde su origen, el ancho de las columnas de nuestra hoja de cálculo se ven afectadas... descolocándonos el diseño de una plantilla existente en la hoja, o simplemente desfigurando el aspecto de nuestras Tablas o Listas; digamos que es un 'efecto secundario' de trabajar con tablas dinámicas. Por suerte, existe una opción que nos permitirá evitar este efecto, es decir, podremos configurar desde las Opciones de tabla dinámica la posibilidad de ese Autoajuste de ancho de columna.
Veámos como. Partimos de un hoja de cálculo con una Tabla o Lista, de tres columnas, todas ellas de un ancho estándar de 10,71:


Si construyeramos una Tabla dinámica debajo de la Tabla, por ejemplo, desde la celda A13, veríamos cómo el ancho estándar de nuestras columnas variaría...