Agregar hipervínculo a una imagen desde la función

Estoy tratando de hacer una función VBA para añadir una imagen de la ruta del archivo y añadir un hipervínculo a ella.
Necesita ser llamado de una función, no puede ser un Sub.

Function AddHyperlinkedImage()
    InsertPictureHyperlink
End Function


Sub InsertPictureHyperlink()
    Dim pct As Picture, iLeft#, iTop#
    Dim sFile As String
    sFile = "C:\somepath\picture.jpg"
    If Dir(sFile) = "" Then
        Exit Sub
    End If
    With Range("A1")
        .Select
        iLeft = .Left: iTop = .Top
    End With
    Set pct = ActiveSheet.Pictures.Insert(sFile)
    pct.Left = iLeft
    pct.Top = iTop
    With Worksheets("Sheet1")
        .Hyperlinks.Add Anchor:=.Shapes(pct.Name), Address:="somexcel.xlsx"
    End With
End Sub

Añade la imagen, pero no el hipervínculo. Cuando ejecuto el sub por sí mismo, añade la imagen e hipervínculos.
Pero necesito que esté en forma de una función. No puede ser un botón o algo así. Tengo que ser capaz de llamarlo con =SomeFunction().

Pregunta hecha hace 3 años, 4 meses, 29 días - Por bytebarricade


3 Respuestas:

  • Así que en lugar de un UDF puede intentar utilizar un Worksheet_Change evento que te llamará InsertPictureHyperlink() macro. Para asegurar que la macro no se dispare cuando cambie una célula, agregue una condición a sólo enciende la macro cuando se introduce una palabra clave. Aquí la palabra clave será AddHyperlinkedImage


    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target = "AddHyperlinkedImage" Then
        Application.EnableEvents = False
        
            InsertPictureHyperlink
            
        Application.EnableEvents = True
    End If
    
    End Sub
    

    Sub InsertPictureHyperlink()
    
    MsgBox "Macro enabled - add your code in this sub"
    
    End Sub
    

    Respondida el Dec 18, 2020 a las 10:32 - por javagiant

    Votos positivos: 0 | Votos negativos: 0

  • Parece que el problema es que la función AddHyperlinkedImage está llamando a la subrutina InsertPictureHyperlink, pero necesitas asegurarte de que el hipervínculo se añada correctamente. Para ello, puedes modificar la función para que retorne la imagen con el hipervínculo agregado. Aquí te muestro cómo puedes hacerlo:

    vba
    Function AddHyperlinkedImage()
        Dim pct As Picture
        Set pct = InsertPictureHyperlink
        Set AddHyperlinkedImage = pct
    End Function
    
    Function InsertPictureHyperlink() As Picture
        Dim pct As Picture, iLeft

    , iTop#

    Dim sFile As String sFile = "C:\somepath\picture.jpg" If Dir(sFile) = "" Then Set InsertPictureHyperlink = Nothing Exit Function End If With Range("A1") .Select iLeft = .Left: iTop = .Top End With Set pct = ActiveSheet.Pictures.Insert(sFile) pct.Left = iLeft pct.Top = iTop With Worksheets("Sheet1") .Hyperlinks.Add Anchor:=.Shapes(pct.Name), Address:="somexcel.xlsx" End With Set InsertPictureHyperlink = pct End Function

    Con estas modificaciones, la función AddHyperlinkedImage ahora llama a la función InsertPictureHyperlink y devuelve la imagen con el hipervínculo añadido. Ahora podrás llamar a AddHyperlinkedImage() en una celda de Excel para insertar la imagen con el hipervínculo.

    Respondida el Dec 19, 2020 a las 10:30 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema con tu código es que la función AddHyperlinkedImage está llamando a la subrutina InsertPictureHyperlink, que no devuelve ningún valor. Para convertir la subrutina en una función, debes hacer que devuelva el objeto de imagen creado. Aquí tienes el código modificado:

    vb
    Function AddHyperlinkedImage() As Picture
        Dim pct As Picture, iLeft

    , iTop#

    Dim sFile As String sFile = "C:\somepath\picture.jpg" If Dir(sFile) = "" Then Exit Function End If With Range("A1") .Select iLeft = .Left: iTop = .Top End With Set pct = ActiveSheet.Pictures.Insert(sFile) pct.Left = iLeft pct.Top = iTop With Worksheets("Sheet1") .Hyperlinks.Add Anchor:=.Shapes(pct.Name), Address:="somexcel.xlsx" End With Set AddHyperlinkedImage = pct End Function

    Ahora puedes llamar a esta función usando =AddHyperlinkedImage() y devolverá el objeto de imagen que puedes utilizar para manipular aún más la imagen o el hipervínculo.

    Respondida el Dec 19, 2020 a las 10:43 - por Gemini

    Votos positivos: 0 | Votos negativos: 0