Guardar ruta de una foto en un formulario

Tengo un problemilla con copiar la ruta de la foto al abrirla en un formulario.

Tenga esta private sub (esta en la misma hoja del Excel) para abrir la foto en un formulario a través de un control activex (imagen):


Dim RutaFoto As String
Private Sub Foto_Titular1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
On Error Resume Next                
RutaFoto = Application.GetOpenFilename("Imágenes jpg,*.jpg,Imágenes bmp,*.bmp", 0, "Seleccionar Foto Titular")        
Foto_Titular1.Picture = LoadPicture("")        
Foto_Titular1.Picture = LoadPicture(RutaFoto)
End Sub

Y tengo esta macro ( esta en módulos) para guardar los datos del formulario a las celdas, y lo que quiero es cuando le doy a la macro guardar (botón asignado a esta macro), que me guarde la variable "RutaFoto" en una celda, le puse un call pero me dice que no esta definida la sub. Si alguien me puede corregir lo que hecho o mejorarlo, se lo agradezco.

Sub GUARDAR()    
Dim RutaFoto As String    
Application.ScreenUpdating = False    
Range("D8").Select      
Selection.Copy    
Sheets("Base").Select    
Range("A15").Select    
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _        :=False, Transpose:=False    
Sheets("Ficha").Select    
Range("D12:E12").Select       
Application.CutCopyMode = False    
Selection.Copy    
Sheets("Base").Select    
Range("B15").Select    
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _        :=False, Transpose:=False 
'  Aqui quiero guardar la ruta de la foto en una celda    
Call Foto_Titular1_DblClick()     
Sheets("Base").Select    
Range("C15").Select    
ActiveCell.Value = RutaFoto     
End Sub

1 respuesta

Respuesta
2

Primero, no puedes "llamar" a una rutina privada ("Private") desde un módulo "Standard" y/o en general desde cualquier otra rutina que sea parte de un módulo distinto al que contiene dicha rutina privada.

Segundo, si deseas "llamar" a la rutina de un módulo de clase (los módulos de objetos, como los de las hojas, son módulos de clase) debes, primero, convertirla en pública ¿cómo? Pues le quitas el "private" y listo (es el equivalente a colocarle un "Public" delante). En tu caso debería quedar así:

Sub Image1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Luego, para "llamar" a dicha rutina debes indicar en donde se encuentra:

Call Sheets("Hoja1").Image1_Click

En donde dice "Hoja1" debes reemplazarlo por el nombre de tu hoja (también se puede usar el nombre del módulo correspondiente en lugar de "Sheets" o "WorkSheets").

Otra cosa importante, para que una variable se conserve entre una rutina y otra (cuando están en diferentes módulos), debe ser declarada como pública ("Public") fuera de la rutina (en la parte superior del módulo) de lo contrario no se conservará y no podrás obtenerla entre una rutina y otra como en tu caso. Por cierto, los objetos "Image" no conservan la ruta de la imagen, por lo que tampoco podrías obtenerla de dicho objeto, por si acaso.

Entonces ¿qué te recomiendo? Creo que lo más práctico es que apenas cargues la imagen al objeto, envíes el valor de la variable a una celda, algo así:

Private Sub Image1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim RutaFoto As String
On Error Resume Next
RutaFoto = Application.GetOpenFilename("Imágenes jpg,*.jpg,Imágenes bmp,*.bmp", 0, "Seleccionar Foto Titular")
Image1.Picture = LoadPicture(RutaFoto)
Sheets("Base").Range("C15").Value = RutaFoto
End Sub

De ese modo te ahorras el tener más de una rutina. Comentas.

Abraham Valencia

PD: Rutina = Procedimiento = Sub = Macro

¡Gracias! 

Muchas gracias por tu respuesta, ha sido de gran ayuda. Al final seguí tu recomendación.

Pues de nada y feliz año :)

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas