You are on page 1of 5

http://jldexcelsp.blogspot.com/search/label/Macros?

updated-max=2009-11-
08T19%3A03%3A00%2B02%3A00&max-results=20

JLD Excel en Castellano - Usar Microsoft Excel eficientemente


Sugerencias y ayuda para Excel en español. Ejemplos de funciones y fórmulas, gráficos y automatización
de hojas de cálculo con Vba.

Catálogo de Imágenes en Excel – otra versión

sábado, mayo 02, 2009


Crear catálogos de imágenes en Excel es uno de los temas más consultados en este blog. Hace un poco
más de dos años y medio publiqué la primer nota sobre base de datos de imágenes que se convirtió en una
de las más leídas del blog.

La técnica empleada para crear el catálogo de imágenes en Excel no es trivial y a principios de este año
publique una nota aclaratoria que incluye un enlace para descargar una animación del proceso.

Además de los problemas potenciales que señalaba en la nota original, si guardamos las imágenes en el
cuaderno, tal como muestra la técnica empleada en la nota original, el archivo tiende a volverse muy
“pesado”, en especial si guardamos imágenes de alta resolución.

En esta nota mostraremos una técnica distinta, donde las imágenes están guardadas en alguna carpeta del
sistema (computador personal o red) y sólo usamos Excel para mostrarlas de acuerdo a un número de
código que se haya elegido en alguna celda.

Empezamos por guardar las imágenes en una única carpeta. Por comodidad las pondré en D:\catalogo

En el siguiente paso construimos el cuaderno Excel que tendrá dos hojas, Lista y Catalogo.
Como su nombre indica, en la primer hoja pondremos la lista de imágenes pero en lugar de guardar la
imagen en la hoja pondremos la referencia a la dirección en el sistema
Podemos ver que los valores en la primer fila no son números de código y dirección en el disco duro. La
función de estos valores será explicada más adelante.

Ahora creamos dos rangos dinámicos que encapsularemos en dos nombres

imagenes =DESREF(Lista!$A$1,0,0,CONTARA(Lista!$A:$A),1)

path_imagenes =DESREF(Lista!$A$1,0,0,CONTARA(Lista!$A:$A),2)

Estos nombres se adaptan automáticamente a la cantidad de filas en la lista usando la técnica que ya
hemos mostrado en varias oportunidades. “Imagenes” se refiere al rango de la columna A que contiene
valores; “path_imagenes“ se refiere al rango A:B con el número de filas correspondiente. Estos nombres
serán usados en la hoja “Catalogo” donde mostramos las imágenes.

En la hoja Catalogo creamos una lista desplegable usando la opción Lista de Validación de Datos

Los valores de la lista desplegable están definidos por el rango dinámico “imagenes”
Como pueden ver, el primer valor de la lista sirve como indicación al usuario qué es lo que tiene que
hacer. Los valores de la lista desplegable sirven como argumentos en para la función BUSCARV que
ponemos en la celda C3
=BUSCARV(A3,path_imagenes,2,0)
Esta fórmula da como resultado la dirección de la imagen (que pusimos en la hoja Lista).

Nuestro próximo paso es poner en la hoja un medio de mostrar la imagen correspondiente al código que
hayamos elegido. Activamos la barra de herramientas Cuadro de Controles y elegimos el control Imagen

Ponemos el control en una posición cercana a la lista desplegable y para mejorar el aspecto de la hoja
quitamos las líneas de división. La posición del control no es casual y nos sirve para ocultar la fórmula
que hemos puesto en C3.

Ahora necesitamos un método para cargar la imagen correspondiente, lo que haremos con una macro, y
un evento que haga correr la macro cuando el usuario elige un número de código.

Sub show_pic() es la macro para cargar la imagen en el control


Sub show_pic()

Dim PicAddress

PicAddress = Sheets("Catalogo").Range("C3").Value

If IsError(PicAddress) Then
Sheets("Catalogo").Image1.Picture = Nothing
Else
Sheets("Catalogo").Image1.Picture = LoadPicture(PicAddress)
End If

End Sub

Esta macro va en un módulo común del editor de VBa.


Para que la macro corra cuando se elige un número de código programamos este evento en el módulo de
la hoja Catalogo

Private Sub Worksheet_Change(ByVal Target As Range)
Dim celControl As Range

Set celControl = [A3]

If Union(Target, celControl).Address = celControl.Address Then 
show_pic

End Sub

Elegimos un número de código en la lista desplegable, lo que dispara la macro que carga la imagen
correspondiente en el control

La ventaja de esta técnica reside en que al no guardar las imágenes en un cuaderno de Excel, éste es muy
estable y nos permite usar imágenes de alta resolución.

Finalmente agregaremos dos mejoras a nuestro modelo. Tenemos que evitar que el usuario guarde el
cuaderno con una imagen cargada en el control. Esto puede suceder de dos maneras:
1 – que el usuario intente cerrar el cuaderno y Excel le pida guardarlo antes de cerrarlo (y que el usuario
decida guardarlo)

2 – que el usuario decida guardar el cuaderno por propia iniciativa.

La idea no es evitar que el usuario guarde el cuaderno, sino que al hacerlo no haya ninguna imagen
cargada en el control.
Para lograr esto programamos dos eventos en el objeto ThisWorkbook

Workbook_BeforeClose

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheets("Catalogo").Image1.Picture = Nothing
Sheets("Catalogo").Range("A3").ClearContents
End Sub

Workbook_BeforeSave

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
Cancel As Boolean)
Sheets("Catalogo").Image1.Picture = Nothing
Sheets("Catalogo").Range("A3").ClearContents
End Sub

El ejemplo se puede descargar aquí. Para que el modelo funcione hay que reemplazar los valores del
rango A2:B6 por referencias a archivos que existan en el computador o red del usuario.

Technorati Tags:

You might also like