Guardar Cambios en un Formulario (no datos) Excel

Los expertos, mi pregunta va referida al entorno del formulario y no a los datos que contiene el mismo. Tratare de ser lo más especifico posible. Supongamos que tenemos inscrustado en el formulario un frame al cual quiero insertarle una imagen, lo hacemos mediante el comando:

ImagenUser = Application.GetOpenFilename

Frame.Picture = LoadPicture(ImagenUser).

El problema es que cuando cierro el excel grabando cambios, no guarda los cambios hechos al formulario. Si lo hago manualmente desde el formulario al guardarlo lo cambia, pero necesito que sea por código, necesito que el usuario seleccione una imagen y esta quede grabada en el archivo excel.

Espero haber sido lo más especifico posible y desde ya muchas gracias por su ayuda.

Respuesta
1

Cuando el formulario está en ejecución (at run time), solamente puedes cargar imágenes en los controles utilizando la función LoadPicture, esta función no te permite guardar la imagen en el control, solamente se visualiza la imagen durante el formulario, es decir, la imagen está en memoria, cuando el formulario se cierra, toda los datos en la memoria son destruidos.

Una opción es que cargues el la imagen y almacenes la ruta y el nombre del archivo en alguna hoja en una celda; después cargas la imagen en el frame:

Private Sub CommandButton1_Click()
'Por.Dante Amor
    imagenuser = Application.GetOpenFilename
    If imagenuser <> "" Then
        Sheets("imagen").[A5] = imagenuser
        Set Frame1.Picture = LoadPicture(Sheets("imagen").[A5])
    End If
End Sub

Como ya tenemos el nombre de la imagen, entonces puedes cargar la imagen cuando activas el formulario:

Private Sub UserForm_Activate()
'Por.Dante Amor
    If Sheets("imagen").[A5] <> "" Then
        If Dir(Sheets("imagen").[A5]) <> "" Then
            Set Frame1.Picture = LoadPicture(Sheets("imagen").[A5])
        End If
    End If
End Sub

La imagen se carga al momento de abrir el formulario, puedes cambiar la imagen durante la ejecución y cuando abras nuevamente el formulario se cargará la última imagen seleccionada, simulará que la imagen se guardó en el formulario.


Existen algunos controles o propiedades del UserForm que no puedes cambiar durante la ejecución, ya que son de sólo lectura, por ejemplo la propiedad ShowModal.


Gracias por tu respuesta, excelente como todas las que leo en este foro. Es una buena alternativa la tenia en mente, pero el problema es que si por algún motivo copian el archivo a otro equipo no se podrá ver dicha imagen. Estoy armando una aplicación para usuarios con pocos conocimientos y la idea es achicar todo lo que se pueda el margen de error. Excelente explicación, con lo cual hoy aprendí algo nuevo sobre los formularios. Muchas Gracias.

Ahora pregunto,¿habrá alguna forma de cargar la imagen en la hoja y de ahí cargarla al formulario? (Perdón por mi ignorancia pero es algo que se me ocurrió ahora)

Para cargar la imagen en la hoja "imagen"

Private Sub CommandButton1_Click()
'Por.Dante Amor
    imagenuser = Application.GetOpenFilename
    If imagenuser <> "" Then
        Sheets("imagen").[B5] = imagenuser
        Set Frame1.Picture = LoadPicture(imagenuser)
        Sheets("imagen").Select
        ActiveSheet.DrawingObjects.Delete
        Set fotografia = ActiveSheet.Pictures.Insert(imagenuser)
        '
        With fotografia
            .ShapeRange.LockAspectRatio = msoFalse
            .Name = "foto"
        End With
        Set fotografia = Nothing
    End If
End Sub

Para cargar la imagen que está en la hoja "imagen" en el control Frame

Private Sub UserForm_Activate()
'Por.Dante Amor
    ruta = ThisWorkbook.Path & "\"
    Sheets("imagen").Select
    If Sheets("imagen").[B5] <> "" Then
        ActiveSheet.Shapes.AddChart
        With ActiveSheet.DrawingObjects("foto")
            ancho = .Width
            alto = .Height
            .Copy
        End With
        '
        ActiveSheet.ChartObjects(1).Select
        With Selection
            .Height = alto
            .Width = ancho
            .Chart.Paste
            .Chart.Export ruta & "imagen_temp.jpg"
            .Delete
        End With
        Set Frame1.Picture = LoadPicture(ruta & "imagen_temp.jpg")
    End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas