jueves, 4 de noviembre de 2021

50 - Documento Excel con imágenes incorporadas en el libro.

En la entrada anterior insertábamos imágenes directamente a las celdas desde una carpeta auxiliar. Esta opción es muy útil si vamos a incorporar imágenes de alta calidad y así no incrementamos el peso del libro. 

Pero el inconveniente que presenta este modelo es que si deseamos enviar el libro a terceros, también tenemos que adjuntar la carpeta con las imágenes. 

En cambio, en esta entrada veremos otro modelo que nos permite insertar las imágenes en el mismo libro, asignándoles un nombre apropiado para luego relacionarlas con los registros a utilizar.

Para esto, utilicé como ejemplo un modelo de factura, una tabla de productos y una hoja con las imágenes de los productos.


Nuestra base de productos tendrá una columna de 'Códigos' que son los que se presentan en lista desplegable en col B. Y al seleccionar un código, se completará el resto de las columnas con información (detalle e importe en este ejemplo) obtenida mediante fórmulas. Para el detalle y considerando que la hoja Base tiene una tabla sería:
        SI.ERROR(BUSCARV(B11;Tabla1[[#Todo];[CODIGO]:[PRECIO]];2;FALSO);"")

Además se ejecuta una macro en el evento Change de esta hoja, que será la que ubique la imagen relacionada con ese código.

Entonces, primeramente en una hoja (a la que llamé imgProd), desde menú Insertar, Ilustraciones vamos a seleccionar cada una de nuestras imágenes de productos. Y estando seleccionada, desde la barra de nombres escribiremos el código que le corresponde.
No nos vamos a preocupar ni del tamaño ni de su propiedad de NO mantener proporción porque esto lo haremos desde la misma macro.

Una vez lista esta tarea, entraremos al Editor de macros y seleccionaremos la hoja, en este caso 'Factura'. Y allí pegaremos el siguiente código:

Private Sub Worksheet_Change(ByVal Target As Range)

'----- IMPORTANTE: ESTE CÓDIGO se utilizará con imágenes previamente insertadas en la hoja imgProd
'y se le asigna el nombre correspondiente al producto.
'Si la factura solo se utilizará para impresión (Pdf o impresora) no es necesario subirlas al
'libro y en ese caso utilizar el código colocado en hoja Img9 (2). Recordar que al enviar
'copia de la factura por mail o whatsapp las imágenes no se verán salvo que también se adjunte
'la carpeta que las contenga.
'-------------------------------------------------

'por cambio en celdas B11:B14 se busca la imagen que coincida con el valor seleccionado
If Intersect(Range("B11:B14"), Target) Is Nothing Then Exit Sub
If Target.Count > 1 Then Exit Sub

'se quita la imagen anterior
For Each sh In ActiveSheet.Shapes
    If sh.Type = 11 Or sh.Type = 13 Then
        If sh.Top = Target.Top Then sh.Delete: Exit For
    End If
Next sh
If Target.Value = "" Then Exit Sub

foto = Target.Value
Application.ScreenUpdating = False

'se controla posible error por no encontrar la imagen
On Error Resume Next
Sheets("imgProd").Select
ActiveSheet.Shapes.Range(Array(foto)).Select
    Selection.Copy
    Sheets("Factura").Select
    Range("F" & Target.Row).Select
    ActiveSheet.Paste
'estando la imagen seleccionada se ajusta su dimensión a la celda de la misma fila
Selection.ShapeRange.LockAspectRatio = msoFalse     'NO mantiene proporción
With Selection
    .Top = Target.Top
    .Left = Range("F" & Target.Row).Left + 1
    .Height = Range("F" & Target.Row).Height
    .Width = Range("F" & Target.Row).Width
End With
'pasa a fila siguiente
Target.Offset(1, 0).Select
End Sub


Ver video 50 con el paso a paso desde aquí.

Descargar libro de ejemplo desde aquí.