Duda con fotos en excel.

Hola.
Tengo este código y funciona perfectamente, mi pregunta es esta, com puedo hacer lo mismo, ¿con otra celda en la misma hoja? Pongo el nombre de la imagen en la celda B11 y quiero que la coloque en el rango ("D13:G17"). Gracias por tu ayuda, es muy importante para mí, soy a aprendiz.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Foto As Object, Arriba As Double, Izquierda As Double, Ancho As Double, Alto As Double
Dim ruta As String
Application.ScreenUpdating = False
On Error Resume Next
If Not Target = [B1] Then Exit Sub
Me.Shapes("Foto").Delete
Dim carpeta As String
carpeta = "P:\Production\Internal Use\Proyecto\PX80\FOTOS"
ruta = carpeta & "\" & [B1] & ".jpg"
Set Foto = Me.Pictures.Insert(ruta)
With Range("D3:G7")
Arriba = .Top
Izquierda = .Left
Ancho = .Offset(0, .Columns.Count).Left - .Left
Alto = .Offset(.Rows.Count, 0).Top - .Top
End With
With Foto
.Name = "Foto"
.Top = Arriba
.Left = Izquierda
.Width = Ancho
.Height = Alto
End With
Set Foto = Nothing
Application.ScreenUpdating = True
End Sub
Respuesta
1
Simplemente copia el código en tu hoja, señalé algunos datos que debes reemplazar:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Foto As Object, Arriba As Double, Izquierda As Double, Ancho As Double, Alto As Double
Dim ruta As String
Application.ScreenUpdating = False
On Error Resume Next
If Not Target = [B1] Then Exit Sub  'Reemplaza B1 por B11
Me.Shapes("Foto").Delete
Dim carpeta As String
carpeta = "P:\Production\Internal Use\Proyecto\PX80\FOTOS"
ruta = carpeta & "\" & [B1] & ".jpg" 'Aquí también
Set Foto = Me.Pictures.Insert(ruta)
With Range("D3:G7")  'Reemplaza B3:G7 por D13:G17
Arriba = .Top
Izquierda = .Left
Ancho = .Offset(0, .Columns.Count).Left - .Left
Alto = .Offset(.Rows.Count, 0).Top - .Top
End With
With Foto
.Name = "Foto"
.Top = Arriba
.Left = Izquierda
.Width = Ancho
.Height = Alto
End With
Set Foto = Nothing
Application.ScreenUpdating = True
End Sub
Gracias por tu respuesta, al momento de correr el evento me marca lo siguiente:
Compile error
ambigous name detected: worksheet_change
Espero me puedas ayudar.
El código lo estás pegando en un Módulo o sobre el Worksheet.
El procedimiento sería que hagas clic derecho sobre la pestaña del nombre de la hoja donde se ejecutará el evento y selecciones Ver Código. Y allí pegas el código arriba.
Lo estoy pegando sobre el worksheet.
Gracias por tu tiempo.
Cómo lo estás compilando.
¿Este error dices te sale en Excel? Por lo que dices parece un mensaje de error de Visual Basic.

1 respuesta más de otro experto

Respuesta
1
Te explico un poco lo que hace tu rutina para que notes dónde debes ajustarla:
1 -   If not Target = [B1] then exit sub
Estás diciendo que si lo ingresado no coincide con el contenido de B1, finalice. Cambiala por esta otra, que controla lo que ingreses en B1 y B11 8dejá solo la que necesites:
If Target.address(false, false) <> "B1" and target.address(false, false) <> "B11" then exit sub
2-  ruta = carpeta & ..... estás armando el nbre de la imagen con el contenido de B1. Para que te sirva para cualquier celda que estés evaluando, hacé mención al target.
ruta = carpeta & "\" & target.value & ".jpg"
3- El rango dependerá de cuál es la dirección del target, es decir de la celda activa que en tu caso será B1 o B11. Aquí ya necesitarás evaluar con un If, a continuación de
Set Foto ........' tu instrucción
if target.address(false, false) = "B1" then
miRgo = "D3:G7"
elseif target.address(false, false) = "B11" then
miRgo = "D13:G17"
elseif 'otras opciones si las tuvieras
end if
With Range(miRgo)    'a partir de aquí sigue tu rutina
Mil disculpas, creo que esto de la programación no es lo mío, la verdad es que no le entiendo mucho que digamos, tal vez me falte lógica, pero ya le modifique algunas cosas y no función a bien, haber si me ayuda a descubrir mi error, lo que hace es que pone la foto del nombre de la celda b11, pero no la de la b1. esta es la rutina, según yo:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Foto As Object, Arriba As Double, Izquierda As Double, Ancho As Double, Alto As Double
Dim ruta As String
Application.ScreenUpdating = False
On Error Resume Next
If Target.Address(False, False) <> "B1" And Target.Address(False, False) <> "B11" Then Exit Sub
Me.Shapes("Foto").Delete
Dim carpeta As String
carpeta = "P:\Production\Internal Use\PDP Produccion\Santiago_org"
ruta = carpeta & "\" & Target.Value & ".jpg"
Set Foto = Me.Pictures.Insert(ruta)
If Target.Address(False, False) = "B1" Then
miRgo = "D3:G7"
ElseIf Target.Address(False, False) = "B11" Then
miRgo = "D13:G17"
'elseif 'otras opciones si las tuvieras
End If
With Range(miRgo)
Arriba = .Top
Izquierda = .Left
Ancho = .Offset(0, .Columns.Count).Left - .Left
Alto = .Offset(.Rows.Count, 0).Top - .Top
End With
With Foto
.Name = "Foto"
.Top = Arriba
.Left = Izquierda
.Width = Ancho
.Height = Alto
End With
Set Foto = Nothing
Application.ScreenUpdating = True
End Sub
Gracias por su tiempo.
Lo hiciste muy bien. Pero como a todas las imágenes que agregás le llamás 'Foto' y tenés una línea que primero borra la imagen anterior para colocar esta nueva, es que no conservas la de la otra celda.
Me.Shapes("Foto").Delete
Entonces te sugiero esta nueva rutina. Solo elimina la de la celda donde vas a ingresar una nueva. Si tenés + de 2 celdas seguí completando los If .
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Foto As Object, Arriba As Double, Izquierda As Double, Ancho As Double, Alto As Double
Dim ruta As String
Application.ScreenUpdating = False
On Error Resume Next
If Target.Address(False, False) <> "B1" And Target.Address(False, False) <> "B11" Then Exit Sub
'Me.Shapes("Foto").Delete
Dim carpeta As String
carpeta = "P:\Production\Internal Use\PDP Produccion\Santiago_org\"
ruta = carpeta & Target.Value & ".jpg"
Set Foto = Me.Pictures.Insert(ruta)
If Target.Address(False, False) = "B1" Then
miRgo = "D3:G7"
Me.Shapes("Foto01").Delete
ElseIf Target.Address(False, False) = "B11" Then
miRgo = "D13:G17"
Me.Shapes("Foto02").Delete
End If
With Range(miRgo)
Arriba = .Top
Izquierda = .Left
Ancho = .Offset(0, .Columns.Count).Left - .Left
Alto = .Offset(.Rows.Count, 0).Top - .Top
End With
With Foto
If Target.Address(False, False) = "B1" Then
.Name = "Foto01"
ElseIf Target.Address(False, False) = "B11" Then
.Name = "Foto02"
End If
.Top = Arriba
.Left = Izquierda
.Width = Ancho
.Height = Alto
End With
Set Foto = Nothing
Application.ScreenUpdating = True
End Sub
Modifiqué la forma de llamar a las variables carpeta y ruta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas