¿Cómo correr ActiveSheet.Shapes.AddPicture en rango variable y "bypaseando" los errores?

Espero se encuentre bien.

Por favor apóyeme con lo siguiente: tengo dos columnas A y B. En la B están los url de varias imágenes online (a partir de B2). En la A (a partir de A2) quiero correr ActiveSheet. Shapes. AddPicture con esos url para mostrar las imágenes. El rango de B es variable y en ocasiones tiene filas vacías (que no pueden eliminarse) y url que no funcionan (cuando se abren en el browser da un error en el site, no tienen imagen asociada) lo cual evita que la macro se corra para el resto de celdas de B. Como "On Error Resume Next" y "On Error GoTo 0" están incluidos, no muestra ningun error sino que la rutina continúa pero sin evaluar el resto de las url como dije antes. Los incluí buscando que pasara por encima de los errores y corriera para todas las celdas de B. He tratado varios procedimientos alternativos así como ubicar los manejadores de errores en distintas líneas del código pero sin éxito. Este código es parte de otro más extenso, lo planteo aparte en esta pregunta para simplificar. Uso excel 2007 SP2.

1) Código:

Sub AddImgEnRango()

Dim RangoImagen As Range

On Error Resume Next

ActiveSheet.Range("A2").Select

Do While ActiveCell.offset(0, 1).Value <> Empty
Set RangoImagen = ActiveCell.offset(0, 1)
ActiveSheet.Shapes.AddPicture _
Filename:=RangoImagen.Value, _
linktofile:=msoFalse, savewithdocument:=msoCTrue, _
Left:=ActiveCell.Left, Top:=ActiveCell.Top, Width:=100, Height:=100

ActiveCell.offset(1, 0).Select

On Error GoTo 0
Loop

End Sub

2) Hoja Ejemplo:

Respuesta
2

Estás recorriendo la hoja seleccionando celdas pero tu bucle se detiene al encontrar una celda vacía así que por más control de errores que coloques para esos casos, simplemente el bucle se detiene.

Yo no soy mucho de usar controles de errores del sistema, a menos que sea estrictamente necesario, pero para tu caso te dejo un ejemplo simple que a través de "On Error Resume Next", hará que se "salte" si las celdas están en blanco o si el enlace es errado:

Sub Imagenes()
Dim Celda As Range
On Error Resume Next
For Each Celda In Range("B2:B7")
    ActiveSheet.Shapes.AddPicture _
    Filename:=Celda.Offset.Value, _
    linktofile:=msoFalse, savewithdocument:=msoCTrue, _
    Left:=Celda.Offset(0, -1).Left, Top:=Celda.Offset(0, -1).Top, Width:=100, Height:=100
Next Celda
End Sub

Comentas

Abraham Valencia

PD: Si fuera mi caso, yo si encuentro una celda vacía, no inserto y paso a la siguiente celda, o compruebo el enlace y de dar error incluso antes de insertar, igual paso a otra celda, pero obviamente eso es más trabajo.

Experto Abraham, muchas gracias por su atención.

Mis comentarios:
1) El rango de B (url) es variable, ¿cuál sería el código para definirlo?

2) Por favor explíqueme la línea: Filename:=Celda.offset.Value,...

3) Lo que dice en su PD es justo lo que quiero: ante una celda vacía o url dañado (col. B), dejar en blanco la celda donde iría la imagen (col. A) y continuar corriendo la rutina. Cada celda de A quedaría con una imagen si la correspondiente celda de B está bien ("llena" con un url que funciona).

Nuevamente gracias.

1- Cuándo dices variable puede interpretarse de muchos modos ¿siempre está en la columna "B" o.. .varía? O te refieres a que la última celda es la que puede cambiar ¿o también cambia la inicial?

2- En el "For - Each" recorro un rango celda por celda, con una variabla llamada justamente "Celda", entonces yo le digo al "Shapes.Add" que el nombre/ruta del archivo/página, en este caso imágenes, está en el valor-Value (contenido) de la celda que esta una posición a la derecha pero en la misma fila (offset 0,1) de la "celda" (variable) que está en ese momento recorriendo.

3- Con el "On Error Resume Next" hará eso, solo que yo, repito, prefiero no usar controles de error del sistema.

Abraham Valencia

Hola,

1. Me refiero a que la última celda de B varía.

2. Disculpe pero sigo sin comprender porque veo que el offset de la línea Filename:=Celda.offset.Value, está sin referencias (f,c), siendo distinto al offset(0,1) que menciona en su aclaratoria. También me confunde hacer el offset dado que establece el rango en B donde ya están los url, ¿por qué hacer el offset si ya está en el rango debido?. ¿Será que "offset sin f,c" = offset(0,0)?. Si lo anterior es cierto, ¿entonces las imágenes las ubica en la columna A con estas líneas Left:=Celda.offset(0, -1).Left, Top:=Celda.offset(0, -1)?

3. Ok, entendido.

¡Muchísimas gracias!

Je je je, te cuento, como he comentado en algunas ocasiones cuando son códigos para ayudar, cortos y que toman poco tiempo, los hago directamente aquí, sin probar y a veces ocurre eso de que falta alguna instrucción o hay una de más.

Prueba así:

Sub Imagenes()
Dim Celda As Range
Dim UltimaFila As Long
Let UltimaFila = Cells(Rows.Count, 2).End(xlUp).Row
On Error Resume Next
For Each Celda In Range("B2:B" & UltimaFila)
    ActiveSheet.Shapes.AddPicture _
    Filename:=Celda.Value, _
    linktofile:=msoFalse, savewithdocument:=msoCTrue, _
    Left:=Celda.Offset(0, -1).Left, Top:=Celda.Offset(0, -1).Top, Width:=100, Height:=100
Next Celda
End Sub

Y sí, los "offset" ubican la imagen en la columna "A".

Abraham Valencia

Ah, no olvides que tu columna "A" debe tener como mínimo 100 de ancho y tus filas al menos 100 de alto.

Salu2

Abraham Valencia

Experto Abraham, excelente su respuesta y mucho mejor su atención, funcionó perfecto. Respuesta valorada como excelente. Doy por terminada la consulta. Muchas gracias.

Pues de nada. Un abrazo.

Abraham Valencia

PD: Basta decirme "Abraham" :)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas