viernes, 24 de abril de 2020

Abrir documentos vinculados desde Excel

En la entrada anterior (Hipervínculos-vínculos) vimos cómo guardar hipervínculos a sitios web, desde un control de Userform, y así poder llamarlos haciendo clic en la celda que contendrá ese enlace.
También vimos cómo vincular archivos de imagen a registros de una base de cualquier índole. Esta opción nos permite luego insertar esas imágenes en otros procesos Excel.
En esos casos utilizamos las instrucciones Hyperlink.Add y GetOpenFilename respectivamente.

Ahora vamos a ver cómo guardar nombre y dirección de documentos asociados a registros de una base. Utilizaremos nuevamente estas 2 instrucciones anteriores.
Además veremos otra macro para abrir esos archivos vinculados con un simple atajo de teclado. La instrucción utilizada será: FollowHyperlink.

Para ello partimos de una hoja base donde tendremos códigos e información de documentos y una columna para guardar el nombre del mismo (en pdf, doc o cualquier otro formato). Además guardaremos la ubicación de esos archivos en otra columna o en una celda auxiliar.

Utilizaré un Userform con controles para rellenar las columnas de datos, un botón para BUSCAR el archivo asociado y 2 botones de guardado, ya sea que guardemos la ubicación como hipervínculo (se llamará desde el mismo enlace) o la guardaremos separando nombre del archivo y su ruta. Luego tendremos una macro para llamar y abrir el documento elegido.
La macro del botón BUSCAR será la siguiente:
Private Sub CommandButton11_Click()    'BUSCAR
miDoc = Application.GetOpenFilename(Title:="Selecciona tu archivo")
'si la variable está vacía significa que cancelamos la ventana de diálogo
If miDoc = False Then
    TextBox2 = ""
Else
    TextBox2 = miDoc
End If
End Sub

Para GUARDAR los registros tendremos 2 opciones: como hipervínculo o como nombre+ubicación del archivo.
Private Sub CommandButton1_Click()   'GUARDAR con hipervínculo
With Sheets("Hoja3")
    x = .Range("A" & Rows.Count).End(xlUp).Row + 1
    .Range("A" & x) = Application.WorksheetFunction.Max(.Range("A:A")) + 1
    .Range("B" & x) = TextBox1
    .Range("C" & x) = ComboBox2
    .Range("D" & x) = ComboBox1
    .Range("E" & x) = TextBox2
    'hipervínculo en celda col E
    If TextBox2 <> "" Then _
        .Hyperlinks.Add Anchor:=.Range("E" & x), Address:=.Range("E" & x).Value, _
            ScreenTip:="ver doc", TextToDisplay:=.Range("E" & x).Value
End With
'limpia controles para un nuevo registro
ComboBox1.ListIndex = -1: ComboBox2.ListIndex = -1
TextBox1 = "": TextBox2 = ""
TextBox1.SetFocus
End Sub

Private Sub CommandButton2_Click()   'guardar solo nbre archivo
    With Sheets("Hoja3")
    x = .Range("A" & Rows.Count).End(xlUp).Row + 1
    .Range("A" & x) = Application.WorksheetFunction.Max(.Range("A:A")) + 1
    .Range("B" & x) = TextBox1
    .Range("C" & x) = ComboBox2
    .Range("D" & x) = ComboBox1
    'guardar nbre de archivo
    .Range("E" & x) = Dir(TextBox2)     'solo nombre del archivo
    'obtener la ruta
    '.Range("F" & x) = Left(TextBox2, InStr(1, TextBox2, Dir(TextBox2)) - 1)
End With
'limpia controles para un nuevo registro
ComboBox1.ListIndex = -1: ComboBox2.ListIndex = -1
TextBox1 = "": TextBox2 = ""
TextBox1.SetFocus
End Sub
En caso de haber guardado la ubicación del archivo relacionado como hipervínculo no necesitaremos ninguna macro para abrir ese documento. Con hacer clic sobre la celda de la col E será suficiente.
En cambio si guardamos el nombre+ubicación podemos llamarlos desde la siguiente macro. Para mayor comodidad le asignamos un atajo de teclado.
La macro se ubica en un módulo y se ejecutará estando seleccionada alguna celda de la col B y que no esté vacía.

Sub abriendoArchivo()
'ATAJO DE TECLADO: CTRL f
'solo se ejecuta con celda seleccionada en col B
If ActiveCell.Column <> 2 Or ActiveCell = "" Then Exit Sub
'asignamos la ruta o carpeta donde se encuentran los PDF.
'Optar por una de las 3 instrucciones
'ruta = ThisWorkbook.Path & "\ESCANEADOS\"   'en subcarpeta del libro activo
ruta = [F1]                                                                   'en celda auxiliar F1
'ruta = ActiveCell.Offset(0, 4)                                    'en col F del registro
On Error Resume Next
ActiveWorkbook.FollowHyperlink ruta & ActiveCell.Offset(0, 3)
End Sub

'otra opción podría ser evaluar si col F está vacía y en ese caso tomar la ruta indicada en F1.
'If ActiveCell.Offset(0, 4) = "" Then
    'ruta = [F1]
'Else
   ' ruta = ActiveCell.Offset(0, 4)
'End If

Descargar libro de ejemplos desde aquí
Ver VIDEO 34.

jueves, 16 de abril de 2020

Hipervínculos - Vínculos

En esta entrada veremos cómo dejar hipervínculos para acceder a sitios web. También aprenderemos a vincular nuestros datos en Excel con otros archivos (imágenes, pdf, etc) para ser llamados desde otros procesos.

CASO 1:
Desde una hoja Excel, llenaremos una tabla de temas que vincularemos a sitios web.

Se trabajará con un formulario o Userform, donde pegaremos la dirección del sitio en un control TextBox. Luego al guardar el contenido de los controles en la hoja, en la col E además le insertaremos el hipervínculo con el siguiente código.

La instrucción será: nombre_de_hoja.HYPERLINKS.ADD

Private Sub CommandButton1_Click()   'GUARDAR
With Sheets("UF-Sitios")
    x = .Range("A" & Rows.Count).End(xlUp).Row + 1
    .Range("A" & x) = Application.WorksheetFunction.Max(.Range("A:A")) + 1
    .Range("B" & x) = ComboBox1
    .Range("C" & x) = ComboBox2
    .Range("D" & x) = TextBox1
    .Range("E" & x) = TextBox2
    'hipervínculo en celda col E
    .Hyperlinks.Add Anchor:=.Range("E" & x), Address:=.Range("E" & x).Value, _
        TextToDisplay:="ver sitio"
End With
'limpia controles para un nuevo registro
ComboBox1.ListIndex = -1: ComboBox2.ListIndex = -1
TextBox1 = "": TextBox2 = ""
ComboBox1.SetFocus
End Sub

CASO 2:
En una hoja Excel tendremos una tabla de productos, con todos sus datos en diferentes columnas añadiendo una columna para el nombre de la imagen asociada y otra para la ruta de esa imagen vinculada.
Esta opción será de utilidad para crear catálogos, recetarios y todos aquellos informes donde además de datos debiera mostrarse una imagen relacionada.
En el formulario tendremos 2 controles para la imagen: un TextBox para guardar la ruta completa y un control IMAGE donde mostrar la imagen.

El botón BUSCAR nos permitirá navegar por el equipo para encontrar la imagen a vincular. Se puede filtrar la búsqueda indicando algunas extensiones como jpg o bmp.
Nota: no será posible presentar un archivo 'png' en un control Image.

Para la búsqueda utilizaremos el método GETOPENFILENAME.
Para separar solo el nombre del archivo la instrucción DIR.
Para obtener solo la ruta se extrae del texto completo solo la parte hasta el inicio del nombre del archivo con las funciones: LEFT INSTR

El código completo del botón BUSCAR es el siguiente:
Private Sub CommandButton11_Click()
mifoto = Application.GetOpenFilename("Formato(*.jpg; *.bmp),*.jpg; *.bmp", Title:="Selecciona tu imagen")
'si la variable está vacía significa que cancelamos la ventana de diálogo
If mifoto = False Then
    TextBox25 = ""
Else
    Image1.Picture = LoadPicture(mifoto)
    nbreFoto = Dir(mifoto)     'nbre de la foto
    rutax = Left(mifoto, InStr(1, mifoto, nbreFoto) - 1)
    TextBox25 = rutax
End If
End Sub

Al GUARDAR, además del contenido de los controles se guardará el nombre del archivo guardado en la variable (nbreFoto) que se declara al inicio del Userform para que pueda ser utilizada en las 2 subrutinas
Esto se logra con la instrucción:  Dim nbreFoto As String  


Dim hoi                    'nbre de la hoja declarada en el evento Initialize
Dim nbreFoto As String     'nbre de la foto

Private Sub CommandButton1_Click()   'GUARDAR
'completo col datos fijos
ini = hoi.Range("A2").End(xlDown).Row + 1
hoi.Range("A" & ini) = ComboBox1
hoi.Range("B" & ini) = TextBox1

'guarda nbre y ruta de la imagen
hoi.Range("E" & ini) = nbreFoto
hoi.Range("F" & ini) = TextBox25

'limpia el UF para un nuevo ingreso
ComboBox1.ListIndex = -1
TextBox1 = "": TextBox25 = ""
Image1.Picture = LoadPicture("")
ComboBox1.SetFocus
End Sub

El guardar imágenes asociadas a una base de productos nos permitirá armar luego un catálogo, con otro proceso que las ubicará y dimensionará en las celdas correspondientes. Por ejemplo:


Descargar el libro con formularios completos desde aquí.

Ver VIDEOS 32  y  33.