sábado, 22 de junio de 2024

82 - Mostrar un rango Excel en un control de Imagen de un Userform

 Siguiendo con el tema iniciado en el VIDEO Nº 81, aquí veremos como subir esa imagen creada de un rango filtrado de una hoja Excel, a un control Image de un Userform.
Nuestro libro contará con una hoja de datos (en el ejemplo corresponde a una Tabla) y un Userform.
En un módulo tendremos la subrutina que llamará a ese formulario. Puede ser asignada a un botón o ser llamada desde el menú Desarrollador/Programador.

Sub llamaUF()

Range("B4").Select

'se quita el posible autofiltro, mostrando la tabla completa.

If ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData

UserForm1.Show

End Sub

El formulario de registro, además de los controles necesarios para esa tarea, contará con un control Image (para mostrar la imagen del rango filtrado) y un control ComboBox desde donde seleccionaremos el criterio a filtrar. 

Al abrir el Userform, en el evento Initialize ejecutaremos unas instrucciones para obtener la lista de criterios sin duplicados y ordenada. En este ejemplo se trata de la columna C (segunda columna de la Tabla de datos).

Private Sub UserForm_Initialize()

'armar lista única de la col c

Call ListaValoresUnicos

'rellenar el combobox

For i = 5 To Range("M" & Rows.Count).End(xlUp).Row

    ComboBox1.AddItem Range("M" & i)

Next i

End Sub


Sub ListaValoresUnicos()     'para la hoja Lista1 con la Tabla4

'se pasa la col C a un rango auxiliar y se le quitan los duplicados

Range("Tabla4[[CALIBRE]]").Copy Destination:=[M5]

ActiveSheet.Range("$M$5:$M$" & Range("M" & Rows.Count).End(xlUp).Row).RemoveDuplicates Columns:=1, Header:=xlNo

'se ordena el rango auxiliar para presentarlo en el desplegable

ActiveWorkbook.Worksheets("Lista1").Sort.SortFields.Clear

x = Range("M" & Rows.Count).End(xlUp).Row

ActiveWorkbook.Worksheets("Lista1").Range("M5:M" & x).Sort _

    Key1:=Range("M5:M" & x), Order1:=xlAscending, Header:=xlGuess

End Sub

En el evento Click del ComboBox ejecutaremos la macro principal, la de la Creación y Exportación de la imagen. Se filtrará la hoja por el criterio seleccionado, se tomará una captura o imagen del rango obtenido y la guardará como archivo de imagen 'jpg' en una subcarpeta (en el mismo directorio que el libro activo). A continuación se establece la propiedad Picture del control Image con la ruta y nombre del archivo de imagen guardado.

Private Sub ComboBox1_Click()

If ComboBox1.Value = "" Then Exit Sub

'se filtra la col C de la hoja activa

ActiveSheet.ListObjects(1).Range.AutoFilter Field:=2, Criteria1:=ComboBox1.Text

'se exporta el rango como imagen

Call exportaImagen(ComboBox1.Text, ActiveSheet.Name)

'se indica la misma ruta y nombre de archivo que se usaron en la macro de exportación

ruta = ThisWorkbook.Path & "/IMG/"

archi = ComboBox1.Text & ".jpg"             'no se permite png

'se sube la imagen al control Image1

With Image1

    .Picture = LoadPicture(ruta & archi)

    .PictureSizeMode = fmPictureSizeModeClip           'ver * 

    .PictureAlignment = fmPictureAlignmentTopLeft

End With

End Sub


* Las propiedades de ubicación pueden ser establecidas desde el modo diseño

   


La macro exportaImagen se encuentra en la entrada del tema anterior


También se puede descargar libro desde aquí o solicitarlo a mi correo de Gmail.


Acceso al VIDEO Nº 82 desde aquí.



domingo, 9 de junio de 2024

80 - Grabar Macros en Word y en Excel.

Utilizamos la Grabadora de macros para obtener instrucciones que no recordamos o desconocemos al intentar realizar alguna tarea repetitiva. Luego mediante VBA podemos ajustar y completar ese código obtenido.

Pueden seguir el paso a paso para grabar una macro en Word, y luego asignarle un atajo de teclado, desde el VIDEO Nº 80 de mi canal... o pueden continuar la lectura aquí.

Viendo las dificultades que presenta en Word la segunda tarea, o sea asignar el atajo de teclado, lo que hacemos es grabar una segunda macro para ejecutar la primera

Y aquí utilizaremos al instrucción: Application.Run que ya hemos visto en la entrada del VIDEO Nº 75.

Entonces, primero grabaremos la macro que necesitamos ejecutar en un documento Word de manera repetitiva. En el ejemplo solo ingresamos unos títulos y le damos formato a algunas líneas de texto.

Para llamar a la grabadora podemos optar por el botón que se encuentra en la barra de estado (al pie de la ventana, al igual que en Excel) o desde el menú Vista, Macros, Grabar Macro.

En la ventana que se nos presenta ingresamos un nombre para la macro, seleccionamos dónde se ubicará (en el libro activo o en la Plantilla Normal si la vamos a utilizar en otros libros) y colocamos alguna descripción del contenido de la macro.

Al presionar el botón ‘Teclado’ se nos abrirá la siguiente ventana, donde vamos a controlar que tengamos seleccionado el proyecto o la plantilla Normal según sea nuestra decisión.

En el recuadro no escribiremos nada sino que allí presionaremos la combinación de teclas que hemos seleccionado. En mi caso: CTRL y la tecla W.

Recién entonces se nos mostrarán esas teclas en el recuadro. Presionamos ‘Asignar’ para que se vuelque en el recuadro ‘Teclas Activas’.

NOTA: si elegimos alguna tecla que es de uso de la aplicación se nos mostrará la combinación CTRL+Mayúsc+la letra. Y así tendrá que ser ejecutado este atajo.

Al aceptar ya tendremos la grabadora activada y comenzaremos a realizar todos los pasos que queremos automatizar.

Al detener la grabadora encontraremos en un módulo el código generado. A partir de allí tendremos que pulir un poco y ajustar seguramente algunas referencias.

Pero es muy posible que la macro no grabe todos los pasos…. Solo nos servirá para conocer la sintaxis de algunas instrucciones, pero nada más.

Entonces, ¿cómo podemos asignar un atajo de teclado a una macro ya guardada? Vamos a recurrir a la siguiente solución.

Ya tendremos en un módulo del Editor una macro guardada, un código completo para toda nuestra tarea. Teniendo la precaución de colocar como una primera instrucción, un mensaje de confirmación… ya veremos el porqué (*).

A continuación grabaremos una nueva macro tal como en los pasos anteriores, asignándole un atajo de teclado. Y la tarea que vamos a grabar será ejecutar esta macro (rangos_excel_word).

 (*) Y ahora, cuando se ejecute, la primera instrucción que encuentra es la de confirmación, lo que nos permite ‘Cancelar’ el proceso ‘rangos_excel_word’  y detener nuestra macro de grabación.

Entonces en un módulo encontraremos la instrucción de llamada (la única línea que nos interesa recuperar, el resto lo borramos).


Esta será la macro que ejecutaremos con atajo de teclado llamando a la del proceso principal.

Es recomendable colocar en el mismo código el atajo de teclado. 

 

Acceso al VIDEO Nº 80 desde aquí.

 

jueves, 6 de junio de 2024

81 - Guardar rangos de Excel como Imagen.

 Cuando tenemos que enviar información parcial de alguna hoja, por ejemplo filtrada por Productos, o por Clientes, generalmente guardamos la hoja filtrada y la exportamos.

Aquí vamos a crear el informe como imagen. Sin necesidad de enviar la hoja filtrada sino solamente en un archivo jpg o png.

Para esto contamos con una hoja auxiliar (opcional) y el programa creará una carpeta (si aún no la tenemos) en el mismo directorio donde se encuentra nuestro libro.

Tanto el nombre de la subcarpeta, su ubicación y la extensión del archivo de imagen son argumentos opcionales que pueden ser modificados.

En el ejemplo del libro que se encuentra para descargar, el nombre para el archivo de imagen lo ingresará el usuario mediante un InputBox. Aquí, otra opción podría ser que se tome como 'nombre' el criterio filtrado (nombre del producto o nombre del cliente para este ejemplo).

Como esta macro puede ser utilizada para 2 procesos diferentes, es que tendré 2 llamadas: copiaRango para guardar imágenes en una subcarpeta y llamaUF para enviar un rango a un control de imagen de un Userform (se tratará en el próximo video).

* Traducción y adaptación de la macro del sitio: www.thespreadsheetguru.com

Sub guardaImagen()

nbreArchivo = InputBox("Ingrese el nombre para el archivo de imagen."

If nbreArchivo = "" Then MsgBox "Se canceló el proceso.": Exit Sub

nbreHoja = ActiveSheet.Name

Call exportaImagen(nbreArchivo, nbreHoja)

End Sub


Sub exportaImagen(nombre, hoja)

Dim hoL As Worksheet

Dim hoX As Worksheet

Dim rutaIMG As String

Dim nbreArchImg As String

 

' Establecer referencias a las 2 hojas de trabajo

Set hoL = ThisWorkbook.Sheets(hoja)

Set hoX = ThisWorkbook.Sheets("Hoja1")

Application.ScreenUpdating = False

 

' Obtener la ruta de la carpeta "IMG"     'Ajustar nombre

rutaIMG = ThisWorkbook.Path & "\IMG\"

' Crear la carpeta "IMG" si no existe

If Dir(rutaIMG, vbDirectory) = "" Then

    MkDir rutaIMG  'crear la subcarpeta

End If

'ruta y nombre completo para la imagen

nbreArchImg = rutaIMG & nombre & ".png"      'JPG

 

' Limpiar la hoja auxiliar

hoX.Activate

hoX.Cells.Delete

 

' Definir el rango de la imagen filtrada en la hoja activa

x = hoL.Range("B" & Rows.Count).End(xlUp).Row

If x <= 4 Then MsgBox "No hay datos filtrados.": Exit Sub

rgo = hoL.Range("B4:I" & x).Address

hoL.Range(rgo).CopyPicture Format:=xlPicture

' Pegar la imagen en la hoja "Hoja1" en el rango A1

hoX.Range("A1").PasteSpecial


'luego del pegado el objeto queda seleccionado. Se lo guarda en una variable 

    Set miShape = Selection

'se agrega un objeto chart con las dimensiones del rango

    Set miChart = hoX.ChartObjects.Add(Left:=miShape.Left, Top:=miShape.Top, Width:=miShape.Width, Height:=miShape.Height)

'el objeto seleccionado se pega en el chart y ese objeto se exporta

    miShape.Copy

    miChart.Select

    ActiveChart.Paste

'se guarda la imagen en la subcarpeta

ActiveSheet.ChartObjects(1).Activate

ActiveChart.Export Filename:=nbreArchImg, FilterName:="png"    'JPG

 

'eliminar los objetos agregados en la hoja 1

ActiveSheet.Shapes(1).Delete

ActiveChart.ChartArea.Select

ActiveChart.Parent.Delete

Selection.Delete

 

'se quita el filtro a la lista.

With hoL

    .Select

    .Unprotect

    If .FilterMode = True Then .ShowAllData

    .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _

        , AllowFiltering:=True

    .[E4].Select

End With

MsgBox "Fin del proceso."

End Sub


Acceso al VIDEO Nº 81 desde aquí.

Descargar libro desde aquí o solicitarlo a mi correo de Gmail.